-1

我想分配一些巨大的动态内存,然后为它编写我自己的内存管理器。即当我的代码需要内存时,我会从这个内存池中分配。我希望算法能够处理内部和外部碎片。哪个是最有效的算法?

4

2 回答 2

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

于 2013-02-15T05:19:34.790 回答
1

这个问题是模棱两可的,因为“最有效”这个词并不清楚。你没有说它应该是最有效的。

举个例子:有一种称为第一次拟合的策略,它可能比最佳拟合更快,但可能导致堆的更多碎片化(一件非常糟糕的事情)。另一方面,最佳拟合在一定程度上减少了外部碎片,但仍然受到它的影响,同时找到一块空闲内存需要更多时间。还有一种称为伙伴堆的策略,您不会受到外部碎片的影响,而是会受到内部碎片的影响。但至少在那里找到一个空闲块通常很快。

您会看到选择算法实际上取决于您的要求。分配应该快还是碎片少?分配行为是什么?是否经常分配和释放小的不均匀块或只有大块?还有更多的因素在这里发挥作用。

也许你想要这样的答案。如果不是,我建议您明确您的要求。

于 2013-02-15T05:51:10.310 回答