C Linux堆碎片

C Linux堆碎片,c,linux,malloc,dynamic-memory-allocation,heap-fragmentation,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,因此默认为ptmalloc

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

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

External fragmentation = 1 - (larget free block / total free size)
linux中是否有类似的方法输出计算效果所需的统计数据

长话短说: 我有一个C应用程序,它使用malloc和free不断分配和释放不同大小的空间,每个分配都有不同的生命周期。 我使用的平台是Lubuntu,因此默认为
ptmalloc2
算法

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

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

然而,我主要关心的是如何找出外部碎片。 我知道
/proc/[pid]/smap
堆大小和
pmap-d[pid]anon
统计数据,但我发现很难从外部碎片的角度来解释它们

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

我知道
\uuuuMalloc\uuuhook
现在已经被弃用了,我真的不想依赖实现特定的统计信息,比如
malloc\u stats()
mallinfo()
。然而,如果你有任何建议使用这两个请让我知道

我可以看出,外部碎片问题是当请求无法满足时,因为堆中没有连续的空间,但请求的总大小分散在该区域周围

我还没有弄清楚,如何获得所需的统计数据,以便计算出这种影响。例如,不同的公式说明我必须捕获
活动内存
,或者获取
总空闲页面
,或者获取
最大空闲块的大小
。 我如何使用函数“遍历”堆并收集这些统计数据


提前谢谢大家

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

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


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

我不知道您的问题的答案,但如果这是一个问题,也许您可以使用malloc从系统中获取一大块数据,并为您的数据创建一个更专门的分配器。