2

我有一个问题,一直困扰着我上周。Linux堆碎片

在Windows调试存在!heap -s命令输出该虚拟存储器的堆状态,并使用下列公式计算所述外部碎片:

External fragmentation = 1 - (larget free block/total free size) 

是否有在Linux的相似方法,其输出以计算所需要的那些统计效果如何?

长篇大论现在: 我有一个C应用程序,它使用malloc和free来保持不同大小的空间的分配和释放,每个分配的寿命不同。 我使用的平台是Lubuntu,所以ptmalloc2算法是默认的。

我知道这些分配是在虚拟用户空间堆(除了那些大于128Kb,分配器使用mmap),并在实际访问时映射到物理页面。 大部分分配的大小为< 80字节,所以它们来自FastBins。

使用ValgrindMassif我可以得到内部碎片,因为它报告用于每个分配的额外字节。

但是,我主要关心的是如何弄清楚外部碎片。 我知道/proc/[pid]/smaps堆大小和pmap-d[pid] anon统计信息,但我发现很难从外部碎片解释它们。

我也知道LD_PRELOAD,我可以动态连接/lib/i386-linux-gnu/libmemusage.so。该库输出堆总数,峰值和所请求分配大小的分布。

我知道__malloc__hook现在已经被弃用了,我并不想依靠特定的实施统计,如malloc_stats()mallinfo()。但是,如果您有任何建议使用这两个请让我知道。

我可以告诉外部碎片问题,当请求不能满足时,因为堆中没有连续的空间,但所请求的总大小分散在该区域周围。

我还没有想出,如何获得所需的统计数据,以便我可以计算出这种影响。例如不同的公式,说明我必须捕获live_memory或获得total_free_pages,或获得largest_free_block的大小。 我如何能够通过堆“遍历”并收集这些统计信息?

谢谢大家提前。

+0

我不知道回答你的问题,但如果这是一个问题,也许你可以使用malloc来从系统得到一大块,并为你特别的数据更专业的分配器。 – GRAYgoose124

回答

0

我相信这将取决于您正在使用的分配器。也就是说,您可能需要采用与您正在使用的实施方案不同的策略,其中包括您所使用的任何实施方案的malloc(等)和免费。如果实现不提供您寻求扩展的信息,您可能需要阅读它的源代码并输入自己的逻辑来检查分配状态。

相信的页面映射到交换空间和物理内存是在一个较低的水平,因此不会特别帮助你在你的目标。实施可能会或可能不会关心这些较低级别的细节。

如果您确定您正在使用ptmalloc2,您能找到它的源代码吗?