системный вызов файлов с отображением памяти - linux

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

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


person Rohit Banga    schedule 18.11.2009    source источник


Ответы (2)


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

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

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

Подробную информацию см. на странице руководства здесь.

Изменить для пояснения:

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

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

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

person Robert S. Barnes    schedule 18.11.2009
comment
указатель находится в виртуальном адресном пространстве, которое отображается на фактический файл. теперь выполнение чтения и записи в память, на которую указывает этот указатель, не требует системного вызова. Это то, что вы имеете в виду - person Rohit Banga; 18.11.2009
comment
@iamrothitanga: я говорю, что функция отображает файл в пространство памяти вызывающего процесса и возвращает указатель на начало блока памяти. Например, если у вас есть два разных процесса, отображающих один и тот же файл с флагом MAP_SHARED, тогда каждый процесс будет обращаться к одной и той же физической памяти, но эта память может отображаться в другом месте в пространстве виртуальной памяти каждого процесса, то есть указатели, возвращаемые функцией mmap в пространстве виртуальной памяти каждого процесса может не совпадать. - person Robert S. Barnes; 18.11.2009

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

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

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

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

person Aaron Digulla    schedule 18.11.2009
comment
если несколько процессов обращаются к файлу через mmap. тогда они обращаются к одним и тем же битам в физической памяти. без системных вызовов. их записи в таблице страниц помечены как грязные и .... это то, что я понял из вашего ответа - person Rohit Banga; 18.11.2009
comment
Разные процессы могут использовать одну и ту же память. У вас может быть общий доступ, чтобы записи одного процесса были видны другим процессам, или вы можете использовать копирование при записи, когда процесс получает отдельную копию страницы, как только они начинают писать на нее. - person Aaron Digulla; 18.11.2009