Когда вы mmap файл, Linux создает записи в MMU (блок управления памятью). MMU наблюдает за всеми чтениями и записью процессора в реальную ОЗУ. Таким образом, он знает, когда вы получаете доступ к частям памяти, возвращаемой mmap()
. Чтение деталей, которые еще не находятся в реальной ОЗУ, вызовет ошибки страницы. MMU поймает их и вызовет подпрограмму ядра, чтобы загрузить нужную часть файла в ОЗУ где-нибудь, а затем обновит запись в таблице MMU, чтобы оказалось, что данные теперь расположены по адресу, который вам дал mmap()
. Фактически, это будет где-то еще, но MMU сделает это полностью прозрачным.
Когда вы записываете в память, MMU будет отмечать измененные страницы как «грязные». Когда они выгружаются (поскольку вы получаете доступ к большему количеству файла или из-за того, что вы вызываете munmap()
), изменения будут записаны на диск.
Таким образом, каждый раз, когда происходит ошибка страницы и происходит загрязнение страницы, происходит системный вызов.Но так как страницы 4 или 8 КБ, это случается редко. Кроме того, ядро будет загружать более одной страницы за раз, поэтому количество системных вызовов снова уменьшается. Наконец, тот же код используется для реализации swapping, поэтому он очень оптимизирован.
Все эти эффекты делают mmap настолько эффективным.
Указатель находится в виртуальном адресном пространстве, которое отображается в фактический файл. теперь выполнение чтения и записи в память, на которую указывает этот указатель, не требует системного вызова. это то, что вы говорите –
@iamrothitanga: Я говорю, что функция отображает файл в пространство памяти вызывающего процесса и возвращает указатель на начало блока памяти. Например, если у вас есть два разных процесса, сопоставьте один и тот же файл с флагом MAP_SHARED, тогда каждый процесс будет получать доступ к одной и той же физической памяти, но эта память может быть отображена в другом месте в пространстве виртуальной памяти каждого процесса, то есть указатели возвращенный mmap в пространстве виртуальной памяти каждого процесса, может быть неравным. –
Кстати, почему этот комментарий был отмечен? –