Стивенс Уильям Ричард
Шрифт:
Как видно, каждый из процессов использует собственную копию глобального счетчика count. Каждый начинает со значения 0 и при прохождении цикла увеличивает значение своей копии счетчика. На рис. 12.3 изображен родительский процесс перед вызовом fork.
Рис. 12.3. Родительский процесс перед вызовом fork
При вызове fork дочерний процесс запускается с собственной копией данных родительского процесса. На рис. 12.4 изображены оба процесса после возвращения из fork.
Рис. 12.4. Родительский и дочерний процессы после возвращения из fork
Мы видим, что родительский и дочерний процессы используют отдельные копии счетчика count.
12.2. Функции mmap, munmap и msync
Функция mmap отображает в адресное пространство процесса файл или объект разделяемой памяти Posix. Мы используем эту функцию в следующих ситуациях:
1. С обычными файлами для обеспечения ввода-вывода через отображение в память (раздел 12.3).
2. Со специальными файлами для обеспечения неименованного отображения памяти (разделы 12.4 и 12.5).
3. С shm_open для создания участка разделяемой неродственными процессами памяти Posix.
Аргумент 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, изменения отображаемых данных видны всем процессам, совместно использующим объект.