系统相关
首页 > 系统相关> > Linux c 开发 - 内存管理器ptmalloc

Linux c 开发 - 内存管理器ptmalloc

作者:互联网

 转自:https://blog.csdn.net/initphp/article/details/50833036

目录

一、内存布局

二、ptmalloc内存管理器

1. 设计假设

2. 主分配区和非主分配区

3. chunk 内存块的基本组织单元

4. 内存分配malloc流程

5. 内存释放free流程

6. mallopt 参数调优

7. 使用注意事项


一、内存布局


了解ptmalloc内存管理器,就必须得先了解操作系统的内存布局方式。通过下面这个图,我很很清晰的可以看到堆、栈等的内存分布。

X86平台LINUX进程内存布局:

上图就是linux操作系统的内存布局。内存从低到高分别展示了操作系统各个模块的内存分布。

二、ptmalloc内存管理器


ptmalloc是glibc默认的内存管理器。我们常用的malloc和free就是由ptmalloc内存管理器提供的基础内存分配函数。ptmalloc有点像我们自己写的内存池,当我们通过malloc或者free函数来申请和释放内存的时候,ptmalloc会将这些内存管理起来,并且通过一些策略来判断是否需要回收给操作系统。这样做的最大好处就是:让用户申请内存和释放内存的时候更加高效。

为了内存分配函数malloc的高效性,ptmalloc会预先向操作系统申请一块内存供用户使用,并且ptmalloc会将已经使用的和空闲的内存管理起来;当用户需要销毁内存free的时候,ptmalloc又会将回收的内存管理起来,根据实际情况是否回收给操作系统

1. 设计假设


ptmalloc在设计时折中了高效率,高空间利用率,高可用性等设计目标。所以有了下面一些设计上的假设条件:

 

2. 主分配区和非主分配区


ptmalloc的内存分配器中,为了解决多线程锁争夺问题,分为主分配区main_area和非主分配区no_main_area。

 

3. chunk 内存块的基本组织单元


ptmalloc通过chunk的数据结构来组织每个内存单元。当我们使用malloc分配得到一块内存的时候,这块内存就会通过chunk的形式被记录到glibc上并且管理起来。你可以把它想象成自己写内存池的时候的一个内存数据结构。

chunk的结构可以分为使用中的chunk和空闲的chunk

使用中的chunk和空闲的chunk数据结构基本项同,但是会有一些设计上的小技巧,巧妙的节省了内存。

使用中的chunk:

空闲的chunk

空闲链表bins

当用户使用free函数释放掉的内存,ptmalloc并不会马上交还给操作系统(这边很多时候我们明明执行了free函数,但是进程内存并没有回收就是这个原因),而是被ptmalloc本身的空闲链表bins管理起来了,这样当下次进程需要malloc一块内存的时候,ptmalloc就会从空闲的bins上寻找一块合适大小的内存块分配给用户使用。这样的好处可以避免频繁的系统调用,降低内存分配的开销。

ptmalloc一共维护了128bin。每个bins都维护了大小相近的双向链表的chunk。

通过上图这个bins的列表就能看出,当用户调用malloc的时候,能很快找到用户需要分配的内存大小是否在维护的bin上,如果在某一个bin上,就可以通过双向链表去查找合适的chunk内存块给用户使用。

4. 内存分配malloc流程


5. 内存释放free流程


6. mallopt 参数调优


7. 使用注意事项


为了避免Glibc内存暴增,需要注意:

 

参考整理:http://www.valleytalk.org/wp-content/uploads/2015/02/glibc%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86ptmalloc%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%901.pdf

 

 

 

标签:ptmalloc,空闲,管理器,chunk,内存,Linux,分配,bins
来源: https://www.cnblogs.com/peifx/p/16276832.html