堆入门3—bins

bin

ptmalloc 采用分箱式方法对 free chunk 进行管理。将不同的 free chunk 按大小分别采用不同的链表进行管理,这个链表称为bin。

  • bin是一个由struct chunk结构体组成的链表。
  • 不同的bin链是由arena管理的。
  • bin链管理的 chunk 都是free chunk

根据 free chunk 的大小以及使用状态将 chunk 初步分为 4 类:

  • fast bins,用于管理较小的 chunk ;fast bin 为单链,其它 bin 都是双链。
  • small bins,用于管理中等大小的 chunk
  • large bins,用于管理较大的 chunk
  • unsorted bin,用于存放未整理的 chunk

不同类型的bin

1.Fast Bin

  • 管理大小为32字节~128字节(0x20~0x80)的 chunk,如果 chunk 在被释放时发现其大小满足这个要求,则将该 chunk 放入 Fast Bin,释放后不修改下一个 chunk 的 PREV_INUSE 标志位,即相邻 chunk 不进行合并。当需要给用户分配的 chunk 小于或等于128字节时,ptmalloc 首先会在 Fast Bins 中查找相应的空闲块,然后才会去查找bins中的空闲chunk。有 chunk 加入 bin 时修改 fd 指向前面的 chunk 构成链表。

2.Small Bin

  • 管理大小为32~1024字节的chunk,small bins 中的 chunk 按照最近使用顺序进行排列,最后释放的 chunk 被链接到链表的头部,而申请 chunk 是从链表尾部开始,这样,每一个 chunk 都有相同的机会被 ptmalloc 选中。(LIFO,先进先出)

3.Large Bin

  • 管理大于1024字节的 chunk,相对于其它bin是最复杂最慢的,大小相同的 Large Bin 用 fd 和 bk 指针链接(最近使用顺序排列),不同大小的通过 fd_nextsiez,bk_nexsize 按大小链接。ptmalloc 使用 “smallest-first,best-fit” 时是在空闲 large bins 中查找合适的 chunk。

4.Unsorted Bin

  • 这个 bin 相当于 Ptmalloc2 的垃圾桶,也可以看做是 bins 的一个缓冲区。chunk 被释放后会加入 Unsorted Bin 中等待下次分配。在 Unsorted Bin 不为空时,程序申请大于128字节的的内存时会先从这里面找,若找到等于或大于的 chunk 时,则直接分配或分割该 chunk 。

详细参见:https://dongshao.blog.csdn.net/article/details/96865321

无论是 malloc 函数还是 free 函数,动态申请和释放内存时,并不是真正与系统交互的函数。这些函数背后的系统调用主要是 brk 函数以及 mmap, munmap 函数。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据