Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции иртегова / Лекция 10 - System V IPC.doc
Скачиваний:
49
Добавлен:
06.06.2015
Размер:
207.36 Кб
Скачать
      1. Разделяемая память

Это средство IPC позволяет двум или более процессам разделять память.

Такая память используется для хранения данных, которые нужны нескольким процессам. Это могут быть поисковые таблицы, критерии правильности данных и т. д. Разделяемая па­мять представляет собой самый быстрый способ обмена данными между процессами.

Как правило, один процесс создает сегмент разделяемой памяти вызовом shmget(2) с флагом IPC_CREAT, отображает его в свое адресное пространство и инициализирует. Отображения разделяемого сегмента в адресное пространство процесса называют присоединением сегмен­та. Затем другие процессы могут присоединять этот сегмент и использовать его содержимое. Создатель задает права чтения/записи для хозяина/группы/других пользователей. Обычно сегмент удаляется тем же процессом, который создал его.

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

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

Когда сегмент больше не нужен процессу, он отсоединяет его вызовом shmdt(2). Если это не было сделано явным образом, это произойдет при завершении процесса (как по exit(2), так и по сигналу) или при exec(2) . Отсоединение разделяемой памяти похоже на закрытие файла. Отсоединение не удаляет разделяемый сегмент, оно только логически исключает этот сег­мент из виртуального пространства данных программы.

В отличие от остальных средств IPC, у разделяемой памяти происходит отложенное удале­ние. Вызов shmctl(2) с командой IPC_RMID приводит только к тому, что новые процессы не могут присоединиться к этому сегменту, но не к отсоединению этих сегментов у процессов, которые их используют. Запрос на удаление помечает сегмент, но само удаление происходит только когда количество присоединившихся процессов станет равно 0. Флаг ожидания уда­ления виден как D в выводе команды ipcs(1).

Родительский и порожденные процессы также могут использовать сегменты разделяемой па­мяти. После fork(2) порожденный процесс наследует присоединенные разделяемые сегмен­ты. Обычные сегменты памяти данных после fork(2) копируются при записи, а сегменты раз­деляемой памяти остаются общими, так что родитель и потомок видят изменения, вносимые другим процессом, и могут взаимодействовать через них. При этом, в родителе и в потомке сегмент будет отображен на одни и те же виртуальные адреса.

При использовании модифицируемой разделяемой памяти нужны средства координации до­ступа, позволяющие гарантировать целостность данных и защитить структуры данных, це­лостность которых временно нарушается. Для такой координации можно использовать сема­форы System V IPC, а также семафоры и/или мутексы POSIX Threads.