我想分配一些巨大的动态内存,然后为它编写自己的内存管理器。即当我的代码需要内存时,我会从这个内存池中分配。我希望算法能够处理内部和外部碎片。哪种算法最有效?
答案 0 :(得分:3)
对于这些标准,我会选择Doug Lea的http://g.oswego.edu/dl/html/malloc.html,它为各种不同大小的每一个维护商店块的集合 - 可以快速找到所需的大小,并重新使用相同的块大小减少碎片。请注意(http://entland.homelinux.com/blog/2008/08/19/practical-efficient-memory-management/),这不适用于多线程。
如果我自己写一个,我会选择http://en.wikipedia.org/wiki/Buddy_memory_allocation,因为它很快并且不常用于用户空间(不常用,因为它限制了可能的块大小,导致内部碎片)。事实上,我前段时间做过 - http://www.mcdowella.demon.co.uk/buddy.html
答案 1 :(得分:1)
这个问题很模糊,因为“最有效”一词并不清楚。你没有说它应该是最有效的。
作为一个例子:有一种称为第一次拟合的策略可能比最佳拟合更快但可能导致更多的碎片碎片化(这是一件非常糟糕的事情)。另一方面,最适合减少外部碎片但仍然受其影响,而找到一大块可用内存需要更多时间。还有一种叫做伙伴堆的策略,你不会受到外部碎片的影响,而是受到内部碎片的影响。但至少找到一个免费区块通常很快。
您认为选择算法确实取决于您的要求。分配是快速还是碎片低?什么是分配行为?是否有小的不均匀块分配和频繁释放或只有大块?还有更多因素在这里发挥作用。
也许你想要这样的答案。如果不是,我建议您清除您的要求。