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

StackOverflow https://stackoverflow.com/questions/1754451

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top