为什么我的程序的常驻集大小 (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
运行 一个在 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