5.内存分配相关函数.doc

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.内存分配相关函数

目 录 1. 本文档介绍 1 2.边界标记法 2 3. 分箱式内存管理 6 4. 核心结构体malloc_state 13 5. 内存分配相关函数 16 5.1 函数dlmalloc 16 5.2 函数tmalloc_small 25 5.3 函数tmalloc_large 27 5.4 函数sys_alloc 32 5.5 函数mmap_alloc 39 6. 内存回收相关函数 42 6.1 函数dlfree 42 6.2 函数sys_trim 47 7. 本文档声明 50 1. 本文档介绍 dlmalloc是目前一个十分流行的内存分配器,其由Doug Lea从1987年开始编写,到目前为止,最新版本为2.8.3,由于其高效率等特点被广泛的使用和研究(linux系统等用的就是dlmalloc或其变形,比如ptmalloc。dlmalloc的实现只有一个源文件(还有一个头文件),大概5000行,其内注释占了大量篇幅,由于有这么多注释存在的情况下,表面上看上去很容易懂,的确如此,在不追求细节的情况,对其大致思想的确很容易了解(没错,就只是了解而已),但是dlmalloc作为一个高品质的佳作,实现上使用了非常多的技巧,在实现细节上不花费一定的精力是没有办法深入理解其为什么这么做,这么做的好处在哪,只有当真正读懂后回味起来才发现它是如此美妙。 lenky0401个人博客将陆续推出dlmalloc源码(针对Doug Lea Malloc的最新版Version 2.8.3)的解析,由于lenky0401水平有限,因此也不能完全保证对dlmalloc的所有理解都准备无误但是所有内容均出自个人的理解而并非存心妄自揣测来愚人耳目,所以如果读者发现其中有什么错误,请勿见怪,如果可以则请来信告之,并欢迎来信讨论(lenky0401@163.com)。 描述的内容不会包含dlmalloc全部代码但会将这其中涉及到的一些技巧尽量讲出,我相信对dlmalloc源代码不感兴趣的朋友也可以学到这些独立的技巧而使用在自己的编程实践中。Ubuntu-8.10操作系统作为参考环境设置考虑。 ? 2.边界标记法 dlmalloc采用所谓的边界标记法将内存划分成很多块,从而对内存的分配与回收进行管理。在dlmalloc的实现源码中定义了两种结构体malloc_chunk和malloc_tree_chunk来描述这些块,小于256字节的chunk块由结构体malloc_chunk来描述,大于256字节的chunk块由结构体malloc_tree_chunk来管理。 结构体malloc_chunk和malloc_tree_chunk的定义如下: struct malloc_chunk { size_t prev_foot; /* Size of previous chunk (if free). */ size_t head; /* Size and inuse bits. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; }; typedef struct malloc_chunk mchunk; typedef struct malloc_chunk* mchunkptr; typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ ? struct malloc_tree_chunk { /* The first four fields must be compatible with malloc_chunk */ size_t prev_foot; size_t head; struct malloc_tree_chunk* fd; struct malloc_tree_chunk* bk; ? struct malloc_tree_chunk* child[2]; struct malloc_tree_chunk* parent; bindex_t index; }; ? 从它们的定义中可以看到结构体malloc_tree_chunk除了比malloc_chunk多三个字段以外,前四个字段和malloc_chunk完全一样。我们先来看看只考虑使用结构体malloc_chun

文档评论(0)

teda + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档