linux - 如何计算进程中可用的 "Max Contiguous Free Space"?

标签 linux memory x86-64

在我的64 位 linux-rhel62 机器中,我想计算进程中可用的“最大连续可用空间”。 似乎可以使用/proc/self/maps 计算详细信息。但我不知道如何使用该文件来计算连续的可用空间。

知道怎么做吗?

我遵循了 Linux: how to check the largest contiguous address range available to a process 中给出的 perl 脚本

但我得到的输出为“18446603339772190720”,这是 Not Acceptable 值,(但我知道这与 2^64 有某种关系)。但是用户不接受这个值?这是正确的预期输出吗? 一些旧代码将“物理内存 + 交换大小”显示为最大连续可用空间。但我也不相信这一点,因为我每次都得到相同的输出。

请告诉我,为什么我们会得到像可用空间这样不可能的内存大小? 给我一些提示,如何找到可用的最大连续可用空间?

最佳答案

那个 perl 脚本正在查看

/proc/<pid>/maps

如果您在 Red Hat 上查看流程图的末尾,您会看到类似这样的内容:

7fff105a1000-7fff105a2000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

我能够通过忽略最后一个条目让 perl 脚本给出合理的答案,我修改它以在地址大于 0x800000000000 时退出循环

while (<$maps>) {
        /([0-9a-f]+)-([0-9a-f]+)/;
        last if hex ($1) > hex ( "800000000000" );
        $max = hex ($1) - $end if $max < hex ($1) - $end;
        $end = hex ($2);
}

关于linux - 如何计算进程中可用的 "Max Contiguous Free Space"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22863281/

相关文章:

C、free() 上的内存损坏(快速)错误

c - 分配给字符串数组的内存量?

assembly - 为什么 8 位 MUL 组合成 AX,但 16 位和 32 位 MUL 将结果拆分为 [E]DX :[E]AX?

linux - 已安装的 glib 未列在已安装的软件包下

linux - arm-eabi-gcc : cannot find entry symbol _start

php - 存储后是否必须释放 mysql 结果?

x86 - i386 中的哪个寄存器存储 CPL?

c - posix_memalign 与 mmap 有何不同

已编译的 Vala 应用无法运行 - Elementary OS

linux - 对多个文件调用 Stat - Linux