为什么我的程序的常驻集大小 (RSS) 大于可执行文件?

Why is the resident set size (RSS) of my program larger than the executable?

运行 一个在 while 循环中简单等待的简单程序,我很想知道该进程的内存统计信息。我是运行的程序如下

#include<stdio.h>

int main()
{
    while(1)
    {
    }
return 0;
}

以上程序编译后生成一个 7950 字节(约 2 页)的可执行文件。但是 /proc/pid/statm 给出的 rss 大小为 72 页?任何人都可以在这里提供一些见解吗?

此致, 梅拉吉

当程序 运行 时,除了可执行文件中的代码和数据段之外,更多的东西需要驻留在内存中。例如,它可能还具有来自堆栈、堆、共享库和文件映射的常驻内存页面。

如果您想了解常驻页面的使用情况,您可以查看 /proc/<pid>/smaps——特别是 Rss: 字段。

/proc/<pid>/maps(无 's')将为您提供更具可读性的流程映射概览。请注意,例如堆栈(或在有许多线程的情况下为堆栈)和堆也算作映射。

这是 cat /proc/self/maps 的一些示例输出(它将打印 cat 进程本身的映射)。我在右边添加了箭头(可能需要滚动)来解释一些不同的映射是什么。知道后,您可以查看 cat /proc/<pid>/smaps 以查看每个映射的驻留大小。

00400000-0040c000 r-xp 00000000 08:01 3409248            /bin/cat                            <- text (code) segment
0060b000-0060c000 r--p 0000b000 08:01 3409248            /bin/cat                            <- read-only data segment (for e.g. string literals)
0060c000-0060d000 rw-p 0000c000 08:01 3409248            /bin/cat                            <- read/write data segment
01d6a000-01d8b000 rw-p 00000000 00:00 0                  [heap]
7f23d2b5c000-7f23d3328000 r--p 00000000 08:01 8126750    /usr/lib/locale/locale-archive      <- memory-mapped file (actually, executables and
                                                                                                shared libraries are memory-mapped files too)
7f23d3328000-7f23d34e2000 r-xp 00000000 08:01 11155466   /lib/x86_64-linux-gnu/libc-2.19.so  ^
7f23d34e2000-7f23d36e1000 ---p 001ba000 08:01 11155466   /lib/x86_64-linux-gnu/libc-2.19.so  | Various mappings for
7f23d36e1000-7f23d36e5000 r--p 001b9000 08:01 11155466   /lib/x86_64-linux-gnu/libc-2.19.so  | glibc
7f23d36e5000-7f23d36e7000 rw-p 001bd000 08:01 11155466   /lib/x86_64-linux-gnu/libc-2.19.so  v
7f23d36e7000-7f23d36ec000 rw-p 00000000 00:00 0                                              <- Anonymous mapping (MAP_ANONYMOUS)
...
7fffbc234000-7fffbc255000 rw-p 00000000 00:00 0          [stack]
7fffbc3a1000-7fffbc3a3000 r-xp 00000000 00:00 0          [vdso]                              ^
7fffbc3a3000-7fffbc3a5000 r--p 00000000 00:00 0          [vvar]                              | Internal stuff related to how some
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0  [vsyscall]                          v system calls are implemented