[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Разделяемая память

Это средство IPC позволяет двум или более процессам разделять память.
Такая память используется для хранения данных, которые нужны
нескольким процессам. Это могут быть поисковые таблицы, критерии
правильности данных и т.д.
Разделяемая память представляет собой самый быстрый способ обмена
данными между процессами.
Реализация разделяемой памяти машинно зависима; она зависит от схемы
управления памятью на данной машине. Это средство не реализовано для
шестнадцатиразрядных машин, таких, как PDP 11/70+. На этих процессорах
существует системный вызов maus(2), обсуждаемый в старом Справочном
руководстве программиста ОС UNIX Версии 5.0, который предоставляет
похожие, но менее гибкие функции.
Как правило, один процесс создает сегмент разделяемой памяти,
отображает его в свое адресное пространство и инициализирует. Процесс
отображения разделяемого сегмента в адресное пространство процесса
называют присоединением сегмента. Затем другие процессы могут
присоединять этот сегмент и использовать его содержимое. Создатель
задает права чтения/записи для хозяина/группы/других пользователей
вызовом shmget(2) с флагом IPC_CREAT. Обычно сегмент удаляется тем же
процессом, который создал его.
Конфигурация системы определяет минимальный и максимальный размеры
сегмента. Также ограничено количество сегментов, присоединенных к
одному процессу.
Через разделяемую память могут взаимодействовать неродственные
процессы. Все, что нужно процессу для присоединения разделяемого
сегмента, это соответствующие права доступа для своих идентификаторов
пользователя и группы. Когда сегмент больше не нужен процессу, он
отсоединяет его вызовом shmdt(2). Если это не было сделано явным
образом, exit(2) сделает это. Отсоединение разделяемой памяти похоже
на закрытие файла. Отсоединение не удаляет разделяемый сегмент, оно
только логически исключает этот сегмент из виртуального пространства
данных программы.
Родительский и порожденные процессы могут использовать сегменты
разделяемой памяти. После fork(2) порожденный процесс наследует
присоединенные разделяемые сегменты. Однако, после exec такие сегменты
будут отсоединены. Так происходит потому, что после fork(2) сегмент
данных порожденного процесса является копией родительского, но после
exec(2) этот сегмент изменяется.
                          РАЗДЕЛЯЕМАЯ ПАМЯТЬ
                        НА 32-РАЗРЯДНЫХ МАШИНАХ
Позволяет процессам разделять физическую память

Системные вызовы:

shmget      -     создать или получить доступ к сегменту разделяемой
                  памяти

shmctl      -     определить состояние разделяемого сегмента; изменить
                  хозяина/группу сегмента и права доступа; удалить
                  сегмент

shmop       -     присоединить (shmat) разделяемый сегмент к области
                  данных процесса, или отсоединить его (shmdt)