2013-09-09 4 views
2

Я понимаю, из mmap() internals, что ММАП чтения произведений - вызывает ошибку страницы - копирование файлов данных с диска на внутренний буфер ядра - отображающий буфер ядра в пространство пользователяММАПА и ядро ​​памяти

Мои вопросы :

  • Что происходит с отображением ядра в буфер? если он все еще существует, разве у нас нет проблемы с пользовательским приложением, получающим доступ к памяти ядра?
  • не может закончиться физическая память таким образом? Я предполагаю, что для ядра требуется минимальный объем физической памяти, чтобы обеспечить достойный уровень производительности, и если мы будем продолжать выделять его буферы в mmapped буфер пространства пользователя, у нас в конечном итоге закончились буферы.
  • Во время записи соответствующая память временно отображается в буфер ядра? если и это совместное сопоставление, другой пользовательский процесс может получить доступ и снова получить доступ к тому, что теперь является памятью ядра.

Спасибо, и извините, если эти вопросы довольно простые, но я не нашел четкого ответа.

+0

Вы прочитали man-страницу [mmap (2)] (http://man7.org/linux/man-pages/man2/mmap.2.html)? Есть несколько случаев ... И это в основном о [виртуальной памяти] (http://en.wikipedia.org/wiki/Virtual_memory), а не о физической физической памяти. –

ответ

0

Я не хакер ядра любых средств, но это то, что я собрал:

  • Я не совсем уверен, что, когда дело доходит до вопроса о том, «слагает» ядро ​​его сопоставление с физической памятью, поскольку ядро ​​может получить доступ к любой физической памяти, которая им нравится. Тем не менее, очевидно, было бы недопустимым, чтобы ядро ​​продолжало использовать эту физическую память для своих целей (например, как внутренний буфер буфера), если пользовательские процессы также могут получить доступ к этой памяти, ради как пользовательского процесса, так и ради ядра. Ядро будет просто обозначать эти страницы как часть кеша файловой системы (если поддерживается файлом), а не с ними.
  • Да, в той же мере, что любой процесс или количество процессов могут ограничить объем физической памяти, присутствующей в ядре, запрашивая множество ресурсов, таких как трубы. Тем не менее, ядро ​​отслеживает, сколько физической памяти доступно, и начнет выходить из памяти пользовательской памяти на диск, когда оставшаяся часть физической памяти будет работать на низком уровне. Сама память ядра обычно не должна выгружаться на диск по причинам, включая производительность. Хотя приятная вещь о mmap() ed памяти, поддерживаемая файлом, состоит в том, что для диска тривиально выходить на страницу; пространство подкачки не требуется.
  • Если вы имеете в виду запись в доступную память, отображаемую в виртуальное адресное пространство пользователя (то есть memcpy(), а не write()), нет. Весь смысл mmap() заключается в том, чтобы сопоставить виртуальное адресное пространство userland в физической памяти, чтобы разрешить чтение и запись, не прибегая к системным вызовам. Синхронизация с диском будет выполняться непосредственно ядром без дополнительного копирования на буферы ядра.