next up previous contents index
Next: Создание разделяемых сегментов памяти Up: Разделяемые сегменты памяти Previous: Разделяемые сегменты памяти   Contents   Index

Использование разделяемых сегментов памяти

Прежде чем воспользоваться разделением памяти, нужно создать разделяемый сегмент с уникальным идентификатором и ассоциированную с ним структуру данных. Уникальный идентификатор называется идентификатором разделяемого сегмента памяти (shmid); он используется для обращений к ассоциированной структуре данных, которая определяется следующим образом: struct shmid_ds { struct ipc_perm shm_perm; /* Структура прав на выполнение операций */ int shm_segsz; /* Размер сегмента */ struct region *shm_reg; /* Указатель на структуру области памяти */ char pad [4]; /* Информация для подкачки */ ushort shm_lpid; /* Ид-р процесса, вып. последнюю операцию */ ushort shm_cpid; /* Ид-р процесса, создавшего сегмент */ ushort shm_nattch; /* Число присоединивших сегмент */ ushort shm_cnattch; /* Число удерживающих сегмент в памяти */ time_t shm_atime; /* Время последнего присоединения */ time_t shm_dtime; /* Время последнего отсоединения */ time_t shm_ctime; /* Время последнего изменения */ }; (см. включаемый файл <sys/shm.h>).

Следующая таблица содержит информацию о возможных состояниях разделяемых сегментов памяти:

Бит удержания Бит подкачки Бит размещения Состояние
0 0 0 Неразмещенный сегмент
0 0 1 В памяти
0 1 0 Не используется
0 1 1 На диске
1 0 0 Не используется
1 0 1 Удержан в памяти
1 1 0 Не используется
1 1 1 Не используется

Состояния, упомянутые в таблице, таковы:

Системный вызов shmget аналогичен вызову semget (разумеется, с заменой слов ``множество семафоров'' на ``разделяемый сегмент памяти''). Он также предназначен для получения нового или опроса существующего идентификатора, а нужное действие определяется значением аргумента key. В аналогичных ситуациях shmget терпит неудачу. Единственное отличие состоит в том, что задается не число семафоров в множестве, а размер сегмента в байтах.

После того, как создан уникальный идентификатор разделяемого сегмента памяти и ассоциированная с ним структура данных, можно использовать системные вызовы семейства shmop (операции над разделяемыми сегментами) и shmctl (управление разделяемыми сегментами).



Alex Otwagin 2002-12-16