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

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

Прежде чем воспользоваться разделением памяти, нужно создать разделяемый сегмент с уникальным идентификатором и ассоциированную с ним структуру данных. Уникальный идентификатор называется идентификатором разделяемого сегмента памяти (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>).

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

Табл. 4. Состояния разделяемых сегментов памяти.

Бит удержания Бит подкачки Бит размещения Состояние

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

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

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



2003-12-09