资讯专栏INFORMATION COLUMN

【学习笔记】4. 堆的申请和释放

banana_pi / 1526人阅读

摘要:堆的申请过程介绍关于堆的描述,已经简单的在上面一篇文章中做过简单的介绍。等待下次申请的时候,再次重新分配。。申请之后的会直接释放,返还给内核空间例子演示示例申请大小不同的内存块下图是通过堆申请内存空间的时候,在中的形象表示。

1. 堆的申请 1.1 过程介绍

关于堆的描述,已经简单的在上面一篇文章中做过简单的介绍。具体可以参考 chunk 和 bins

下面我们来回溯下堆的申请过程

申请的顺序:

如果申请40B大小的chunk,首先去 fast bins 查看链表中是否有合适的,如果有直接返回地址。如果没有,进行下一步

small chunk 里面查找是否有匹配的chunk,如果查找到,直接返回指针地址。 如果没有,进行下一步

在 unsorted bins 查找,如果没有找到,把 fast bins 里面的bins 放入 unsorted bins,进行合并,看看是否有满足的,进行切割或者重组,重新分配到 small bins 或者 large bins

如果申请的 > 512B,则去large bins 里面去查找。 如果找到进入下一步,大小类似的可以进行切换,比如有个 568b 的,切割 512b 返回指针供用户态使用,剩下的56b,重新放入到unsorted bins。等待下次申请的时候,再次重新分配。

top chunk。 top chunk 通过移动brk,向内核空间申请

对于大于 128k,使用mmap 申请内存。(申请之后的free 会直接释放,返还给内核空间)

1.2 例子演示

示例:申请大小不同的内存块

下图是:通过堆申请内存空间的时候,在heap中的形象表示。

输出结果,打印地址

前面三个是连续的(紧挨着的),后面一个相差比较大,是从 mmap 分配的

如果申请8K的不够用了,P6是从 P3后面重新申请的

2. 堆的释放 示例代码:

可以看出 P5的地址和P1是一样的

根据结果倒推理论:

释放的 unsorted bins 对 32k 的进行切割,分给 24 k ,剩下的8k 放到自己上

再次申请6k的chunk

P6 申请了6k,unsorted bins 的 8k 进行再分配

申请8k

如果申请了8k,就不行了 ,因为bins 的 chunk 有头部大小,所以不能简单的 24 + 8

需要从尾部重新分配地址空间

3. 堆的合并

地址是连续的

过程推演

释放 32k ,会放到 unsorted bins

申请 12k,先从 fast bins 中查找,没有找到,然后去 small bins 没有。 然后去 unsorted bins ,有一个 32k的
进行切割,12k 返回,剩下的20k 放到 unsorted bins

申请 80k k,先从 fast bins 中查找,没有找到,然后去 small bins 没有。 然后去 unsorted bins
没有,然后就去把 small bins 的拿过来放到 unsorted bins ,合并 。 可进行84k 的切割,80k 的返回
剩下的 4k 放到 unsorted bins

100. 致敬

如有不详,请参考王老师的精彩讲解 堆栈管理
学习过程中,获得了极大的满足感,把之前的一些东西串联了起来。十分感谢 王利涛老师。
在此表示感谢。
PS:本文中所有的资源和图片均来自视频中
另外十分推荐一本书 深入理解计算机系统

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/63722.html

相关文章

  • 学习笔记】3. 内存的 chunk bins

    摘要:便于管理,为了后续的合并已分配出去的特别注意申请返回的指针,指向的。存放链表的指针,双向指针。使用完之后比如之后,程序结束之后,不会立即的返回给内核空间。单个链表下大小相同,不同链表的间隔是。对于从查找不到的内存块,需要从旁的去申请。 1. 什么是堆 前面的例子我们已经知道栈是什么。现在我们来介绍下堆,以及堆的实现过程。 在此之前,我们先来回顾下进程的模型 showImg(https:...

    JerryC 评论0 收藏0
  • 【进阶1-4期】JavaScript深入之带你走进内存机制

    摘要:引擎对堆内存中的对象进行分代管理新生代存活周期较短的对象,如临时变量字符串等。内存泄漏对于持续运行的服务进程,必须及时释放不再用到的内存。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第一期,本周的主题是调用堆栈,今天是第4天。 本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划...

    不知名网友 评论0 收藏0
  • Android内存优化

    摘要:一内存分配内存结构创建进程分配内存块内存块中有堆,栈,静态存储区静态存储区,存放静态数据,全局数据和常量堆,存放对象栈,当进程中创建了线程,分给线程一个栈,用于存放局部变量函数开始执行时,局部变量的存储单元在栈上创建,当函数执行结束,释放这 一.内存分配 1.内存结构 创建进程分配内存块内存块中有堆,栈,静态存储区静态存储区,存放静态数据,全局static数据和常量;堆,存放对象;栈,...

    娣辩孩 评论0 收藏0
  • Android内存优化

    摘要:一内存分配内存结构创建进程分配内存块内存块中有堆,栈,静态存储区静态存储区,存放静态数据,全局数据和常量堆,存放对象栈,当进程中创建了线程,分给线程一个栈,用于存放局部变量函数开始执行时,局部变量的存储单元在栈上创建,当函数执行结束,释放这 一.内存分配 1.内存结构 创建进程分配内存块内存块中有堆,栈,静态存储区静态存储区,存放静态数据,全局static数据和常量;堆,存放对象;栈,...

    hikui 评论0 收藏0
  • 用c++开发一个简版http服务器

    摘要:每个子进程都是一个,采用和非阻塞实现事件循环。使用,同样通过监听上的可读事件来统一事件源。将其设置为边沿触发,不然水平触发将一直告知该事件。时间堆的实现定时器的精度目前为采用最小堆来实现。 初衷 在阅读了TLPI和深入理解计算机系统之后,学会了如何使用linux系统api,想在写代码的过程中来加深自己对知识的理解,更想用这些知识来去做一个更酷的东西,而不仅仅是教课书上的简单服务器。而且...

    wanghui 评论0 收藏0

发表评论

0条评论

banana_pi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<