Индустрия программирования

Семафоры


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

Можно уничтожить индивидуальный семафор в указанной
группе

Содержание раздела