Dlmalloc-2.6.6源码分析

上传人:ldj****22 文档编号:28926346 上传时间:2018-01-21 格式:DOC 页数:28 大小:429KB
返回 下载 相关 举报
Dlmalloc-2.6.6源码分析_第1页
第1页 / 共28页
Dlmalloc-2.6.6源码分析_第2页
第2页 / 共28页
Dlmalloc-2.6.6源码分析_第3页
第3页 / 共28页
Dlmalloc-2.6.6源码分析_第4页
第4页 / 共28页
Dlmalloc-2.6.6源码分析_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《Dlmalloc-2.6.6源码分析》由会员分享,可在线阅读,更多相关《Dlmalloc-2.6.6源码分析(28页珍藏版)》请在金锄头文库上搜索。

1、Dlmalloc-2.6.6 源码分析目 录1. DOUG LEA MALLOC 简介 .22. 边界标记 .33. 分箱管理 .74. 内存分配相关函数 .144.1 函数 MALLOC( ) .144.2 函数 MALLOC_UPDATE_MALLINFO( ) .225. 内存回收相关函数 .255.1 函数 FREE( ).256. DLMALLOC2.8.4 .287. 参考文档 .281. Doug Lea malloc 简介Doug Lea malloc是一个用 C语言实现的非常流行的内存分配器,由纽约州立大学 Oswego分校计算机系教授 Doug Lea于 1987年撰写,许

2、多人将其称为 Doug Lea的 malloc,或者简称 dlmalloc,目前最新版本为 2.8.4。由于具备高效且占用空间较小等特点,dlmalloc 被广泛使用,用 Doug Lea自己的话说,就是“它在一些 linux版本里面作为默认的 malloc被使用,被编译到一些公共的软件包里,并且已经被用于各种 PC环境及嵌入式系统,以及许多甚至我也不知道的地方”。dlmalloc的由来,从 Doug Lea自己写的文章看,似乎是这样的:1986 年到 1991年 Doug Lea是 libg+(即 GNU C+ library)的主要作者,当时他写了大量有着动态分配内存的C+程序,结果发现程

3、序跑得比预期慢,内存消耗也比预想的要大很多,追究下去,发现是所在系统内存分配器的问题。于是开始用 C+为新类写一些特殊用途的分配器,但他很快意识到这并非一个好的策略,应该提供一个在 C+和 C环境下都能运行得很好的通用内存分配器,于是 dlmalloc诞生了。在之后的日子里,Doug Lea 和一些志愿者一直都在不断的维护优化这个内存分配器。dlmalloc 之所以能被广泛应用,与其高标准的追求和不断的精益求精应该有着不可分割的关系。另外,值得一提的是,Doug Lea 是 JAVA编程界的大师级人物,也是 JCP中的一员。同时Doug还是一个无私的人,苹果越分越少,知识却越分越多,他深信知识

4、的分享能激荡出不一样的火花。本文以 dlmalloc-2.6.6为分析对象,之所以选择这个版本而不是最新的版本,原因如下,一是公司项目操作系统用的是 eCos,而 eCos用的是 dlmalloc-2.6.6;二是网友lenky0401已经很详细的分析了 dlmalloc-2.8.3(见“参考文档”一节)。另外一个顺带的好处就是,通过两个版本的比较,可以找到从 2.6.6到 2.8.3的变迁及其缘由。 尽管 dlmalloc 经历了诸多版本的变化,然而 malloc 算法的两个核心元素一直没变:边界标记和分箱管理。2. 边界标记在继续深入之前,有必要解释一下 chunk的概念,这个概念对内存分

5、配器而言十分重要。chunk,“大块”的意思,在 dlmalloc中指包含了用户空间、heap 控制信息空间及出于对齐需求而多出来的空间的内存空间,是 dlmalloc分配释放的基本操作对象。有两种类型的 chunk,已分配的 chunk和未分配的 chunk,两者交错排列,占据了整个heap空间。注意,没有相邻的两个未分配 chunk,因为在调用 free()释放被使用过的chunk时,dlmalloc 将合并任何相邻的空闲 chunk。交错的两种 chunk看起来像这样:S i z e o f c h u n k , i n b y t e s PS i z e o f p r e v i

6、 o u s c h u n kU s e r d a t a s t a r t s h e r e a n a l l o c a t e d c h u n kS i z e o f c h u n k , i n b y t e s P R E V _ I N U S ES i z e o f p r e v i o u s c h u n kF o r w a r d p o i n t e r t o n e x t c h u n k i n l i s tB a c k p o i n t e r t o p r e v i o u s c h u n k i n l i s

7、tU n u s e d s p a c ea f r e e d c h u n kS i z e o f c h u n k , i n b y t e s P R E V _ I N U S ES i z e o f p r e v i o u s c h u n ka n a l l o c a t e d c h u n kU s e r d a t a s t a r t s h e r e S i z e o f p r e v i o u s c h u n ko t h e r c h u n k s. . .S i z e o f p r e v i o u s c h u

8、 n kS i z e o f c h u n k , i n b y t e s P R E V _ I N U S EF o r w a r d p o i n t e r t o n e x t c h u n k i n l i s tB a c k p o i n t e r t o p r e v i o u s c h u n k i n l i s tU n u s e d s p a c et o p c h u n kU s e r s p a c eE n d o f a v a i l a b l e m e m o r y图 1Dlmalloc使用双向链表来管理空闲

9、chunk,其节点数据结构体定义如下,struct malloc_chunkINTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */struct malloc_chunk* fd; /* double links - used only if free. */struct malloc_chunk* bk;成员 prev_size 记录了物理位置上相邻的前一个 chunk 的大小,利用 prev_

10、size 可以找到前一个 chunk,这在 free( )时合并前一个空闲块时派上了用场;成员 size 记录了该 chunk 的大小, dlmalloc 在 32 位处理器上总是 8 字节对齐,故 size 的低三位对 size 而言是无效的, dlmalloc 利用这三位来记录一些信息,具体如下:#define PREV_INUSE 0x1bit0:物理位置上相邻的前一个 chunk 是否被分配使用的标志,如果为 0x1,说明被分配;#define IS_MMAPPED 0x2bit1:如果为 0x1,则表明该 chunk 通过 mmap( )分配而得,那么在释放时调用 munmap( )

11、;fd 和 bk 则分别指向双向链表中前一个节点和后一个节点。其物理布局看起来像这样:S i z e o f c h u n k , i n b y t e s PS i z e o f p r e v i o u s c h u n kF o r w a r d p o i n t e r t o n e x t c h u n k i n l i s tB a c k p o i n t e r t o p r e v i o u s c h u n k i n l i s tU n u s e d s p a c eS i z e o f p r e v i o u s c h u n

12、kS i z e o f c h u n k , i n b y t e s P R E V _ I N U S Ec h u n kN e x t c h u n k图 2可以看出,chunk 指针指向 heap内部控制信息,图中 head和 foot区域的 Size of chunk必须是一样的,如此 nextchunk才能根据 Size of chunk准确找到 chunk的位置。另一种是已分配的 chunk,其结构体和未分配 chunk结构体一样,只是不会使用 fd和 bk两个成员,因为被分配后已经不需要这两个域了,其物理布局看起来像下图,chunk 指后面 8字节的偏移处,即 mem区域,是返回给用户的内存指针,该 chunk

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号