囤积内存分配器

时间:2012-02-09 01:50:00

标签: c++ c memory memory-management

Hoard memory allocator

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

enter image description here

1 个答案:

答案 0 :(得分:4)

在论文中,Hoard根据每处理器堆的要求在超级块内部分配内存。当这些堆需要超级块时,它们会向全局堆请求空的堆。由于超级块完全由每个处理器堆释放,因此它们被释放到全局堆中以便在其他地方重用,从而限制分配的内存。

就线程争用而言,超级块一次只能在一个每处理器堆中使用。然后,Hoard只能将内存从一个超级块提供给一个线程。使用此策略,Hoard能够避免最活跃的错误共享:

  

当多个线程同时发出内存请求时,请求将始终从不同的超级块中得到满足,从而避免主动诱导错误共享。

当超级块变得相对空(由内部因素确定)时,它可能会被另一个堆使用,这可能导致被动的错误共享,因为另一个线程仍然可以保留对超级块的引用。但是,考虑到超级块的大小,他们没有发现这在实践中很常见:

  

此外,我们观察到实际上,发布到全局堆的超级块通常是完全空的,从而消除了错误共享的可能性。

Hoard通过相当常见的分配器策略来处理碎片,这种策略汇集了公共分配大小并合并了释放的空间。