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

时间:2015-03-18 09:52:58

标签: c unix memory-management

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

#include<stdio.h>

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

编译时,上述程序生成7950字节的可执行文件(约2页)。但是/proc/pid/statm将rss大小设为72页?谁能在这里提供一些见解?

此致 Meraj

1 个答案:

答案 0 :(得分:2)

在程序运行时,需要将更多内容驻留在内存中,而不仅仅是可执行文件中的代码和数据段。例如,它可能还有来自堆栈,堆,共享库和文件映射的驻留内存页。

如果您想查看驻留页面的使用方式,可以查看/proc/<pid>/smaps - 特别是 Rss:字段。

/proc/<pid>/maps(没有&#39; s&#39;)将为您提供更易读的流程映射概述。请注意,例如堆栈(或多个线程的堆栈)和堆计数也是映射。

这是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