【总结笔记】内存分配器(malloc)思考问题

参考链接:https://zhuanlan.zhihu.com/p/367060283

  • 1、在内存申请中,如何以最大速度找到一块满足要求的空闲内存?

从内存申请到释放需要哪些细节?【4 大细节】

  • 1、如何标记哪些内存是空闲的、哪些内存是非空闲的?

    内存块以哪种形式组织起来,使得我们能够追踪到每块内存的分配状态?

  • 2、该选择什么样的空闲块给用户?
  • 3、分配内存后,空闲内存块剩余的空间该如何处理?
  • 4、如何处理用户还回去的内存?

管理空闲内存块

因为我们是要实现内存分配器,我们无法向未实现的内存分配器申请内存,所以我们无法将空闲块挂载在链表下。
解决办法: 将维护内存块的分配信息保存在内存块本身中。需要包括知道的信息:1)一个标识内存块是否空闲的标记;2)一个标识内存块大小的标记

  • 1、通过将内存头 4B(假设是 32 位系统)的最后 1bit 设置分配标记位,从而知道哪些内存是空闲的、哪些内存是非空闲的;
    在这里插入图片描述

  • 2、空闲内存分配策略

    • First Fit:总是从头开始查找,找到第一块合适的空闲块;
    • Next Fit:从上一次找到合适的空闲块的位置开始查找;
    • Best Fit:找到所有的空闲内存块,并将所有满足要求的并且大小为最小的那个空闲内存块返回;
  • 3、划分内存块
    为防止内部碎片,假设申请的是 16 B,而返回的是 32 B,我们要将空闲内存块进行划分,前一部分设置为已分配,返回给内存使用者,后一部分变为一个新的空闲内存块。

  • 4、合并空闲内存块
    最为简单的合并策略就是释放内存时立即合并内存块。根据内存块头部信息,可以很清楚地知道下一个内存的信息,那如何知道上一个内存块的信息呢?
    解决办法: 在内存块的尾部添加 footer。上一内存块的 footer 和下一内存块的 header 是相邻的。

posted @ 2022-06-02 22:37  MasterBean  阅读(138)  评论(0)    收藏  举报