1. ホーム
  2. linux

[解決済み] proc/pid/smaps の pss とは?

2022-03-01 01:30:32

質問

について混乱しました。 Pss の列を /proc/pid/smaps ということで、試しにプログラムを書いてみました。

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 ?

解決方法は?

引用元 lwn.net

<ブロッククオート

プロセスのプロポーショナルセットサイズ(PSS)は、プロセスのページ数のことです。 各ページをメモリに登録されている数で割ったものです。 プロセスで共有されます。つまり、あるプロセスが1000ページを独り占めしている場合。 で、1000を他のプロセスと共有している場合、そのPSSは1500になります。

から Linux Kernel ドキュメント ,

/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 マッピングを使用しているが のみがマッピングされている、つまり、現在1つのプロセスによってのみ使用されている。 はプライベートとして計上され、共有とはなりません。 参照先 を示します。 現在、参照またはアクセスされているとマークされているメモリの量。 "です。 匿名希望 は、どのメモリにも属さないメモリの量を示しています。 ファイルを作成します。 ファイルに関連付けられているマッピングにも、匿名の ページです。 MAP_PRIVATE で、ページが変更されると、そのファイルのページが は匿名のプライベートコピーに置き換わります。 スワップ を表示します。 のメモリも使用されていますが、スワップされています。

この質問 について Unix and Linux Stackexchangeはほぼこのトピックをカバーしています。Matの素晴らしい回答は、きっとあなたの疑問をすべて解決してくれることでしょう。