【C/C++】内存相关

内存相关

1 ptmalloc

ptmalloc是GNU C Library(glibc)中的默认内存分配器,广泛用于Linux系统。以下是对ptmalloc的详细解析:

一、概述

  • 起源:ptmalloc起源于Doug Lea的malloc实现,并由Wolfram Gloger进行改进,以支持多线程。
  • 目标:ptmalloc的主要目标是为多线程应用程序提供高效的内存分配和释放。
  • 名称含义:“pt”代表“pthreads”,指的是POSIX线程库,表明其支持多线程的特性。

二、特点

  1. 多线程支持:ptmalloc通过为每个线程提供本地缓存(称为线程缓存或tcache)来减少线程之间的竞争,提高内存分配的速度。
  2. 内存分割:将内存分为小块(small bins)和大块(large bins),以便更有效地管理不同大小的内存请求。
  3. 动态分配区:ptmalloc引入了动态分配区(dynamic arena)的概念,与主分配区(main arena)一起通过环形链表进行管理。每个分配区利用互斥锁实现线程对该分配区的访问互斥。
  4. 内存管理策略:预先向操作系统申请并持有一块内存供用户malloc,同时管理已使用和空闲的内存。用户执行free时,会将回收的内存管理起来,并通过策略决定是否交还给操作系统。

三、数据结构

ptmalloc中主要的数据结构包括:

  • malloc_state(Arena header):描述了一个分配区的状态,包括bins、top chunk、last remainder chunk等信息。
  • heap_info(Heap Header):每个堆都有自己的堆Header,用于管理堆的信息。
  • malloc_chunk:是内存块(chunk)的基本组织单元,用于描述每个内存块的状态和大小。每个chunk都有自己的header,包括prev_size(前一个chunk的大小,如果前一个chunk是空闲的)、size(当前chunk的大小,包括开销)、以及用于链表管理的指针(fd、bk等)。

四、内存分配与释放

  1. 内存分配

    • 线程首先尝试从自己的线程缓存中满足内存请求。
    • 如果线程缓存无法满足,则尝试从全局的bins中查找合适的内存块。
    • 如果bins中也找不到合适的内存块,则考虑从top chunk中分配或扩展top chunk。
    • 对于大块内存请求,可能会直接使用mmap()从操作系统申请内存。
  2. 内存释放

    • 释放的内存块首先被加入到unsorted bin中。
    • 根据内存块的大小,可能会被合并到small bins、large bins或fast bins中。
    • 如果内存块足够大或空闲时间过长,可能会被交还给操作系统。

五、优缺点

  • 优点

    • 成熟稳定,与GNU C库紧密集成。
    • 支持多线程,通过线程缓存减少锁竞争。
    • 通过bins和top chunk等机制提高内存分配和释放的效率。
  • 缺点

    • 在高并发场景下,仍然可能存在锁竞争问题。
    • 与其他先进的内存分配器(如tcmalloc、jemalloc)相比,性能可能不是最优的。

六、总结

ptmalloc作为glibc中的默认内存分配器,在Linux系统中扮演着重要角色。它通过一系列机制来提高内存分配和释放的效率,并支持多线程应用程序。然而,随着技术的发展和应用场景的变化,ptmalloc也需要不断优化和改进以适应新的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TG机器人搭建与部署全攻略:源码搭建技巧与实战教学

TG机器人因其高度的可定制性和广泛的应用场景,成为了开发者和创业者的热门选择。本文将提供一份全面的TG机器人搭建与部署攻略,涵盖源码搭建技巧与实战教学,帮助读者快速掌握TG机器人的开发与上线。 关键词 TG机器人,搭建&#…

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时,从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后,next[1]都无脑写…

Classifier-Free Guidance (CFG) Scale in Stable Diffusion

1.Classifier-Free Guidance Scale in Stable Diffusion 笔记来源: 1.How does Stable Diffusion work? 2.Classifier-Free Diffusion Guidance 3.Guide to Stable Diffusion CFG scale (guidance scale) parameter 1.1 Classifier Guidance Scale 分类器引导是…

达梦数据库的系统视图v$dict_cache_item

达梦数据库的系统视图v$dict_cache_item 在达梦数据库(DM Database)中,V$DICT_CACHE_ITEM 是一个系统视图,用于显示字典缓存(Dictionary Cache)中的项信息。字典缓存是数据库中的一个重要组件,…

RepLKNet(CVPR 2022, MEGVII)

paper:Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs official implementation:https://github.com/DingXiaoH/RepLKNet-pytorch 背景 卷积神经网络(CNN)曾经是现代计算机视觉系统中的常见选择。…

Golang | Leetcode Golang题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; func isPowerOfTwo(n int) bool {const big 1 << 30return n > 0 && big%n 0 }

CentOS 7 中出现 cannot open Packages database in /var/lib/rpm 错误

转载自:https://www.jianshu.com/p/423306f43e72 # 进入 rpmdb 所在目录 [roothostbase ~]# cd /var/lib/rpm [roothostbase rpm]# ls Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Ins…

