隐式空闲链表

隐式空闲链表是最基本的堆分配器实现方式,使用块头部中的大小字段和分配位在空闲块之间建立隐式链接。

块格式

  • 头部:存储块大小(含头部和填充)和分配位(标识该块是否已分配)。由于对齐要求,大小的低位始终为0,可将分配位存储在该低位中。
  • 有效荷载:应用程序实际使用的数据区。
  • 填充:为满足对齐要求而添加的额外字节大小。

遍历机制

  • 分配器通过从堆起始地址开始,逐块扫描头部中的大小字段,隐式地访问下一个块。
  • 根据头部中的分配位判断块是空闲还是已分配。

放置策略

  • 首次适应(First Fit):从头查找第一个能满足请求的空闲块。简单但扫描时间长,且容易产生小碎片。
  • 最佳适应(Best Fit):查找所有空闲块中能满足请求且大小最小的。内存利用率最高,但遍历开销大。
  • 下次适应(Next Fit):从上次扫描结束处继续查找。比首次适应更快,但利用率略低。

分割与合并

  • 分割:当找到的空闲块远大于请求大小时,将其分割为已分配块和新的空闲块。
  • 立即合并:每次释放块时立即与相邻空闲块合并。
  • 推迟合并:在无法分配时才进行合并扫描。
  • 边界标记法:在块首尾都存储大小和分配信息,实现O(1)时间的合并操作(释放时检查前后块是否空闲)。

链接到