chunk可以分成allocated chunk,free chunk,top chunk,last remainter chunk
- allocated chunk:当前chunk是被应用层用户所使用的
- free chunk:当前chunk是空闲的,没有被应用层用户所使用
- top chunk:不属于任何的bins,主要是当我们在free的bins中没有找到我们所需的bins时,就从top bins中划分出我们所需的bins。当top bins不够时,需要使用brk分配
- last remainter chunk
由于在libc2.26之后引入tcachebins,所以堆分配机制和之前不太相同
tcachebins——tcachebins是一个长度为64的字节数组,每个字节数组对应一条链表。所以tcachebins只能存放0x0-0x400大小的堆,且每个链表长度为7。并且类似于fastbins,是一个单链表。在释放大小为0x0-0x400大小的堆的时候,首先会被释放入对应长度tcachebins对应的链表中,当长度超出7后,再放入fastbin或unsortbins中。malloc的时候当发现malloc对应大小的堆,先从tcachebins中取出。注意当如果从fastbin中取出了一个块,那么会把剩余的块放入tcache中直至填满tcache(smallbin中也是一样)。如果进入了unsortedbin,且chunk的size和当前申请的大小精确匹配,那么在tcache未满的情况下会将其放入到tcachebin中
fastbins——fastbins上有7个单链表,是bins数组上的前十位,存放大小为0x20-0x80的堆,存放时不合并
sortbins——当有大于0x400或在0x80-0x400的时候tcachebins以存放满,多余的堆将让放入sortbins。
smallbins——通常是在对sortbins和fastbins整理后

这篇博客详细介绍了Linux下内存分配的流程,包括malloc如何从tcachebins、fastbins、smallbins、largebins和topchunk中寻找合适的chunk,以及内存回收时free的处理方式,涉及tcache、fastbin、unsortedbin、smallbin和largebin的管理。此外,还讨论了mmap和sbrk在内存扩展中的作用。
最低0.47元/天 解锁文章
1296

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



