dlmalloc-2.6.6源码分析

dlmalloc-2.6.6源码分析

ID:6270833

大小:429.00 KB

页数:28页

时间:2018-01-08

dlmalloc-2.6.6源码分析_第1页
dlmalloc-2.6.6源码分析_第2页
dlmalloc-2.6.6源码分析_第3页
dlmalloc-2.6.6源码分析_第4页
dlmalloc-2.6.6源码分析_第5页
资源描述:

《dlmalloc-2.6.6源码分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Dlmalloc-2.6.6源码分析目录1.DOUGLEAMALLOC简介22.边界标记33.分箱管理74.内存分配相关函数144.1函数mALLOc()144.2函数malloc_update_mallinfo()225.内存回收相关函数255.1函数fREe()256.DLMALLOC2.8.4287.参考文档281.DougLeamalloc简介DougLeamalloc是一个用C语言实现的非常流行的内存分配器,由纽约州立大学Oswego分校计算机系教授DougLea于1987年撰写,许多人将其称为DougLea的malloc,或者简称dlmalloc,目前

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

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

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

5、中指包含了用户空间、heap控制信息空间及出于对齐需求而多出来的空间的内存空间,是dlmalloc分配释放的基本操作对象。有两种类型的chunk,已分配的chunk和未分配的chunk,两者交错排列,占据了整个heap空间。注意,没有相邻的两个未分配chunk,因为在调用free()释放被使用过的chunk时,dlmalloc将合并任何相邻的空闲chunk。交错的两种chunk看起来像这样:图1Dlmalloc使用双向链表来管理空闲chunk,其节点数据结构体定义如下,structmalloc_chunk{INTERNAL_SIZE_Tprev_size;/*Si

6、zeofpreviouschunk(iffree).*/INTERNAL_SIZE_Tsize;/*Sizeinbytes,includingoverhead.*/structmalloc_chunk*fd;/*doublelinks--usedonlyiffree.*/structmalloc_chunk*bk;};成员prev_size记录了物理位置上相邻的前一个chunk的大小,利用prev_size可以找到前一个chunk,这在free()时合并前一个空闲块时派上了用场;成员size记录了该chunk的大小,dlmalloc在32位处理器上总是8字节对齐,

7、故size的低三位对size而言是无效的,dlmalloc利用这三位来记录一些信息,具体如下:#definePREV_INUSE0x1bit[0]:物理位置上相邻的前一个chunk是否被分配使用的标志,如果为0x1,说明被分配;#defineIS_MMAPPED0x2bit[1]:如果为0x1,则表明该chunk通过mmap()分配而得,那么在释放时调用munmap();fd和bk则分别指向双向链表中前一个节点和后一个节点。其物理布局看起来像这样:图2可以看出,chunk指针指向heap内部控制信息,图中head和foot区域的Sizeofchunk必须是一样的,

8、如此nex

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。