当前位置: 首页 > Linux kernrl, 内存管理 > 正文

[原]内存管理器(六)Glibc malloc 实现(二)–设计模式

前言

上一篇只是简单的介绍了下,关于各个版本的malloc 实现的概况,本来时很详细的,但是写了大半的时候,浏览器崩溃了,很多东西都不见了,所以只有现在的一点了。这次主要介绍ptmalloc ( ) 是如何设计的。

分配区数据结构

这里写图

chunk组织

是什么

chunk的数据结构

chunks

这就是chunk 的数据结构,是不是很眼熟?其实很类似我们之前的边界标识法的结构,本质上这里使用的就是这种方法。
第一个部分:上一个块的大小。
第二个部分:这个块的大小,以及不同状态的标识。
1.A 1:主分配区 0:非主分配区
2.M 1:从mmap( )中非配的空间,0:从heap中分配的空间。
3.p 1:被占用 , 0:未被占用
第三个部分:这个块的大小,就是下一个块的开始。

但是这是只是一个被占用的块的结构,当一个块为空时,数据结构时会发生变化的。当一个块空闲时,它被放在bin 这个链表中,我们会在它的空闲区域增加俩个指针,来标记它,以至于在分配的时候提速。

a

这是一个空闲的块,这个时候一般把M位置空。因为这个时候它时没有意义的,指针 fd 指向后一个空闲的chunk ,而bk 指向前一个空闲的chunk,ptmalloc 通过使用这两个指针将空闲的内存块设置成一个双向链表,至于后两个指针,我们之前说过,bin 有几种不同的类型,后两个指针是在large bins 中来为加快查找速度的。都是指向前与后的指针。

空间复用

chunk 容器

chunk_bin

fast bins

总结一下响应分配时的具体步骤

回收时的策略

1.获取线程锁(永远要保证线程安全)

2.判断是否为mmap()分配,如果是就使用unmmap()函数来直接解除映射

3.将chunk 放入fast bin 中。

4.判断TOP chunk 周围是否为空,如果是就将top chunk 和 其他的合并,然后判断是否大于mmap()的分配阀值,如果大于就调用mmap()释放之。

以上,就是ptmalloc 的基本设计模式,下一篇将对多线程进行详细的整理总结。

作者:zmrlinux 发表于2015/10/21 21:51:42 原文链接
阅读:16 评论:0 查看评论
]]>

本文固定链接: http://zmrlinux.com/2015/10/22/%e5%8e%9f%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e5%99%a8%ef%bc%88%e5%85%ad%ef%bc%89glibc-malloc-%e5%ae%9e%e7%8e%b0%ef%bc%88%e4%ba%8c%ef%bc%89-%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f/ | Kernel & Me

该日志由 root 于2015年10月22日发表在 Linux kernrl, 内存管理 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: [原]内存管理器(六)Glibc malloc 实现(二)–设计模式 | Kernel & Me