· значение семафора увеличивается на единицу
· все процессы, ожидающие увеличения значения семафора, активизируются (пробуждаются)
Значение поля операции равно нулю
· если значение семафора равно нулю, выбирается следующий элемент массива oplist
· иначе число процессов, ожидающих нулевого значения семафора, увеличивается на единицу
· обратившийся процесс переводится в состояние ожидания (усыпляется)
Значение поля операции отрицательно
(1) его абсолютное значение меньше или равно значению семафора
· это отрицательное значение прибавляется к значению семафора
· если значение семафора стало нулевым, то ядро активизирует все процессы, ожидающие нулевого значения этого семафора
(2) значение семафора меньше абсолютной величины поля операции
· число процессов, ожидающих увеличения значения семафора увеличивается на единицу
· текущий процесс откладывается
Стремление добиться возможности избегать тупиковых ситуаций
Системный вызов semop выполняется как атомарная операция
Флаг IPC_NOWAIT заставляет ядро ОС UNIX не блокировать текущий процесс
· лишь сообщать в ответных параметрах о возникновении ситуации, приведшей бы к блокированию процесса
semctl(id, number, cmd, arg);
· id - это дескриптор группы семафоров
· number - номер семафора в группе
· cmd - код операции
· arg - указатель на структуру, содержимое которой интерпретируется в зависимости от операции
Можно уничтожить индивидуальный семафор в указанной группе
Очереди сообщений
Четыре системных вызова:
· msgget для образования новой очереди сообщений или получения дескриптора существующей очереди
· msgsnd для посылки сообщения (его постановки в очередь сообщений)
· msgrcv для приема сообщения (выборки сообщения из очереди)
· msgctl для выполнения управляющих действий
msgqid = msgget(key, flag);
Сообщения хранятся в виде связного списка
Декскриптор очереди сообщений - индекс в массиве заголовков очередей сообщений
В заголовке очереди хранятся:
· указатели на первое и последнее сообщение в данной очереди
· число сообщений
· общий размер в байтах сообщений, находящихся в очереди
· идентификаторы процессов, которые последними послали или приняли сообщение через данную очередь
· временные метки последних выполненных операций msgsnd, msgrsv и msgctl
msgsnd(msgqid, msg, count, flag);
· msg - это указатель на структуру, содержащую целочисленный тип сообщения и символьный массив
· count - задает размер сообщения в байтах
· flag определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти
Условия успешной постановки сообщения в очередь:
· процесс должен иметь право на запись в очередь
· длина сообщения не должна превосходить верхний предел
· общая длина сообщений не должна превосходить установленного предела
· тип сообщения должен быть положительным целым числом
Процесс продолжает свое выполнение
Ядро активизирует (пробуждает) все процессы, ожидающие поступления сообщений из очереди