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


   Лечение алкоголизма             

Семафоры


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



    Содержание  Назад  Вперед