- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在阅读有关 Hoard 内存分配器的论文,一切都可以理解,但有一件事不是,它如何减少多线程分配或释放内存时引起的堆争用,避免内存可能引入的错误共享分配器,同时,它对碎片应用严格的界限。他们是如何实现的?
最佳答案
根据论文,Hoard 根据每个处理器堆 的要求在 super block 内部分配内存。当这些堆需要一个 super block 时,它们会向全局堆请求一个空 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 通过一种相当常见的分配器策略来处理碎片,该策略汇集常见的分配大小并合并释放的空间。
关于c++ - 囤积内存分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204354/
我是一名优秀的程序员,十分优秀!