Семафоры
Обобщение классического механизма семафоров общего
вида Диекстры
Целесообразность обобщения сомнительна
Обычно использовался облегченный вариант двоичных семафоров
Известен алгоритм реализации семафоров общего вида на основе двоичных
Семафор в ОС UNIX:
- значение семафора
- идентификатор процесса, который хронологически последним работал
с семафором
- число процессов, ожидающих увеличения значения семафора
- число процессов, ожидающих нулевого значения семафора
Три системных вызова:
- semget
для создания и получения доступа к набору семафоров
- semop для манипулирования
значениями семафоров
- semctl для выполнения
управляющих операций над набором семафоров
id = semget(key, count,
flag);
- key,
flag
и id
- обычный смысл
- count - число
семафоров в наборе семафоров, обладающих одним и тем же ключом
- индивидуальный семафор идентифицируется дескриптором набора
семафоров и номером семафора в наборе
- если набор семафоров с указанным ключом уже существует, то
число семафоров в группе можно узнать с помощью системного вызова
semctl
oldval = semop(id, oplist,
count);
- id
- дескриптор группы семафоров
- oplist - массив
описателей операций над семафорами группы
- count - размер
этого массива
- возвращается значение последнего обработанного семафора
Элемент массива oplist:
- номер семафора в указанном наборе семафоров
- операция
- флаги
Если проверка прав доступа проходит нормально
- указанные в массиве oplist
номера семафоров не выходят за пределы общего размера набора семафоров
- для каждого элемента массива oplist
значение семафора изменяется в соответствии со значением поля
"операция"
Значение поля операции положительно
- значение семафора увеличивается на единицу
- все процессы, ожидающие увеличения значения семафора,
активизируются (пробуждаются)
Значение поля операции равно нулю
- если значение семафора равно нулю, выбирается
следующий элемент массива oplist
- иначе число процессов, ожидающих нулевого значения
семафора, увеличивается на единицу
- обратившийся процесс переводится в состояние
ожидания (усыпляется)
Значение поля операции отрицательно
(1) его абсолютное значение меньше или равно значению
семафора
- это отрицательное значение прибавляется к значению
семафора
- если значение семафора стало нулевым, то ядро
активизирует все процессы, ожидающие нулевого значения этого семафора
(2) значение семафора меньше абсолютной величины
поля операции
- число процессов, ожидающих увеличения значения
семафора увеличивается на единицу
- текущий процесс откладывается
Стремление добиться возможности избегать тупиковых
ситуаций
Системный вызов semop
выполняется как атомарная операция
Флаг IPC_NOWAIT заставляет
ядро ОС UNIX не блокировать текущий процесс
- лишь сообщать в ответных параметрах о возникновении
ситуации, приведшей бы к блокированию процесса
semctl(id, number, cmd,
arg);
- id
- это дескриптор группы семафоров
- number
- номер семафора в группе
- cmd
- код операции
- arg - указатель
на структуру, содержимое которой интерпретируется в зависимости
от операции
Можно уничтожить индивидуальный семафор в указанной
группе