ГЛАВА 11 Семафоры System V

ГЛАВА 11

Семафоры System V

11.1.Введение

В главе 10 мы описывали различные виды семафоров, начав с:

? бинарного семафора, который может принимать только два значения: 0 и 1. По своим свойствам такой семафор аналогичен взаимному исключению (глава 7), причем значение 0 для семафора соответствует блокированию ресурса, а 1 — освобождению.

Далее мы перешли к более сложному виду семафоров:

? семафор-счетчик, значение которого лежит в диапазоне от 0 до некоторого ограничения, которое, согласно Posix, не должно быть меньше 32767. Они использовался для подсчета доступных ресурсов в задаче о производителях и потребителях, причем значение семафора соответствовало количеству доступных ресурсов.

Для обоих типов семафоров операция wait состояла в ожидании изменения значения семафора с нулевого на ненулевое и последующем уменьшении этого значения на 1. Операция post увеличивала значение семафора на 1, оповещая об этом все процессы, ожидавшие изменения значения семафора.

Для семафоров System V определен еще один уровень сложности:

? набор семафоров-счетчиков — один или несколько семафоров, каждый из которых является счетчиком. На количество семафоров в наборе существует ограничение (обычно порядка 25 — раздел 11.7). Когда мы говорим о семафоре System V, мы подразумеваем именно набор семафоров-счетчиков, а когда говорим о семафоре Posix, подразумевается ровно один семафор-счетчик.

Для каждого набора семафоров ядро поддерживает следующую информационную структуру, определенную в файле <sys/sem.h>:

struct semid_ds {

 struct ipc_perm sem_perm; /* разрешения на операции */

 struct sem *sem_base; /*указатель на массив семафоров в наборе */

 ushort sem_nsems; /* количество семафоров в наборе */

 time_t sem_otime; /* время последнего вызова semop(); */

 time_t sem_ctime; /* время создания последнего IPC_SET */

};

Структура ipc_perm была описана в разделе 3.3. Она содержит разрешения доступа для данного семафора.

Структура sem представляет собой внутреннюю структуру данных, используемую ядром для хранения набора значений семафора. Каждый элемент набора семафоров описывается так:

struct sem {

 ushort_t semval; /* значение семафора, неотрицательно */

 short sempid; /* PID последнего процесса, вызвавшего semop(), SETVAL, SETALL */

 ushort_t semncnt; /* количество ожидающих того, что значение семафора превысит текущее */

 ushort_t semzcnt; /* количество ожидающих того, что значение семафора станет равным 0*/

};

Обратите внимание, что sem_base представляет собой указатель на массив структур типа sem — по одному элементу массива на каждый семафор в наборе.

Помимо текущих значений всех семафоров набора в ядре хранятся еще три поля данных для каждого семафора: идентификатор процесса, изменившего значение семафора последним, количество процессов, ожидающих увеличения значения семафора, и количество процессов, ожидающих того, что значение семафора станет нулевым.

ПРИМЕЧАНИЕ

В стандарте Unix 98 данная структура не имеет имени. Приведенное выше имя (sem) взято из реализации System V. 

Любой конкретный семафор в ядре мы можем воспринимать как структуру semid_ds, указывающую на массив структур sem. Если в наборе два элемента, мы получим картину, изображенную на рис. 11.1. На этом рисунке переменная sem_nsems имеет значение 2, а каждый из элементов набора идентифицируется индексом ([0] или [1]). 

Рис. 11.1. Структуры данных ядра для набора семафоров из двух элементов

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

11.2.3 Семафоры

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж


12.3 СЕМАФОРЫ

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

12.3 СЕМАФОРЫ Поддержка системы UNIX в многопроцессорной конфигурации может включать в себя разбиение ядра системы на критические участки, параллельное выполнение которых на нескольких процессорах не допускается. Такие системы предназначались для работы на машинах AT amp;T


System.DateTime и System.TimeSpan

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

System.DateTime и System.TimeSpan В завершение нашего обзора базовых типов данных позволите обратить ваше внимание на то, что пространство имен System определяет несколько полезных типов данных, для которых в C# не предусмотрено ключевых слов. Это, в частности, типы DateTime и TimeSpan (задачу


