malloc
最简单的一个申请堆空间:
void *malloc(size_t bytes) //分配所需的内存空间,并返回一个指向它的指针
//参数必须是2*SIZE_SZ的整数倍,如果不是系统会优化为整数倍
//32bit中SIZE_SE为4,也就是堆大小为8的倍数。
//64bit中SIZE_SZ为8,那么就是16的倍数。
- 第一次调用malloc的时候会先初始化一个叫main_arena(libc中)的东西,并向kernel申请一大块内存区域(top tunck)作为堆
- 再从这一大块内存区域分割出一个chunk,让malloc回传给程序(这个回传值是一个指针,这个指针指向这个chunk头,tcache前是指向presize,tcache后是指向tcache的数据体)。此时使用的这块内存叫chunk
源码角度:
- 首先会进入到__libc_malloc(size_t bytes)函数
- 然后会寻找合适的arena来分配内存
- 如果没找到就来到 _int_malloc()函数分配内存
_int_malloc
- 首先将用户请求的bytes(参数一)转换为chunk单位nb
- 如果没有合适的arena则调用sysmalloc(),用mmap()分配chunk并返回,也就是区分是main线程还是子线程
mmap():为了更快的找到最合适的堆块搜索顺序为如下
Linux内存管理:malloc与free的内部机制

文章详细介绍了Linux环境中,C语言的动态内存管理函数malloc和free的工作原理。malloc通过初始化arena并利用mmap或brk分配堆空间,遵循特定的内存对齐规则。而free则涉及chunk的检查、合并及fastbin的管理,优化内存的回收。整个过程涉及到内存碎片的避免和效率的提升。
最低0.47元/天 解锁文章
852

被折叠的 条评论
为什么被折叠?



