glibc-malloc申请堆空间流程分析

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

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():为了更快的找到最合适的堆块搜索顺序为如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值