14

我运行以下简单程序

#include <stdio.h>
#include <stdlib.h>    
int
main() {
  malloc(1024*1024*32);
  getchar();
  return 0;
}

htop给了这个

VIRT   RES   SHR
36684  312   240

pmap -x给了这个

Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000       0       4       0 r-x--  a.out
0000000000600000       0       4       4 r----  a.out
0000000000601000       0       4       4 rw---  a.out
00007f063d3b7000       0       4       4 rw---    [ anon ]
00007f063f3b8000       0     228       0 r-x--  libc-2.12.1.so
00007f063f532000       0       0       0 -----  libc-2.12.1.so
00007f063f731000       0      16      16 r----  libc-2.12.1.so
00007f063f735000       0       4       4 rw---  libc-2.12.1.so
00007f063f736000       0      12      12 rw---    [ anon ]
00007f063f73b000       0     108       0 r-x--  ld-2.12.1.so
00007f063f93d000       0      12      12 rw---    [ anon ]
00007f063f958000       0       8       8 rw---    [ anon ]
00007f063f95b000       0       4       4 r----  ld-2.12.1.so
00007f063f95c000       0       4       4 rw---  ld-2.12.1.so
00007f063f95d000       0       4       4 rw---    [ anon ]
00007fff4b298000       0      12      12 rw---    [ stack ]
00007fff4b2d7000       0       4       0 r-x--    [ anon ]
ffffffffff600000       0       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB           36684     432      88

htoppmap显示相同的虚拟大小(36684),但它们显示物理内存的不同内容(htop's RES= 321 和pmap's RSS= 432)。

htop也许我混淆了一些东西,但'sRESpmap's之间有什么区别RSS吗?

4

1 回答 1

3

因此,从顶部的手册页中,我们看到:

q: RES -- 驻留大小 (kb)
任务已使用的非交换物理内存。

对于 pmap:

RSS:以千字节为单位的常驻集大小

所以他们似乎是同一件事。但实际上,如果您还检查 ps,您会看到 htop 将显示与 ps 的 RSS 相同的 RES。问题是 ps 在 man 中提到他们显示的测量值有点不同:

SIZE 和 RSS 字段不计算进程的某些部分,包括页表、内核堆栈、struct thread_info 和 struct task_struct。这通常是始终驻留的至少 20 KiB 内存。SIZE 是进程的虚拟大小(代码+数据+堆栈)。

这就是 ps 和 pmap 之间的区别,而 htop 和 pmap 实际上是一样的。

于 2018-09-07T11:50:01.557 回答