是的,我正在学习计算机系统课程。
我对实现 malloc 的各种分配方案有一些疑问。
对于显式列表,如果我使用类似 LIFO 的堆栈实现 malloc,那么拥有指向先前释放的内存的指针的确切目的是什么?比如为什么需要双向链表?单链表不是也能工作吗?
Malloc讲座。 http://www.eecs.harvard.edu/%7Emdw/course/cs61/mediawiki/images/b/b9/Lectures-malloc2.pdf我在网上找到了这个链接,你可以看幻灯片 7 看看我在说什么。
当查看隔离列表分配方案时,这些列表是单向的,对吧?另外,合并机制到底是什么?例如,如果释放了 4 个单词,您是否会首先尝试在周围有空闲空间时将其加入,然后再将其插入各自的隔离链表?或者您只需将 4 个字块插入相应隔离链表的“4 个字”部分?
谢谢。
既然释放的块总是有空间容纳两个指针,为什么不双重链接该列表呢?它简化了合并代码,因此在遍历列表时不必维护尾随指针。它还允许以任一方向遍历列表,以防出现列表的哪一端可能更接近开始搜索的提示。我曾经看过一个不起眼的系统,它在“中间”保留了一个指针,即最后一次活动发生的地方。
释放块时。可能的情况只有四种:
- 空闲块是相邻的after一个空闲块。
- 空闲块是相邻的before一个空闲块。
- 该空闲块位于其前后的两个空闲块之间并与其相邻。
- 该空闲块不与任何空闲块相邻。
合并相邻空闲块的目的是:
- 减少链表的长度
- 准确反映空闲块的大小,而不会给分配器带来负担来向前查看两个块是否相邻
将空闲块排序到特定长度的空闲列表通常有好处,但在大多数实际实现中,合并是一个优先事项,以便alloc()
当存在许多不同大小的空闲块时,对不同大小块的请求不会被不恰当地拒绝。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)