(linux) нединамический массив структур использует память Rss при использовании memset; Зачем?

вот мой код

struct test oops[4][2][3][40960];  // global struct (maybe .data section)
...
{
...
//memset(oops, 0, sizeof(struct test) * 40960 * 3 * 2 * 4);
...
}

есть вопрос.

когда я использую memset,

кот /proc/PID/smaps

...
Size:             756480 kB
Rss:              721208 kB
Pss:              721208 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:    721208 kB
Referenced:       361252 kB
Anonymous:        721208 kB
AnonHugePages:      6144 kB
Swap:              35272 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
...

но не использовать memset

Size:             756480 kB
Rss:                2048 kB
Pss:                2048 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      2048 kB
Referenced:         2048 kB
Anonymous:          2048 kB
AnonHugePages:      2048 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

почему memset использует RSS?

и что значит Pss, Private_dirty, Referenced, Anonymous?

глобальная структура может быть установлена ​​​​'0', но я хочу явную инициализацию.

помогите мне, спасибо.


person Jaeyeon Baek    schedule 18.11.2015    source источник


Ответы (1)


Без memset вы никогда не будете использовать память, на которую ссылается «oops». Ядро Linux не резервирует для вас страницы памяти до тех пор, пока вы не получите доступ к памяти в первый раз.

Размер — это весь «доступный» размер памяти для вашей программы. RSS — это реально существующая память в вашей программе (это не означает, что сумма всех RSS — это общая используемая память). RSS также учитывает общую память).

memset касается каждого байта в вашем массиве, что заставляет ядро ​​резервировать память для вас и помещать ее в раздел RSS.

memset не резервирует больше памяти, он просто использовал ее в первый раз.

Дополнительная информация: Получение информации о процессе ' использование памяти из /proc/pid/smaps

person mknjc    schedule 18.11.2015
comment
Я могу без доступа к memset ой, ex) oops[0][1][2][5].test = 1; это успех... (и тогда smaps без memset тот же самый) что разные положить его в раздел RSS, или не в - person Jaeyeon Baek; 18.11.2015