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. Состояния разделяемых сегментов памяти.


Бит удержания Бит подкачки Бит размещения Состояние
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 (управление разделяемыми сегментами).


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