为什么有人会使用最适合的内存分配?

时间:2011-12-06 14:39:12

标签: memory-management

我正在阅读Andrew Tanenbaum的现代操作系统,他写道,最适合是一种广泛使用的内存分配算法。 他还写道,它比第一次适合/下一次适合要慢,因为它必须搜索整个分配的内存列表。并且它往往会浪费更多的记忆,因为它在记忆中留下了许多小的无用空白。

为什么它被广泛使用?我忽略了一些明显的优势吗?

4 个答案:

答案 0 :(得分:5)

首先,它不是 广泛使用(如所有顺序拟合),但可能在家庭作业中除外;)。在我看来,广泛使用的策略是隔离拟合(它可以非常接近最佳拟合)。

其次,最适合策略可以通过使用各种大小的免费列表树来实现

第三,它被认为是关于内存碎片的最佳策略之一

Dynamic Storage Allocation: A Survey and Critical Review

The Memory Fragmentation Problem: Solved?

有关内存管理的信息,而不是Tannenbaum。

答案 1 :(得分:1)

我认为这是一种错误的描述,说它浪费的内存比第一次更合适。与首次配合相比,最佳配合可最大化可用空间,特别是在节省可用于大量分配的空间时。 This博客文章提供了一个很好的例子。

答案 2 :(得分:1)

空间效率和多功能性才是真正的答案。大块可以比小块更适合未知的未来需求,因此最适合的算法首先尝试使用最小的块。

首次拟合和下一个拟合算法(也可以切割块)最终可能会使用较大块的块,这会增加大型malloc()失败的风险。这主要是来自大块外部碎片的伤害。

最佳拟合算法通常会发现只需要几个字节的拟合,导致碎片只有几个字节,同时还可以在需要时保存大块。此外,尽可能长时间保持大块不受影响有助于缓存局部性并最大限度地减少MMU上的负载,最大限度地减少代价高昂的页面错误并为其他程序节省内存页面。

一个好的最佳拟合算法即使在管理大量小碎片时,也会通过增加内部碎片(难以回收)和/或使用良好的查找表和搜索来正确保持其速度树。

第一次合身和下一次合身仍然面临着自己的搜索问题。如果在这些算法中没有良好的大小索引,他们仍然需要花时间在块中搜索适合的块。由于他们的标准较低,"他们可以使用简单的搜索更快地找到合适的匹配,但只要添加智能索引,所有算法之间的速度就会变得更加接近。

过去6年我一直在使用和调整的那个可以在O(1)时间内找到最佳拟合块,大于90%的所有分配。它利用一些策略直接跳到正确的块,或者开始非常接近,因此搜索被最小化。由于其性能和更有效地打包分配的能力,它不止一次取代了现有的块池或首次拟合算法。

答案 3 :(得分:-1)

最适合不是最好的分配策略,但它比首次适合和下一次适合更好。原因是因为它比后两者更少碎片问题。

考虑一个64字节的微堆。首先,我们通过按顺序分配一个32和两个16字节块来填充它。然后我们释放所有块。堆中现在有三个空闲块,一个32字节,两个16字节。

使用first fit,我们分配一个16字节块。我们使用32字节块(因为它首先在堆中!)并且该块的其余16个字节被拆分成新的空闲块。因此在堆的开头有一个16字节的分配块,然后是三个空闲的16字节块。

如果我们现在要分配一个32字节的块,会发生什么?我们不能!堆中仍有48个字节空闲,但碎片化已经让我们失望了。

如果我们使用过最合适的话会发生什么?当我们搜索一个用于16字节分配的空闲块时,我们会在堆的开头跳过32字节块,而是在它之后选择16字节块。这样可以保留32字节块以进行更大的分配。

我建议你在纸上绘图,这样可以很容易地看到在分配和释放期间堆发生了什么。