我正在阅读有关 Hoard 内存分配器的论文,一切都是可以理解的,但有一件事不是,它如何减少多线程分配或释放内存时引起的堆争用,避免内存可能引入的错误共享分配器,同时,它对碎片应用严格的限制。他们是如何实现这一目标的?
最佳答案
根据论文,Hoard 根据每个处理器堆的要求在 super block 内部分配内存。当这些堆需要一个 super block 时,它们会向全局堆请求一个空的 super block 。由于 super block 完全由每个处理器堆释放,因此它们被释放到全局堆以便在其他地方重用,从而限制了分配的内存。
就线程争用而言, super block 一次仅在一个每处理器堆中有效使用。然后,Hoard 只为从一个 super block 到一个线程提供内存。使用这种策略 Hoard 能够避免最活跃的虚假共享:
When multiple threads make simultaneous requests for memory, the requests will always be satisfied from different superblocks, avoiding actively induced false sharing.
存在这样的可能性:当 super block 变得相对空时(由内部因素决定),它将可供另一个堆使用,这可能会导致被动错误共享,因为另一个线程可能仍保留对 super block 的引用。然而,考虑到 super block 的大小,他们发现这在实践中并不常见:
Further, we have observed that in practice, superblocks released to the global heap are often completely empty, eliminating the possibility of false sharing.
Hoard 通过一种相当常见的分配器策略来处理碎片,该策略是池化公共(public)分配大小并合并释放空间。
关于c++ - 囤积内存分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204354/