Базовые классы System.MulticastDelegate и System.Delegate

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Базовые классы System.MulticastDelegate и System.Delegate Таким образом, при создании типов c помощью) ключевого слова delegate в C# вы неявно объявляете тип класса, являющегося производным от System.MulticastDelegate. Этот класс обеспечивает своим потомкам доступ к списку с адресами тех методов, которые


ГЛАВА 16. Пространство имен System.IO

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

ГЛАВА 16. Пространство имен System.IO При создании полноценных приложений исключительно важна возможность сохранения информации между сеансами доступа пользователя. В этой главе рассматривается целый ряд вопросов, связанных с реализацией ввода-вывода в .NET. Первой нашей


ГЛАВА 19. Создание окон с помощью System.Windows.Forms

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

ГЛАВА 19. Создание окон с помощью System.Windows.Forms Если вы прочитали предыдущие 18 глав, вы должны иметь солидную базу дли использования языка программирования C# и архитектуры .NET. Вы, конечно же, можете применить полученные знания для построения консольных приложений следующего


ГЛАВА 3 System V IPC

Из книги Операционная система UNIX автора Робачевский Андрей М.

ГЛАВА 3 System V IPC 3.1. Введение Из имеющихся типов IPC следующие три могут быть отнесены к System V IPC, то есть к методам взаимодействия процессов, соответствующим стандарту System V:? очереди сообщений System V (глава 6);? семафоры System V (глава 11);? общая память System V (глава 14).Термин «System V IPC»


ГЛАВА 6 Очереди сообщений System V

Из книги Разработка ядра Linux автора Лав Роберт

ГЛАВА 6 Очереди сообщений System V 6.1. Введениеы Каждой очереди сообщений System V сопоставляется свой идентификатор очереди сообщений. Любой процесс с соответствующими привилегиями (раздел 3.5) может поместить сообщение в очередь, и любой процесс с другими соответствующими


ГЛАВА 14 Разделяемая память System V

Из книги автора

ГЛАВА 14 Разделяемая память System V 14.1. Введение Основные принципы разделяемой памяти System V совпадают с концепцией разделяемой памяти Posix. Вместо вызовов shm_open и mmap в этой системе используются вызовы shmget и shmat.Для каждого сегмента разделяемой памяти ядро хранит нижеследующую


Семафоры System V

Из книги автора

Семафоры System V Функция main программы, измеряющей быстродействие семафоров System V, приведена в листинге А.27, а функция incr показана в листинге А.28.Листинг А.27. Функция main для измерения быстродействия семафоров System V//bench/incr_svsem1.c1  #include "unpipc.h"2  #define MAXNTHREADS 1003  int nloop;4  struct {5   int


Семафоры

Из книги автора

Семафоры Объекты второго из трех упомянутых в начале главы типов объектов синхронизации ядра — семафоры (semaphores), поддерживают счетчики, и когда значение этого счетчика больше 0, объект семафора находится в сигнальном состоянии. Если же значение счетчика становится


26.6. Семафоры

Из книги автора

26.6. Семафоры Семафор — это объект IPC, управляющий доступом к общим ресурсам (устройствам). Семафоры не позволяют одному процессу захватить устройство до тех пор, пока с этим устройством работает другой процесс. Семафор может находиться в двух положениях: 0 (устройство


Семафоры

Из книги автора

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


Семафоры

Из книги автора

Семафоры Для синхронизации процессов, а точнее, для синхронизации доступа нескольких процессов к разделяемым ресурсам, используются семафоры. Являясь одной из форм IPC, семафоры не предназначены для обмена большими объемами данных, как в случае FIFO или очередей сообщений.


Семафоры

Из книги автора

Семафоры В операционной системе Linux семафоры (semaphore) — это блокировки, которые переводят процессы в состояние ожидания. Когда задание пытается захватить семафор, который уже удерживается, семафор помещает это задание в очередь ожидания (wait queue) и переводит это задание в