【问题标题】:Hoard memory allocator囤积内存分配器
【发布时间】:2012-03-01 12:56:53
【问题描述】:

Hoard memory allocator

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

【问题讨论】:

  • 为什么不放弃线程并使用事件驱动编程呢?至少对于单进程程序来说,锁争用不会成为问题,因此您可能可以在没有那么大的锁定问题的 8 核机器上运行它。此外,如果您实现自己的空闲列表,例如 tcmalloc,它将成为您的程序有史以来最快的内存分配器。
  • 问题是我正在使用多堆分配(为每个线程分配一个堆),因此使用事件驱动编程不会像上述方法那样令人满意。

标签: c++ c memory memory-management


【解决方案1】:

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

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

当多个线程同时请求内存时,总是会从不同的超级块中满足请求,避免主动诱导虚假共享。

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

此外,我们观察到,在实践中,释放到全局堆的超级块通常是完全空的,从而消除了虚假共享的可能性。

Hoard 通过一种相当常见的分配器策略来处理碎片,即池化常见的分配大小并合并释放的空间。

【讨论】:

  • 但是使用的内存往往在当前使用的总内存的一小部分范围内变化,而且这个数量经常稳定增长,所以他们到底是如何实现 Hoard 没有争议的,并且在某些情况下低竞争?我可以说,这有点模糊。
  • 它有争用,只是它通过使用不同堆的线程来缓解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多