显式空闲链表

隐式空闲链表的遍历时间与堆中总块数成正比(包括已分配块),性能随堆增长急剧下降。显式空闲链表通过在空闲块内部存储前驱和后继指针,将遍历限制在空闲块之间,提高了分配效率。

空闲块结构

  • 空闲块的有效荷载区域存储 prevnext 指针,形成双向链表。
  • 已分配块无需存储指针,因此不增加额外开销。

管理策略

  • LIFO(后进先出)策略:后释放的块更靠近链表头部,下一次分配优先使用最近释放的块。简单、快速,但碎片化可能更严重。
  • 地址顺序策略:按地址从小到大维护空闲块链表。合并且重新插入时需按地址排序,耗时增加,但内存利用率更高。

释放时的四种情况(边界标记法的优势体现):

  1. 前后块都分配:当前块直接加入空闲链表。
  2. 前块空闲、后块分配:当前块与前空闲块合并。
  3. 前块分配、后块空闲:当前块与后空闲块合并。
  4. 前后块都空闲:三块合并为一个大的空闲块。

显式空闲链表的分配时间复杂度降低为空闲块数量的函数,而非总块数。

链接到