[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Использование сегмента разделяемой памяти
Несколько процессов могут отображать разделяемый сегмент в свое
адресное пространство.
1. Один из процессов создает разделяемый сегмент вызовом shmget(2) с
флагом IPC_CREAT. Эта операция выделяет сегмент памяти требуемого
размера. Кроме того, создается дескриптор для этого сегмента.
2. Обычно после того, как создатель присоединил созданный сегмент,
он инициализирует память в нем. Присоединение отображает сегмент
в адресное пространство процесса. Доступ к сегменту
осуществляется обращением к адресам, вычисляемым относительно
виртуального адреса, который возвратил shmat(2).
Процесс, который создал разделяемый сегмент, обычно и удаляет
его. Это делается после того, как все процессы закончили работу с
сегментом.
3. Другие процессы должны получать доступ к разделяемому сегменту.
Доступ осуществляется вызовом shmat(2) с идентификатором id
разделяемого сегмента. Этот идентификатор может быть получен
следующими способами:
- Создатель передает id другим процессам.
- Если ключ не является приватным, id может быть получен вызовом
shmget(2).
После получения доступа, процесс может отобразить сегмент в свое
адресное пространство. Ссылки на этот сегмент также должны быть
относительно его виртуального адреса. Виртуальные адреса сегмента
для разных процессов могут быть различными.
4. Когда процесс закончил работу с сегментом, он отсоединяет его
вызовом shmdt(2). Попытки доступа к содержимому сегмента после
shmdt(2) приведут к нарушению сегментной защиты (SIGSEGV).
5. Процесс, который создал разделяемый сегмент, обычно удаляет его
вызовом shmctl(2) с командой IPC_RMID. В принципе, это может
сделать любой процесс с эффективным uid создателя или хозяина
разделяемого сегмента. Можно выполнить удаление до того, как
счетчик присоединений к сегменту станет нулевым (т.е. кто-то из
процессов все еще использует сегмент). Запрос на удаление
помечает сегмент, но само удаление происходит только когда
количество присоединившихся процессов станет равно 0. Флаг
ожидания удаления виден как D в выводе команды ipcs(1).