2009-11-18 2 views
1

При отображении файла в память требуется системный вызов. Требуются ли последующие обращения к файлу системные вызовы или страница виртуальной памяти процесса, сопоставленная с фактическим кешем страницы в памяти?системный вызов памяти с отображением файлов - linux

обновление: Что я также хочу знать, так это то, что если несколько процессов получают доступ к одному и тому же файлу через mmap. они будут получать доступ к одной и той же физической части памяти.

ответ

3

Нет необходимости в дополнительных системных вызовов (по технологом), вы просто получить доступ к нему как обычный памяти. Когда вы закончите с файлом, просто позвоните munmap.

Возвращаемое значение

В случае успеха, mmap() возвращает указатель на сопоставленных области. При ошибке значение MAP_FAILED (это is, (void *) -1) возвращается, а errno устанавливается соответствующим образом. На успех, munmap() возвращается 0, Ошибка -1, и errno установлен (возможно - EINVAL).

See the man page here for details.

Edit Для уточнения:

Я говорю, что функция отображает файл в области памяти вызывающего процесса и возвращает указатель на начало блока памяти.

Например, если у вас есть два разных процесса, сопоставьте один и тот же файл с флагом MAP_SHARED, то каждый процесс будет получать доступ к одной и той же физической памяти, но эта память может быть отображена в другом месте в пространстве виртуальной памяти каждого процесса, т.е. указатели, возвращаемые mmap в пространстве виртуальной памяти каждого процесса, могут быть не равными.

Это доказывает, что если вы, например, должны хранить указатели внутри блока разделяемой памяти, эти указатели будут полезны только в том случае, если они были сохранены как смещения относительно начала блока/файла, и они могли бы только для удобного указания местоположений, внутренних для блока/файла.

+0

Указатель находится в виртуальном адресном пространстве, которое отображается в фактический файл. теперь выполнение чтения и записи в память, на которую указывает этот указатель, не требует системного вызова. это то, что вы говорите –

+0

@iamrothitanga: Я говорю, что функция отображает файл в пространство памяти вызывающего процесса и возвращает указатель на начало блока памяти. Например, если у вас есть два разных процесса, сопоставьте один и тот же файл с флагом MAP_SHARED, тогда каждый процесс будет получать доступ к одной и той же физической памяти, но эта память может быть отображена в другом месте в пространстве виртуальной памяти каждого процесса, то есть указатели возвращенный mmap в пространстве виртуальной памяти каждого процесса, может быть неравным. –

+0

Кстати, почему этот комментарий был отмечен? –

4

Когда вы mmap файл, Linux создает записи в MMU (блок управления памятью). MMU наблюдает за всеми чтениями и записью процессора в реальную ОЗУ. Таким образом, он знает, когда вы получаете доступ к частям памяти, возвращаемой mmap(). Чтение деталей, которые еще не находятся в реальной ОЗУ, вызовет ошибки страницы. MMU поймает их и вызовет подпрограмму ядра, чтобы загрузить нужную часть файла в ОЗУ где-нибудь, а затем обновит запись в таблице MMU, чтобы оказалось, что данные теперь расположены по адресу, который вам дал mmap(). Фактически, это будет где-то еще, но MMU сделает это полностью прозрачным.

Когда вы записываете в память, MMU будет отмечать измененные страницы как «грязные». Когда они выгружаются (поскольку вы получаете доступ к большему количеству файла или из-за того, что вы вызываете munmap()), изменения будут записаны на диск.

Таким образом, каждый раз, когда происходит ошибка страницы и происходит загрязнение страницы, происходит системный вызов.Но так как страницы 4 или 8 КБ, это случается редко. Кроме того, ядро ​​будет загружать более одной страницы за раз, поэтому количество системных вызовов снова уменьшается. Наконец, тот же код используется для реализации swapping, поэтому он очень оптимизирован.

Все эти эффекты делают mmap настолько эффективным.

+0

, если несколько процессов получают доступ к файлу через mmap. то они получают доступ к тем же битам в физической памяти. без системных вызовов. их записи в таблице страниц отмечены как грязные и .... это то, что я понимаю из вашего ответа. –

+0

Различные процессы могут совместно использовать одну и ту же память. У вас может быть общий доступ, поэтому записи одним процессом будут видны другими процессами, или вы можете использовать copy-on-write, где процесс получает отдельную копию страницы, как только они начнут писать на нее. –

Смежные вопросы