Glibc内存管理--ptmalloc2源代码分析(十三)

5.2 分箱式内存管理

对于空闲的 chunk ptmalloc 采用分箱式内存管理方式,根据空闲 chunk 的大小和处于的状态将其放在四个不同的 bin 中,这四个空闲 chunk 的容器包括 fast bins unsorted bin small bins large bins Fast bins 是小内存块的高速缓存,当一些大小小于 64 字节的 chunk 被回收时,首先会放入 fast bins 中,在分配小内存时,首先会查看 fast bins 中是否有合适的内存块,如果存在,则直接返回 fast bins 中的内存块,以加快分配速度。 Usorted bin 只有一个,回收的 chunk 块必须先放到 unsorted bin 中,分配内存时会查看 unsorted bin 中是否有合适的 chunk ,如果找到满足条件的 chunk ,则直接返回给用户,否则将 unsorted bin 的所有 chunk 放入 small bins 或是 large bins 中。 Small bins 用于存放固定大小的 chunk ,共 64 bin ,最小的 chunk 大小为 16 字节或 32 字节,每个 bin 的大小相差 8 字节或是 16 字节,当分配小内存块时,采用精确匹配的方式从 small bins 中查找合适的 chunk Large bins 用于存储大于等于 512B 1024B 的空闲 chunk ,这些 chunk 使用双向链表的形式按大小顺序排序,分配内存时按最近匹配方式从 large bins 中分配 chunk

 

5 .2.1 Small bins

ptmalloc 使用 small bins 管理空闲小 chunk ,每个 small bin 中的 chunk 的大小与 bin index 有如下关系:

Chunk_size=2 * SIZE_SZ * index

SIZE_SZ 4B 的平台上, small bins 中的 chunk 大小是以 8B 为公差的等差数列,最大的 chunk 大小为 504B ,最小的 chunk 大小为 16B ,所以实际共 62 bin 。分别为 16B 24B 32B ,……, 504B 。在 SIZE_SZ 8B 的平台上, small bins 中的 chunk 大小是以 16B 为公差的等差数列,最大的 chunk 大小为 1008B ,最小的 chunk 大小为 32B ,所以实际共 62 bin 。分别为 32B 48B 64B ,……, 1008B

ptmalloc 维护了 62 个双向环形链表(每个链表都具有链表头节点,加头节点的最大作用就是便于对链表内节点的统一处理,即简化编程),每一个链表内的各空闲 chunk 的大小一致,因此当应用程序需要分配某个字节大小的内存空间时直接在对应的链表内取就可以了,这样既可以很好的满足应用程序的内存空间申请请求而又不会出现太多的内存碎片。我们可以用如下图来表示 SIZE_SZ 4B 的平台上 ptmalloc 512B 字节以下的空闲 chunk 组织方式(所谓的分箱机制)。

猜你喜欢

转载自mqzhuang.iteye.com/blog/1064551