c++ - 囤积内存分配器

标签 c++ c memory memory-management

Hoard memory allocator

我正在阅读有关 Hoard 内存分配器的论文,一切都是可以理解的,但有一件事不是,它如何减少多线程分配或释放内存时引起的堆争用,避免内存可能引入的错误共享分配器,同时,它对碎片应用严格的限制。他们是如何实现这一目标的?

enter image description here

最佳答案

根据论文,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/

相关文章:

c++ - Qt 并发与信号和槽

c++ - 将字符串列表输出到 ostream

c++ - 严格的别名和内存对齐

c++ - 路径如何存储在这种结构中,以及如何将其转换为其他结构?

c++ - cocos2dx Action 错误: liquid, wave3d和lens3d

c++ - 用于访问多态类型的 std::visit-like 函数

用c89编译

java - Java中如何确定对象的大小

memory - htop 显示即使调用了 deallocate 内存仍然在使用

C++ std::make_shared 内存泄漏