Что означает pss в/proc/pid/smaps

Я сбивал с толку о столбце 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, но мне интересно, почему.

BTW: есть ли какая-либо подробная документация для smaps?

Ответ 1

Цитата из lwn.net

"Размер пропорционального набора" (PSS) процесса - это количество страниц он имеет в памяти, где каждая страница делится на количество процессов, совместно использующих его. Так что если процесс имеет 1000 страниц для себя, и 1000 совместно с одним другим процессом, его PSS будет 1500

От Документация ядра Linux,

/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. Остальные строки показывают размер (размер), количество отображаемого в настоящее время резидент в ОЗУ ( RSS), пропорциональная доля процесса этого сопоставления ( PSS), количество чистых и грязных личных страниц в сопоставлении. Обратите внимание, что даже страница, которая является частью сопоставления MAP_SHARED, но имеет только одно pte-отображение, то есть в настоящее время используется только одним процессом, учитывается как конфиденциальный, а не как общий. " Ссылка" указывает на объем памяти, отмеченный в настоящее время как ссылка или доступ. " Анонимный" показывает объем памяти, который не принадлежит ни одному файл. Даже отображение, связанное с файлом, может содержать анонимный страницы: когда MAP_PRIVATE и страница изменена, страница файла заменен частной анонимной копией. " Обмен" показывает, сколько также используется анонимная память, но на свопе.

Этот вопрос в Unix and Linux Stackexchange охватывает почти тему. См. Мат отличный ответ, который, несомненно, очистит все ваши сомнения.