2

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

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

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

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

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

我知道这些分配是在虚拟用户空间堆中提供的(分配器使用的那些大于 128Kb 的分配mmap除外),并且在实际访问时映射到物理页面。大多数分配的大小小于 80 字节,因此它们由 FastBins 提供。

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

但是,我主要关心的是如何找出外部碎片。我知道/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. 我怎样才能有一个函数来“遍历”堆并收集这些统计信息?

提前谢谢大家。

4

1 回答 1

0

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

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

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

于 2014-08-15T13:48:15.447 回答