囤积内存分配器

囤积内存分配器

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

在此处输入图像描述

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

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

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

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

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

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