我运行以下简单程序
#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
htop
和pmap
显示相同的虚拟大小(36684),但它们显示物理记忆的不同内容(htop
的RES
= 321和pmap
的RSS
= 432)。
也许我混淆了一些东西,但htop
的RES
和pmap
的RSS
之间有什么区别吗?
因此,从顶部的手册页我们看到:
q:RES - 居民人数(kb) 任务使用的非交换物理内存。
对于pmap:
RSS:驻留集大小,以千字节为单位
所以他们似乎是一回事。但实际上,如果你也用ps检查,你会发现htop会显示与ps的RSS相同的RES。问题是ps在男人中提到这个节目的测量结果有点不同:
SIZE和RSS字段不计算进程的某些部分,包括页表,内核堆栈,struct thread_info和struct task_struct。这通常是至少20 KiB的内存总是驻留的。 SIZE是进程的虚拟大小(代码+数据+堆栈)。
这就是ps和pmap之间的区别,对于htop和pmap来说实际上是相同的。