Семафоры
Обобщение классического механизма семафоров общего
вида Диекстры
Целесообразность обобщения сомнительна
Обычно использовался облегченный вариант двоичных семафоров
Известен алгоритм реализации семафоров общего вида на основе двоичных
Семафор в ОС 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
- иначе число процессов, ожидающих нулевого значения
семафора, увеличивается на единицу
Содержание Назад Вперед