1。什么是堆在前面的例子中,我们已经知道什么是栈。下面介绍一下堆以及堆的实现过程。在此之前,我们先回顾一下流程模型图中的堆部分,也就是我们所说的堆。我们可以通过移动brk指针来动态扩展它。或者使用mmap分配大块内存。1.1堆在进程中的地址分布我们可以通过查看进程消息cd/proc/selfcatmaps来了解进程的地址状态,从而知道堆在进程中的位置,我们来看一下堆的存储形式.1.2堆申请方法进程中堆主要有两个地方,一个是heap,一个是mmap。Mamp主要用来存放动态链接库。申请方法:堆可以通过malloc或mmap向系统内核空间申请堆空间。对于一般大小的堆应用程序,使用malloc;对于大于128K的应用程序,请使用mmap。当然,这些都可以通过配置项进行修改。1.3Heap结构注:mchunk_prev_size:前一个chunk的大小。为了方便管理,需要特别注意1.3.1中已经分配的chunk,以便后续的chunk合并:应用返回的指针指向用户数据。所以如果申请的是24k,那么heap的实际空间大小是>24k,因为它包含了header信息1.3.2空闲的chunk一般会被free,或者我们可以通过拦截剩余的chunk从header中看出,chunk是否来了来自主进程,以及它是如何分配的。fdbk存放的是链表的指针,双向指针。一张图就可以很好的说明这种情况。2.Bins2.1为什么要用bins说完chunk,再说说关联的bins。用户通过系统调用申请使用内存。使用后(如free后,程序结束后),不会立即返回内核空间。(不断在用户态和内核态之间切换,系统消耗还是挺大的)因此,堆中申请的内存在使用后不会立即释放,而是以链表的形式存储在用户态,方便下次使用。转移。根据内存的大小,共有128个bin,以数组的形式维护。2.2bins的分类从上图我们可以看出bins包括FastbinsunsortedbinsSmallbinsLargebinssmallbins:小于512B的chunkLargebins:512B-128Kchunkunsortedbins:大部分空闲的chunk会存放在unsortedbins中,等待下一次你申请,重新分配。此外,其余的切块也将放入未分类的垃圾箱中。所以它更像是一个temp,一个中转站fastbins:相当于bins的缓存,采用单链表的形式,方便快速查询和使用。通常,它们是相对较小的块,大小为0-64B。2.3bins的调用顺序为fastbins。对于小字节块,第一步是从快块开始搜索。因为是单向链表,大小相同,所以速度更快。smallbins:单个链表中的chunk大小相同,不同链表的chunk间隔为8B。Unsortedbins:首先检查unsortedbins是否合适,如果不合适,则接管fastbins中的bins进行合并和切割。然后分配给smallbins和largebins。largebins,一个链表的大小不一样,是在一个范围内,区间不一样。顶块。对于从largebins中找不到的内存块,需要从heap旁边的chunk中申请。您可以通过移动brk指针来映射块。超过128k需要向mmap申请100。不详请参考王老师的精彩讲解。在stackmanagement的学习过程中,收获了很大的满足感,把之前的一些东西联系到了一起。非常感谢王立涛先生。谢谢你。PS:本文所有资源和图片均来自视频。另一本非常推荐的书是《深入理解计算机系统》
