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

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

内容提要

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

🔎

延伸解读

理解arena、bin与chunk的层级关系

文章强调arena、bin和chunk在逻辑上存在明确的层级:arena > bin > free chunk。arena是线程的堆区,bin是管理空闲chunk的索引结构,chunk是内存块本身。这种分层设计让glibc能高效地分配和回收内存。读者需注意,top chunk不属于任何bin,只有free chunk才依附于bin,这是理解后续流程的关键。

内存分配与回收的核心流程

分配时,glibc按fastbin、small bin、unsorted bin、large bin、top chunk的顺序查找合适块,若都不满足则扩展top chunk或调用mmap。回收时,释放的块根据大小放入对应bin,且不会立即归还操作系统。这一机制减少了系统调用次数,但可能造成内存驻留。文章通过图解展示了这些步骤,但未深入指针操作细节。

线程与arena的映射及锁机制

文章指出arena数量与线程并非一一对应,例如32位系统限制为2*核数+1。分配内存前需获取arena锁,防止多线程竞争。若所有arena都被锁,会创建新的非主分配区。这解释了多线程环境下内存分配可能成为性能瓶颈,也提示开发者注意线程数与arena配置的关系。

❓

Q&A

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系统调用。

➡️

继续阅读