C Linux堆碎片
上周我一直有个问题困扰着我 在Windows调试器中有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
!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从系统中获取一大块数据,并为您的数据创建一个更专门的分配器。