mmap с /dev/zero
Скажем, я выделяю большую память (40 МБ) с помощью mmap, используя /dev/zero следующим образом.
fd = open("/dev/zero", O_RDWR);
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0);
Что я понимаю, так это то, что ядро инициализирует память до нуля, когда страницы переносятся в физическую память (я полагаю, что современные ядра Linux используют пейджинг по требованию). Так, например, когда первая страница затрагивается и, следовательно, заносится в физическую память, ядро инициализирует все свои 4096 байтов до нуля, затем при касании второй страницы делает то же самое и так далее.
Правильно ли мое понимание?
2 ответа
Да, даже больше страниц появятся, только если вы прикоснетесь к ним в первый раз.
Кстати, есть флаг MAP_ANONYMOUS
что вы можете использовать в этой ситуации, нет необходимости открывать файловый дескриптор на /dev/null
,
И mmap /dev/zero, и ANONYMOUS не имеют резервных копий файлов, а также обнуляют содержимое. Посмотрите на следующую ссылку http://man7.org/linux/man-pages/man2/mmap.2.html