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


Семафоры


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



    Начало  Назад  Вперед



    Книжный магазин