Linux堆碎片

时间:2014-05-25 08:59:13

标签: c linux malloc dynamic-memory-allocation heap-fragmentation

我有一个问题一直困扰着我。

在Windows调试器中,有!heap -s命令输出虚拟内存的堆状态,并使用以下公式计算外部碎片:

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

linux中是否有类似的方法输出计算效果所需的统计数据?

现在长篇大论: 我有一个C应用程序,使用malloc和free分配和释放不同大小的空间,每个分配具有不同的生命周期。 我使用的平台是Lubuntu,因此ptmalloc2算法是默认的。

我知道这些分配是在虚拟用户空间堆中提供的(除了大于128Kb的那些,分配器使用mmap),并且在实际访问时映射到物理页面。 大多数分配的大小<1。 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的大小。 如何在堆中“遍历”并收集这些统计信息?

提前谢谢大家。

1 个答案:

答案 0 :(得分:0)

我认为这取决于您使用的分配器。也就是说,对于您正在使用的 malloc (等)和 free 实现,您可能需要不同的策略。如果实现没有提供您寻求的信息作为扩展,您可能必须阅读其源代码并键入您自己的逻辑来检查分配状态。

我相信页面到交换空间和物理RAM的映射处于较低的水平,因此不会特别帮助您实现目标。 malloc (等)和免费实施可能会或可能不会关心那些较低级别的细节。

如果您确定使用 ptmalloc2 ,是否可以找到其源代码?

相关问题