1.堆的应用1.1流程介绍堆的描述在上面的文章中已经简单介绍过了。详情请参考chunks和bins。回溯下heap的申请流程顺序:如果申请了一个大小为40B的chunk,先去fastbins中查看链表中是否有合适的,如果有则返回直接地址。如果没有,则继续下一步,查找smallchunk中是否有匹配的chunk,如果找到,直接返回指针地址。如果没有,请转到下一步以在未分类的垃圾箱中搜索。如果没有找到,将fastbins中的bins放入unsortedbins中,合并,看是否满意,剪切或重组,重新分配到smallbins或largebins,如果应用>512B,则到largebins去找到它。如果找到它并转到下一步,您可以在具有相似大小的那些之间切换。比如有一个568b的,就把512b的返回指针剪掉给用户态使用,剩下的56b放到unsortedbins中。当您等待下一次申请时,您将被重新分配。顶块。topchunk通过移动brk申请到内核空间。128k以上,使用mmap申请内存。(申请后的free会直接释放,归还给内核空间)1.2Example演示示例:申请不同大小的内存块下图是:通过堆申请内存空间时,堆中的图像表示。输出结果中,打印地址的前三个是连续的(挨着的),最后一个相差较大,是从mmap分配的。如果申请8K还不够,就从P3后面重新申请P6。2.堆释放示例代码:可以看出P5的地址和P1的地址是一样的。根据结果??推翻理论:释放的unsortedbins将32k的bins切分,分配到24k。6k,8kunsortedbins重新分配申请8k。如果申请8k就不行了,因为bins的chunk有head的大小,所以不能简单的24+8,地址空间需要从tail重新分配。3.heap的merge地址为连续进程扣释放32k,会放在unsortedbins中申请12k,先从fastbins中查找,如果没有找到,再到smallbins中查找没有。然后去unsortedbins,有一个32kcut,12kreturn,剩下的20k给unsortedbins去申请80kk,先从fastbins里找,没找到再去小垃圾箱。然后去到unsortedbins,然后把小bins拿到unsortedbins里面,合并。它可以切割84k,返回80k并将剩余的4k放入unsortedbins100。敬礼不知道的请参考王老师关于栈管理的精彩讲解。在学习的过程中,我获得了极大的满足感,将之前的一些东西串联起来。向上。非常感谢王立涛先生。谢谢你。PS:本文所有资源和图片均来自视频。另一本非常推荐的书是《深入理解计算机系统》
