12.2. Функции mmap, munmap и msync
12.2. Функции mmap, munmap и msync
Функция mmap отображает в адресное пространство процесса файл или объект разделяемой памяти Posix. Мы используем эту функцию в следующих ситуациях:
1. С обычными файлами для обеспечения ввода-вывода через отображение в память (раздел 12.3).
2. Со специальными файлами для обеспечения неименованного отображения памяти (разделы 12.4 и 12.5).
3. С shm_open для создания участка разделяемой неродственными процессами памяти Posix.
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
/* Возвращает начальный адрес участка памяти в случае успешного завершения. MAP_FAILED – в случае ошибки */
Аргумент addr может указывать начальный адрес участка памяти процесса, в который следует отобразить содержимое дескриптора fd. Обычно ему присваивается значение нулевого указателя, что говорит ядру о необходимости выбрать начальный адрес самостоятельно. В любом случае функция возвращает начальный адрес сегмента памяти, выделенной для отображения.
Аргумент len задает длину отображаемого участка в байтах; участок может начинаться не с начала файла (или другого объекта), а с некоторого места, задаваемого аргументом offset. Обычно offset = 0. На рис. 12.5 изображена схема отображения объекта в память.
Рис. 12.5. Пример отображения файла в память
Защита участка памяти с отображенным объектом обеспечивается с помощью аргумента prot и констант, приведенных в табл. 12.1. Обычное значение этого аргумента — PROT_READ | PROT_WRITE, что обеспечивает доступ на чтение и запись.
Таблица 12.1. Аргумент prot для вызова mmap
prot Описание PROT_READ Данные могут быть считаны PROT_WRITE Данные могут быть записаны PROT_EXEC Данные могут быть выполнены PROT_NONE Доступ к данным закрытТаблица 12.2. Аргумент flag для вызова mmap
flag Описание MAP SHARED Изменения передаются другим процессам MAP_PRIVATE Изменения не передаются другим процессам и не влияют на отображенный объект MAP_FIXED Аргумент addr интерпретируется как адрес памятиАргумент flags может принимать значения из табл. 12.2. Можно указать только один из флагов — MAP_SHARED или MAP_PRIVATE, прибавив к нему при необходимости MAP_FIXED. Если указан флаг MAP_PRIVATE, все изменения будут производиться только с образом объекта в адресном пространстве процесса; другим процессам они доступны не будут. Если же указан флаг MAP_SHARED, изменения отображаемых данных видны всем процессам, совместно использующим объект.
Для обеспечения переносимости пpoгрaмм флаг MAP_FIXED указывать не следует. Если он не указан, но аргумент addr представляет собой ненулевой указатель, интерпретация этого аргумента зависит от реализации. Ненулевое значение addr обычно трактуется как указатель на желаемую область памяти, в которую нужно произвести отображение. В переносимой программе значение addr должно быть нулевым и флаг MAP_FIXED не должен быть указан.
Одним из способов добиться совместного использования памяти родительским и дочерним процессами является вызов mmap с флагом MAP_SHARED перед вызовом fork. Стандарт Posix.1 гарантирует в этом случае, что все отображения памяти, установленные родительским процессом, будут унаследованы дочерним. Более того, изменения в содержимом объекта, вносимые родительским процессом, будут видны дочернему, и наоборот. Эту схему мы вскоре продемонстрируем в действии.
Для отключения отображения объекта в адресное пространство процесса используется вызов munmap:
#include <sys/mman.h>
int munmap(void *addr, size_t len);
/* Возвращает 0 в случае успешного завершения, –1 – в случае ошибки */
Аргумент addr должен содержать адрес, возвращенный mmap, a len — длину области отображения. После вызова munmap любые попытки обратиться к этой области памяти приведут к отправке процессу сигнала SIGSEGV (предполагается, что эта область памяти не будет снова отображена вызовом mmap).
Если область была отображена с флагом MAP_PRIVATE, все внесенные за время работы процесса изменения сбрасываются.
В изображенной на рис. 12.5 схеме ядро обеспечивает синхронизацию содержимого файла, отображенного в память, с самой памятью при помощи алгоритма работы с виртуальной памятью (если сегмент был отображен с флагом MAP_SHARED). Если мы изменяем содержимое ячейки памяти, в которую отображен файл, через некоторое время содержимое файла будет соответствующим образом изменено ядром. Однако в некоторых случаях нам нужно, чтобы содержимое файла всегда было в соответствии с содержимым памяти. Тогда для осуществления моментальной синхронизации мы вызываем msync:
#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);
/* Возвращает 0 в случае успешного завершения, –1 – в случае ошибки */
Аргумент flags представляет собой комбинацию констант из табл. 12.3.
Таблица 12.3. Значения аргумента flags для функции msync
Константа Описание MS_ASYNC Осуществлять асинхронную запись MS_SYNC Осуществлять синхронную запись MS_INVALIDATE Сбросить кэшИз двух констант MS_ASYNC и MS_SYNC указать нужно одну и только одну. Отличие между ними в том, что возврат из функции при указании флага MS_ASYNC происходит сразу же, как только данные для записи будут помещены в очередь ядром, а при указании флага MS_SYNC возврат происходит только после завершения операций записи. Если указан и флаг MS_INVALIDATE, все копии файла, содержимое которых не совпадает с его текущим содержимым, считаются устаревшими. Последующие обращения к этим копиям приведут к считыванию данных из файла.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Функции mmap() и do_mmap() : создание интервала адресов
Функции mmap() и do_mmap(): создание интервала адресов Функция do_mmap() используется ядром для создания нового линейного интервала адресов. Говорить, что эта функция создает новую область VMA, — технически не корректно, поскольку если создаваемый интервал адресов является смежным
Системный вызов mmap()
Системный вызов mmap() Возможности функции do_mmap() экспортируются в пространство пользователя с помощью системного вызова mmap(), который определен следующим образом.void *mmap2(void *start, size_t length, int prot, int flags, int fd, off_t pgoff);Этот системный вызов имеет имя mmap2(), т.е. второй вариант функции
Функции munmap() и do_munmap() : удаление интервала адресов
Функции munmap() и do_munmap(): удаление интервала адресов Функция do_munmap() удаляет интервал адресов из указанного адресного пространства процесса. Эта функция объявлена в файле <asm/mman.h> следующим образом.int do_munmap(struct mm_struct *mm, unsigned long start, size_t len);Первый параметр указывает адресное
Системный вызов munmap()
Системный вызов munmap() Системный вызов munmap() экспортируется в адресное пространство пользователя, чтобы иметь возможность удалять интервалы адресов из адресного пространства. Эта функция является комплиментарной к системному вызову mmap() и имеет следующий прототип.int
Функции
Функции Существует мнемоническое правило: функции не должны по объему кода превышать двух экранов текста и иметь больше десяти локальных переменных. Каждая функция должна выполнять одно действие, но делать это хорошо. Не вредно разбить функцию на последовательность
Функции
Функции Функции в JScript, как и в других алгоритмических языках, позволяют объединить несколько операций под одним именем. В случае необходимости функция может быть вызвана из любого места сценария.В сценариях JScript поддерживаются два вида функций: встроенные функции и
Функции
Функции Функция — это особым образом написанный и оформленный фрагмент кода JavaScript, который можно вызвать из любого Web-сценария на данной Web- странице (повторно используемый код, как его часто называют). Так что, если ка- кой-то фрагмент кода встречается в нескольких местах
5.8.7 Функции
5.8.7 Функции СинтаксисОболочка bash позволяет пользователю создавать собственные функции. Функции ведут себя и используются точно так же, как обычные команды оболочки, т. е. мы можем сами создавать новые команды. Функции конструируются следующим образом: function name () {list}Причем
19.7.8. Функции
19.7.8. Функции Описание функции выглядит так: имя() { список; }Пример:cdir(){ # изменяем каталог cd / }При выполнении функция не создает нового процесса, а выполняется в среде процесса, содержащего эту функцию. Аргументы функции можно передать ей как обыкновенные параметры при
4.5.3. Функции, которые создают новые конфигурации из существующих 4.5.3.1. Функции геометрии, которые производят новые конфигурации
4.5.3. Функции, которые создают новые конфигурации из существующих 4.5.3.1. Функции геометрии, которые производят новые конфигурации Раздел "4.5.2. Функции Geometry" обсуждает несколько функций, которые создают новые конфигурации из
5.3.5. Применения функции mmap()
5.3.5. Применения функции mmap() Функция mmap() может использоваться не только для организации взаимодействия процессов. Часто она выступает в качестве замены функциям read() и write(). Например, вместо того чтобы непосредственно загружать содержимое файла в память, программа может
7. Функции
7. Функции Мы рассмотрели, как объявлять переменные (глава 3), как писать выражения (глава 4) и инструкции (глава 5). Здесь мы покажем, как группировать эти компоненты в определения функций, чтобы облегчить их многократное использование внутри программы. Мы увидим, как
Функции
Функции Функции значительно расширяют возможности выражений. Они принимают на вход несколько аргументов и возвращают некоторый результат, который иногда является продуктом весьма замысловатого вычисления.Функции можно условно разделить на стандартные функции,
1.5 Функции
1.5 Функции Функция – это именованная часть программы, к которой можно обращаться из других частей программы столько раз, сколько потребуется. Рассмотрим программу, печатающую степени числа 2:extern float pow(float, int); //pow() определена в другом местеmain() (* for (int i=0; i«10; i++) cout „« pow(2,i) ««