How first-fit allocation algorithm reduce memory fragmentation?

时间:2016-09-25 03:21:31

标签: algorithm memory-management garbage-collection ocaml

I'm reading the Chapter 21 Understanding the Garbage Collector的href处将字节附加到数据URI。 在内存分配策略部分中,它说:

  

优先配置

     

如果您的程序分配了许多不同大小的值,您有时可能会发现您的空闲列表变得支离破碎。在这种情况下,尽管存在空闲块,GC仍被迫执行昂贵的压缩,因为单独的块都不足以满足请求。

     

First-fit分配侧重于减少内存碎片(以及因此压缩的数量),但代价是内存分配较慢。每个分配从头开始扫描空闲列表以获得合适的空闲块,而不是重新使用最新的堆块作为下一个适合的分配器。

我无法弄清楚首次匹配如何减少内存碎片与下一次匹配相比,这两种算法唯一不同的是它们从不同的地方开始搜索。

2 个答案:

答案 0 :(得分:3)

我认为简短的回答是Next Fit从整个空闲内存区域中分配块,这意味着所有块的大小都会慢慢缩小。 First Fit从尽可能靠近前方分配,因此小块集中在那里。因此,大块的供应持续时间更长。由于压缩发生在没有足够大的空闲块的情况下,First Fit将需要更少的压缩。

答案 1 :(得分:3)

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.97.5185&rep=rep1&type=pdf"内存碎片问题:解决了?"内存分配策略的摘要和(可能)实用程序的内存碎片问题的解决方案。约翰斯通和威尔逊。他们指出,关于这个问题的大多数工作都是通过模拟内存分配和释放(Knuth在第1卷第2.5节中也提出了这一点)。他们的贡献是从基于统计研究和随机数发生器的模拟研究转向基于真实程序的内存分配行为痕迹的模拟研究。在这种情况下,他们发现适合现实生活行为的最佳拟合变体,使用专用于常用块大小的特定内存块大小的自由列表,非常好。

所以我认为你的答案是除了模拟研究的结果之外没有简单明确的答案,对于常见的C / C ++程序,最佳拟合的变体实际上可以很好地工作 - 但是如果存储的话OCaml的分配行为与C / C ++的分配行为明显不同,当有人使用真实程序或真实程序的痕迹运行不同分配器的测试时,我们可能只会真正发现什么是好的和坏的。