prot | Описание |
---|---|
PROT_READ | Данные могут быть считаны |
PROT_WRITE | Данные могут быть записаны |
PROT_EXEC | Данные могут быть выполнены |
PROT_NONE | Доступ к данным закрыт |
Таблица 12.2. Аргумент flag для вызова mmap
flag | Описание |
---|---|
MAP SHARED | Изменения передаются другим процессам |
MAP_PRIVATE | Изменения не передаются другим процессам и не влияют на отображенный объект |
MAP_FIXED | Аргумент |
Аргумент
Для обеспечения переносимости пpoгрaмм флаг MAP_FIXED указывать не следует. Если он не указан, но аргумент
Одним из способов добиться совместного использования памяти родительским и дочерним процессами является вызов mmap с флагом MAP_SHARED перед вызовом fork. Стандарт Posix.1 гарантирует в этом случае, что все отображения памяти, установленные родительским процессом, будут унаследованы дочерним. Более того, изменения в содержимом объекта, вносимые родительским процессом, будут видны дочернему, и наоборот. Эту схему мы вскоре продемонстрируем в действии.
Для отключения отображения объекта в адресное пространство процесса используется вызов munmap:
#include
int munmap(void
/* Возвращает 0 в случае успешного завершения, –1 – в случае ошибки */
Аргумент
Если область была отображена с флагом MAP_PRIVATE, все внесенные за время работы процесса изменения сбрасываются.
В изображенной на рис. 12.5 схеме ядро обеспечивает синхронизацию содержимого файла, отображенного в память, с самой памятью при помощи алгоритма работы с виртуальной памятью (если сегмент был отображен с флагом MAP_SHARED). Если мы изменяем содержимое ячейки памяти, в которую отображен файл, через некоторое время содержимое файла будет соответствующим образом изменено ядром. Однако в некоторых случаях нам нужно, чтобы содержимое файла всегда было в соответствии с содержимым памяти. Тогда для осуществления моментальной синхронизации мы вызываем msync:
#include
int msync(void
/* Возвращает 0 в случае успешного завершения, –1 – в случае ошибки */
Аргумент
Таблица 12.3. Значения аргумента flags для функции msync
Константа | Описание |
---|---|
MS_ASYNC | Осуществлять асинхронную запись |
MS_SYNC | Осуществлять синхронную запись |
MS_INVALIDATE | Сбросить кэш |
Из двух констант MS_ASYNC и MS_SYNC указать нужно одну и только одну. Отличие между ними в том, что возврат из функции при указании флага MS_ASYNC происходит сразу же, как только данные для записи будут помещены в очередь ядром, а при указании флага MS_SYNC возврат происходит только после завершения операций записи. Если указан и флаг MS_INVALIDATE, все копии файла, содержимое которых не совпадает с его текущим содержимым, считаются устаревшими. Последующие обращения к этим копиям приведут к считыванию данных из файла.
Почему вообще используется отображение в память?
До сих пор мы всегда говорили об отображении в память содержимого файла, который сначала открывается вызовом open, а затем отображается вызовом mmap. Удобство состоит в том, что все операции ввода-вывода осуществляются ядром и скрыты от программиста, а он просто пишет код, считывающий и записывающий данные в некоторую область памяти. Ему не приходится вызывать read, write или lseek. Часто это заметно упрощает код.