- 博客(7)
- 资源 (1)
- 收藏
- 关注
原创 dlmalloc 2.8.6 源码详解(7)
释放的主要过程就是根据用户传入的payload, 找到chunk指针, 然后分别检查前一个和后一个chunk是否可以合并. 这里唯一需要注意的就是与dv和top这些特殊chunk的交互.基本流程如下,1. 通过用户传入的mem指针计算出chunk指针p. 如果FOOTERS打开, 则通过magic计算出其所属的mspace指针, 并进行校验. 2. 若p是通过direct mmap生成的, 则还原其头尾的fake chunk后直接munmap释放并结束. 详细内容请参考3.4.2小节的说明.
2014-11-20 15:35:58 2303 1
原创 dlmalloc 2.8.6 源码详解(6)
基本上sys_alloc分为四个步骤,1. 首先检查请求大小nb是否超出mmap_threshold的阈值. 如果是, 则放弃由分配器管理, 直接在mmap区开辟, 原因前面说过, 不再赘述.2. 根据mspace设定及当前top space的使用情况, 向系统申请一块适当的内存. Dlmalloc按照下面的顺序由主到次开辟,第一, 如果允许MORECORE, 则优先通过MORECORE开辟连续内存空间.
2014-11-17 10:40:13 2344
原创 dlmalloc 2.8.6 源码详解(5)
本章节介绍dlmalloc的分配算法和实现. 由于存在多mspace的情况, dlmalloc使用了两套API. 一套对应默认的mspace, 以dl前缀开头, 如dlmalloc, dlrealloc等. 如果创建了自定义的mspace, 则使用mspace开头的API, 如mspace_malloc, mspace_realloc等. 但两套API在基础算法上是一致的. 我们就以默认的API为主要对象介绍.
2014-11-14 10:48:14 3368 3
原创 dlmalloc 2.8.6 源码详解(4)
在dlmalloc的内部结构中,除了基础的chunk外,还存在一种粒度更粗的结构,称为区段(segment).之所以需要额外引入这种数据结构是为了提升对非连续内存的管理能力. dlmalloc将连续内存划分到一个segment中管理,而段与段之间则是不连续的,所有的段都由一个mspace统一去管理.如果用户程序创建了多个mspace,这些mspace内部包含的segment有可能在地址上连续,但实际归属于不同的空间.
2014-11-13 09:54:07 3620
原创 dlmalloc 2.8.6 源码详解(3)
前面介绍过, dlmalloc将小于256字节的内存划分为small chunk, 256字节以上的划分为tree chunk.对这两种chunk的管理也采用不同方式. small chunk使用small bins管理,采用更精确的标记方法,而tree chunk用tree bins管理,较之使用相对粗放的管理方式.这种划分方法基于这样一种经验性的认知,即小块内存总是连续而频繁的分配,因此需要更加精确匹配,否则将产生时间和空间上的缺失,相反大块内存则往往一次性的分配,由此产生的代价和浪费相对较低.
2014-11-11 11:25:43 3117 5
原创 dlmalloc 2.8.6 源码详解(2)
本文章由vector03原创, 转载请注明出处.邮箱地址: mmzsmm@163.com, 欢迎来信讨论. 2. 标记结构本章节将介绍基本的内存标记结构,包括chunk, tree chunk, sbin, tbin, segment, mstate等.这些重要的机构组成了dlmalloc分配算法的基础.2.1 chunkchunk是dlmalloc中最基本的一种结
2014-11-10 12:56:09 3936 7
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人