深入理解glibc malloc:malloc() 与 free() 原理图解

💡 原文中文,约4400字,阅读约需11分钟。
📝

内容提要

本文分析了glibc中内存分配与回收的过程,涉及arena、bin和chunk三个层次。主要解释了这三个概念的关系和处理过程。文章未深入探讨具体细节,仅通过图解说明。

🎯

关键要点

  • 本文分析glibc中内存分配与回收的过程,涉及arena、bin和chunk三个层次。

  • arena是为线程分配的堆区,分为主线程的main arena和子线程的thread arena。

  • chunk是逻辑上划分的一小块内存,分为已分配、已释放、Top chunk和Last Remainder chunk。

  • bin是保存Free chunk链表的指针数组,分为Fast bin、Unsorted bin、Small bin和Large bin。

  • 内存申请流程中,第一次申请使用sbrk或mmap,后续申请根据剩余空间决定分配或扩容。

  • thread arena的内存申请流程与main arena类似,但使用mmap系统调用。

  • 内存回收时,释放的内存块根据大小添加到对应的bin中。

  • 内存分配时,优先从fastbin、small bins、unsorted bins、large bins和top bins中寻找合适的内存块。

  • 内存分配过程涉及锁机制以防止多个线程同时访问同一分配区。

  • 如果所有bin中都没有合适的chunk,则需要扩展top chunk或调用mmap分配新的内存。

延伸问答

glibc中的arena是什么?

arena是为线程分配的堆区,分为主线程的main arena和子线程的thread arena。

malloc()的内存申请流程是怎样的?

第一次申请内存时,根据大小决定使用sbrk或mmap,后续申请根据剩余空间决定分配或扩容。

内存回收时,释放的内存块如何处理?

释放的内存块根据大小添加到对应的bin中,分为Fast bin、Unsorted bin、Small bin和Large bin。

什么是chunk,它的分类有哪些?

chunk是逻辑上划分的一小块内存,分为已分配、已释放、Top chunk和Last Remainder chunk。

内存分配时的优先级顺序是什么?

内存分配时,优先从fastbin、small bins、unsorted bins、large bins和top bins中寻找合适的内存块。

thread arena与main arena的内存申请有什么区别?

thread arena的内存申请流程使用mmap系统调用,而main arena可能使用sbrk系统调用。

➡️

继续阅读