在 vite+vue3+electron 中使用 express

文章目录 一、Vite Vue3 Electron 项目的搭建二、搭建 express 环境1、安装 express 框架所需依赖2、创建 express 项目3、配置路由4、启动 express 服务5、启动 electron 并获取数据 三、项目打包 一、Vite Vue3 Electron 项目的搭建 详细的项目构建和打包可参考另一篇文…

hung 之 softlockup hardlockup 检测

1. softlockup & hardlockup 的含义 softlockup 指的是这样一种场景&#xff1a;由于内核程序设计问题&#xff0c;导致CPU长时间关闭抢占。 hardlockup 指的是这样一种场景&#xff1a;由于内核程序设计问题&#xff0c;导致CPU时钟中断长时间禁用。 softlockup 或 har…

【UE5.1】NPC人工智能——02 NPC移动到指定位置

效果 步骤 1. 新建一个蓝图&#xff0c;父类选择“AI控制器” 这里命名为“BP_NPC_AIController”&#xff0c;表示专门用于控制NPC的AI控制器 2. 找到我们之前创建的所有NPC的父类“BP_NPC” 打开“BP_NPC”&#xff0c;在类默认值中&#xff0c;将“AI控制器类”一项设置为“…

【Diffusion学习】【生成式AI】淺談圖像生成模型 Diffusion Model 原理

文章目录 Diffusion Model 是如何运作的&#xff1f;吃额外的1个数字&#xff1a;stepDenoise 模组内部实际做的事情&#xff1a;预测noise如何训练 Noise Predictor Text-to-ImageDDPM 算法 from&#xff1a; https://www.youtube.com/watch?vazBugJzmz-o&listPLJV_el3uV…

Go 协程通道使用注意

目录 关闭channel 引入 不关闭通道是有风险的&#xff0c;主要存在两条&#xff1a; 如何优雅的关闭&#xff1f; 1.只有一个发送者 2.多个发送者 判断通道是否关闭 有缓存和无缓存的通道有什么区别&#xff1f; 错误的关闭通道 关闭channel close(chan)&#xff1a;关…

[HCTF 2018]WarmUp1

进入靶场&#xff0c;检查代码看到有source.php,访问 /source.php 读代码&#xff0c;在参数中传入 file&#xff0c;通过checkFile后&#xff0c;会加载file界面。 再看checkFile&#xff0c; 第一个判断&#xff0c;是非空并且是个字符串&#xff0c;否则返回false 第二个判…

LeetCode题练习与总结:最大间距--164

一、题目描述 给定一个无序的数组 nums&#xff0c;返回 数组在排序之后&#xff0c;相邻元素之间最大的差值 。如果数组元素个数小于 2&#xff0c;则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 示例 1: 输入: nums [3,6,9,1] 输出: 3 …

微软研发致胜策略 01:尊定基础

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1994 年发布。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Debugging the Development Process》&#xff0c;这本书详细阐述了软件开发过程中的常见问题及其解决方案&a…

Docker安装Zookeeper、RocketMQ

安装Zookeeper 拉取镜像 docker pull zookeeper:3.9.2启动容器 -d后台启动&#xff0c;-p映射容器2181端口到宿主机2181端口&#xff0c;限制容器最大内存占用为128m&#xff0c;–restart容器自动重启 docker run -d -p 2181:2181 -m 128m --restartalways --name zookeepe…

特征映射(机器学习)

有时数据的分类并不像我们想象的那么简单&#xff0c;需要高次曲线才能分类。 就像下面的数据&#xff1a; 数据集最后给出&#xff1a; 我们这样看&#xff0c;至少需要达到2次以及以上的曲线才可以进行比较准确的分类。 比如如果已知数据有3列(两列特征) x1x2y-1-110.50.…

Axolotl

文章目录 一、关于 Axolotl特点Axolotl支持 二、快速入门⚡用法 三、环境设置1、Docker2、Conda/Pip venv3、Cloud GPU4、Bare Metal Cloud GPULambdaLabsGCP 5、Windows6、Mac7、Google Colab8、通过SkyPilot在公共云上启动9、通过 dstack 在公共云上启动 四、其他高级设置1、…

网站成长时间轴页面,网站发展记录页源码

一、源码描述 这是一款网站时间轴HTML源码&#xff0c;样式设计精美并且使用简单&#xff0c;主要用于记录你的网站发展历程&#xff0c;或者可以用于发布心情动态等&#xff0c;左侧年份可以折叠起来&#xff0c;页面底部是导航区域&#xff0c;可以自定义文本和链接。 二、…

Azure Repos 仓库管理

从远端仓库克隆到本地 前提:本地要安装git,并且登录了账户 1.在要放这个远程仓库的路径下,打git 然后 git clone https://.. 如果要登录验证,那就验证下 克隆完后,cd 到克隆的路径, 可以用 git branch -a //查看分支名 git status //查看代码状态 删除…