考虑使用malloc()在碎片堆中分配x个字节的内存。假设堆有多个大小大于x字节的连续位置。
哪个是最好的(导致最少的堆浪费)启发式选择以下位置?
我的直觉是比x字节大的最小位置。我不确定哪种是最好的。
不,这不是任何作业问题。我正在读这个How do malloc() and free() work?,这看起来像是一个很好的后续问题。
答案 0 :(得分:5)
在一个混合了不同大小的分配的通用堆中,然后在两个中我将分配放在可以容纳它的最小块中(以避免在我们之前减少我们可以分配的最大块的大小)需要)。
还有其他实现堆的方法会使这个问题变得不那么重要(例如Doug Lea的流行dlmalloc - 它会在相同大小的块中汇集块来提高速度并减少整体碎片)。 / p>
哪种解决方案最好总是归结为应用程序执行内存分配的方式。如果您事先知道应用程序模式,那么您应该能够在规模和速度上击败通用堆。
答案 1 :(得分:4)
最好选择最小的位置。想想未来的malloc请求。你不知道他们会是什么,你想要满足尽可能多的请求。因此,最好找到一个完全符合您需求的位置,以便将来可以满足更大的请求。换句话说,选择最小的位置可以减少碎片。
答案 2 :(得分:3)
您列出的启发式算法分别用于最佳拟合和最差拟合算法。还有First Fit算法,它只需要找到足够大的第一个空间。它与Best Fit一样好,而且速度更快。