Malloc分配计划

时间:2012-04-04 05:33:46

标签: c memory malloc

是的,我正在参加计算机系统课程。 我有几个关于实现malloc的各种分配方案的问题。 对于显式列表,如果我使用类似LIFO的堆栈实现malloc,那么指向前一个释放内存的目的究竟是什么?就像为什么你需要双链表?不会单独链接列表也能正常工作吗?

Malloc lecture. 我在网上找到了这个链接,你可以看看幻灯片7,看看我在说什么。

在查看隔离列表分配方案时,这些列表是单向的吗?而且,合并机制到底是什么?例如,如果释放了4个单词,您是否会首先尝试在您将自由空间插入相应的隔离链表之前加入它?或者您只是在相应的隔离链表的“4个字”部分插入4个字块?

谢谢。

1 个答案:

答案 0 :(得分:4)

由于释放的块总是有两个指针的空间,为什么不加倍链接列表?它简化了合并代码,因此在遍历列表时不必维护尾随指针。它还允许在任何一个方向上遍历列表,以防有一个提示列表的哪一端可能更接近开始搜索。我曾经看过的一个模糊的系统将指针保持在“中间”,即最后一次活动发生的地方。

释放一个区块时。只有四种可能的情况:

  • 空闲块后,空闲块与相邻。
  • 空闲块在空闲块之前与相邻。
  • 空闲区块在其前后的两个空闲区块之间和附近。
  • 空闲区块与任何空闲区域都不相邻。

合并相邻自由块的目的是:

  • 减少链接列表的长度
  • 准确反映空闲块的大小,而不会增加分配器的负担以查看两个块是否相邻

将一个空闲块排序为一个特定长度的空闲列表通常会带来好处,但在大多数实际实现中,合并是一个优先级,因此当有许多块时,不会不恰当地拒绝对不同大小块的alloc()请求不同大小的免费街区。