上周我有个问题一直困扰着我。
在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的大小。
我怎样才能有一个函数来“遍历”堆并收集这些统计数据?
提前谢谢大家。

最佳答案

我相信这将取决于您使用的分配器。也就是说,对于您正在使用的malloc(等)和free实现,您可能需要不同的策略。如果实现没有提供作为扩展所需的信息,则可能需要读取其源代码并键入自己的逻辑来检查分配状态。
我相信页面到交换空间和物理ram的映射在一个较低的级别上,因此对您的目标没有特别的帮助。malloc(等)和free实现可能关心也可能不关心那些较低级别的细节。
如果您确定您正在使用ptmalloc2,那么您能够找到它的源代码吗?

关于c - Linux堆碎片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23853619/

10-12 14:27