Linux(或RedHat Linux)上的小块分配器,以避免内存碎片

时间:2010-03-10 08:16:14

标签: c++ linux memory-management

我知道有一个用户应用程序的分配器,而不是在HP-UX link text和Windows XP Low-fragmentation Heap上处理大量小块分配。在HP-UX上,可以调整分配器,在Windows XP上,它认为小于16 K的块大小。

我的问题是我找不到有关在Linux上运行的用户程序(实际上是RedHat Linux)的这种分配器的任何信息。如果有这样的分配器,我实际上想要找到它可以处理的最大块大小。

<小时/> 的更新
我找到了jemalloc(http://www.canonware.com/jemalloc/)。它处理小块,大块和大块:http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html#size_classes

4 个答案:

答案 0 :(得分:3)

作为独立于平台的解决方案,请尝试使用Boost.Pool库。它有pool接口,可以处理任何大小的块。您也可以使用满足标准分配器要求的pool_alloc

作为特定于平台的解决方案,您可以尝试使用glibc库中的mallopt函数。但据我所知,它对小块无益。

答案 1 :(得分:3)

Redhat Linux或任何基于Linux的发行版主要使用DL-Malloc(http://gee.cs.oswego.edu/dl/html/malloc.html)。

对于Kirill指出的用户应用程序,如果因为较小的块而更多碎片,则最好使用单独的内存分配器。

如果用户应用程序很小,您可以尝试使用C ++ placement new / delete,它可以覆盖默认的分配器模式。 (http://en.wikipedia.org/wiki/Placement_syntax

答案 2 :(得分:1)

这是一个通用的分配器,但Hoard heap声称对碎片有严格的限制[1]

超级块中的所有块都具有相同的大小 类。通过使用b的幂的大小类(其中b 大于1)并将请求的大小舍入到最接近的大小类,我们将最坏情况内部碎片限制在其中 一个块到b的因子。为了减少外部碎片, 我们回收完全空的超级块以供任何尺寸的重复使用 类。

Dunno,如果它会有所帮助,但它很容易尝试。

答案 3 :(得分:0)

TCMalloc:Thread-Caching Malloc

找到了一个很好的替代方案,默认的Linux分配器。