我想分配一些巨大的动态内存,然后为它编写我自己的内存管理器。也就是说,当我的代码需要内存时,我会从这个内存池中分配。我希望算法能够处理内部和外部碎片。哪种算法最有效?
对于这些标准,我会选择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
这个问题很含糊,因为"最高效"这个词不清楚。你没有说在什么方面它应该是最有效的。
举个例子:有一种称为首次拟合的策略,它可能比最佳拟合更快,但可能会导致堆的更多碎片化(这真的很糟糕)。另一方面,最佳拟合在一定程度上减少了外部碎片,但仍然会受到影响,同时找到一块空闲内存需要更多时间。还有一种叫做伙伴堆的策略,你不会受到外部碎片的影响,而是受到内部碎片的影响。但至少在那里找到一个空闲区块通常很快。
您可以看到,选择算法实际上取决于您的需求。分配应该快还是碎片少?分配行为是什么?是否存在频繁分配和释放的不均匀的小块,或者只有大块?还有更多的因素在起作用。
也许你想要这样的答案。如果没有,我建议你明确你的要求。