我对/ 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);
}
$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
在这里我发现pss等于Private_Dirty,但我想知道为什么。
顺便说一下:smaps
是否有详细的文件?
答案 0 :(得分:31)
引自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
这些行中的第一行显示的信息与显示的信息相同 用于 / proc / PID / maps 中的映射。其余行显示大小 映射(大小),当前映射的数量 驻留在RAM( RSS )中,进程'此映射的比例分配 ( PSS ),映射中干净和脏的私有页面的数量。 请注意,即使页面是 MAP_SHARED 映射的一部分,但也有 只有一个pte映射,即目前只有一个进程使用, 被视为私人而非共享。 “引用”表示 当前标记为引用或访问的内存量。 “匿名”显示不属于任何内存的内存量 文件。即使与文件关联的映射也可能包含匿名 页面:当 MAP_PRIVATE 并修改页面时,文件页面为 由私人匿名副本取代。 “交换”显示了多少 也可以使用匿名内存,但在交换时使用。
Unix and Linux
Stackexchange上的This Question涵盖了几乎所有主题。请参阅Mat的优秀答案,这肯定会清除您的所有疑虑。