2011-12-14 3 views
13

Скажем, я выделяю большую память (40 МБ) с помощью mmap с использованием/dev/zero следующим образом.mmap с/dev/zero

fd = open("/dev/zero", O_RDWR); 
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0); 

Я понимаю, что ядро ​​будет инициализировать память до нуля, как страницы вовлекаются в физической памяти (я предполагаю, что современные ядра Linux используют Demand подкачки). Например, когда первая страница затрагивается и, следовательно, попадает в физическую память, ядро ​​будет инициализировать все свои 4096 байт до нуля, а затем, когда вторая страница будет затронута, она сделает то же самое и так далее.

Правильно ли я понимаю?

+2

Короткий ответ: Да – hirschhornsalz

+0

До тех пор, пока касание означает запись, да. В противном случае, если вы просто читаете с нулевой страницы, на самом деле есть одна нулевая страница, которая будет называться COW'ed при первой записи. – ninjalj

+0

Это не удастся на Android 5.0, потому что SELinux заблокирует такую ​​странность. Вот почему Inkscape в chroot не запускается на Android. – pelya

ответ

11

Да, еще больше страниц создаются только в том случае, если вы впервые касаетесь их.

BTW, есть флаг MAP_ANONYMOUS, который вы можете использовать в этой ситуации, нет необходимости открывать дескриптор файла на /dev/null.

+0

MAP_ANONYMOUS также делает память 0? Что делать, если я не хочу, чтобы память была равна нулю, чтобы избежать накладных расходов на инициализацию памяти до нуля? Что мне тогда использовать? – MetallicPriest

+6

@MetallicPriest Nothing. Любая неинициализированная не-файловая память, которая является потенциальной утечкой содержимого какого-либо другого процесса или памяти ядра. – ephemient

+3

Используйте/dev/urandom вместо/dev/zero, если вы не хотите, чтобы пространство заполнялось нулями? :) Ядро не имеет бизнеса, дающего вам память, которая может содержать остатки от чужой программы, работающей в одной и той же памяти, - это риск для безопасности. –