Значение поля операции положительно

· значение семафора увеличивается на единицу

· все процессы, ожидающие увеличения значения семафора, активизируются (пробуждаются)

Значение поля операции равно нулю

· если значение семафора равно нулю, выбирается следующий элемент массива 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 определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти

Условия успешной постановки сообщения в очередь:

· процесс должен иметь право на запись в очередь

· длина сообщения не должна превосходить верхний предел

· общая длина сообщений не должна превосходить установленного предела

· тип сообщения должен быть положительным целым числом

Процесс продолжает свое выполнение

Ядро активизирует (пробуждает) все процессы, ожидающие поступления сообщений из очереди


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: