cam*_*ino 18 linux memory-management linux-kernel
我对/ proc/pid/smaps中的pss列感到困惑,所以我写了一个程序来测试它:
void sa();
int main(int argc,char *argv[])
{
int fd;
sa();
sleep(1000);
}
void sa()
{
char *pi=new char[1024*1024*10];
for(int i=0;i<4;++i) {
for(int j=0;j<1024*1024;++j){
*pi='o';
pi++;
}
}
int cnt;
for(int i=0;i<6;++i) {
for(int j=0;j<1024*1024;++j){
cnt+=*pi;
pi++;
}
}
printf("%d",cnt);
}
Run Code Online (Sandbox Code Playgroud)
$cat /proc/`pidof testprogram`/smaps
08838000-0885b000 rw-p 00000000 00:00 0 [heap]
Size: 140 kB
Rss: 12 kB
Pss: 12 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 12 kB
Referenced: 12 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
b6dcd000-b77d0000 rw-p 00000000 00:00 0
Size: 10252 kB
Rss: 10252 kB
Pss: 4108 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4108 kB
Referenced: 4108 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Run Code Online (Sandbox Code Playgroud)
在这里我发现pss等于Private_Dirty,但我想知道为什么.
顺便说一句:有没有详细的文件smaps?
Pav*_*ath 33
引自lwn.net
进程的"比例集大小"(PSS)是它在内存中的页数,其中每个页面除以共享它的进程数.因此,如果一个进程拥有1000个页面,并且1000个页面与另一个进程共享,则其PSS将为1500
这/proc/PID/smaps是一个基于地图的扩展,显示了每个进程映射的内存消耗.对于每个映射,都有一系列行,如下所示:
08048000-080bc000 r-xp 00000000 03:02 13130 /bin/bash
Size: 1084 kB
Rss: 892 kB
Pss: 374 kB
Shared_Clean: 892 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 892 kB
Anonymous: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 374 kB
Run Code Online (Sandbox Code Playgroud)
这些行中的第一行显示的信息与/ proc/PID/maps中的映射相同.其余行显示映射的大小(大小),当前驻留在RAM(RSS)中的映射量,进程'此映射的比例份额(PSS),清除和脏的私有页面的数量.映射.请注意,即使是作为MAP_SHARED映射的一部分但仅映射了单个pte的页面,即当前仅由一个进程使用的页面,也被视为私有而不是共享." Referenced "表示当前标记为引用或访问的内存量." 匿名 "显示不属于任何文件的内存量.即使与文件关联的映射也可能包含匿名页面:当MAP_PRIVATE和页面被修改时,文件页面将被私有匿名副本替换." 交换 "显示了还将使用多少可能是匿名的内存,但是在交换时.
Unix and LinuxStackexchange 上的这个问题几乎涵盖了这个主题.请参阅Mat的优秀答案,这肯定会清除您的所有疑虑.
| 归档时间: |
|
| 查看次数: |
36673 次 |
| 最近记录: |