$ pmap -x 10400
10400: ./a.out
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 0 0 0 r-x-- a.out
0000000000600000 0 4 4 r---- a.out
0000000000601000 0 4 4 rw--- a.out
00007f957085f000 0 4 0 r-x-- libc-2.15.so
00007f9570a12000 0 0 0 ----- libc-2.15.so
00007f9570c11000 0 16 16 r---- libc-2.15.so
00007f9570c15000 0 8 8 rw--- libc-2.15.so
00007f9570c17000 0 8 8 rw--- [ anon ]
00007f9570c1c000 0 0 0 r-x-- ld-2.15.so
00007f9570e1f000 0 12 12 rw--- [ anon ]
00007f9570e3c000 0 8 8 rw--- [ anon ]
00007f9570e3e000 0 4 4 r---- ld-2.15.so
00007f9570e3f000 0 8 8 rw--- ld-2.15.so
00007fff18a6d000 0 12 12 rw--- [ stack ]
00007fff18bff000 0 4 0 r-x-- [ anon ]
ffffffffff600000 0 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 4148 92 84
RSS 是 92
$ ps -o rss,sz,vsz 10400
RSS SZ VSZ
80 1037 4148
RSS 是 80
为什么以及发生了什么?
答案1
从 ps 的手册页:
The SIZE and RSS fields don’t count some parts of a process including
the page tables, kernel stack, struct thread_info, and struct
task_struct. This is usually at least 20 KiB of memory that is always
resident. SIZE is the virtual size of the process (code+data+stack).
答案2
基本上可能会发生这种情况,因为它们使用不同的数据源: - /proc/PID/maps 由 pmap 使用 - /proc/PID/stat 由 ps 使用
这些来源包含使用不同方法计算的数据(据报道,请参阅这里, 例如)。