Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SRS_IPOVS_OS.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.28 Mб
Скачать

Применение семафоров

Взаимное исключение. Ниже показано решение задачи взаимоисключений с использованием семафора s. Пусть имеется n процессов. В каждом из процессов перед входом в КС выполняется вызов wait(s). Если значение s становится отрицательным, процесс приостанавливается. Если же значение равно 1, оно уменьшается до нуля, и процесс немедленно входит в КС. Поскольку s больше не является положительным, ни один другой процесс не может войти в КС.

semaphore s = 1:

. . . . . . . . .

wait(s);

/* Критическая секция */

signal(s);

/* Остальной код */

Семафор инициализируется значением 1. Следовательно, первый процесс, выполняющий wait(s), сможет немедленно попасть в КС, устанавливая при этом значение семафора равным 0. Любой другой процесс при попытке войти в КС обнаружит, что он занят. Соответственно, произойдет блокировка процесса, а значение семафора будет уменьшено до -1. Пытаться войти в КС может любое количество процессов; каждая неуспешная попытка уменьшает значение семафора. После того как процесс, вошедший в КС первым, покидает его, s увеличивается, и один из заблокированных процессов (если таковые имеются) удаляется из очереди семафора и активизируется. Таким образом, как только планировщик ОС предоставит ему возможность выполнения, процесс тут же сможет войти в КС.

Сигнализирующий семафор. Это семафор с нулевым начальным значением. Процесс сигнализирует о событии, выполняя операцию signal(s). Другие процессы ожидают события, выполняя операцию wait(s).

9.2. Мьютексы

Мьютекс – упрощенная версия семафора, это переменная, которая может находиться в одном из двух состояний: блокированном и неблокированном.

Значение мьютекса устанавливается двумя процедурами. Если процесс (или поток) собирается войти в КС, он вызывает процедуру mutex_lock. Если мьютекс не заблокирован, т.е. вход в КС разрешен, запрос выполняется и вызывающий процесс входит в КС. Если же мьютекс заблокирован, то процесс блокируется до тех пор, пока другой процесс, находящийся в КС, не выйдет из нее, вызвав процедуру mutex_unlock. Если мьютекс блокирует несколько процессов, то из них выбирается один.

Хотя семафоры обеспечивают решение для всех видов проблем синхронизации, им присущи следующие недостатки.

  1. Процесс, использующий семафор, должен быть осведомлен о других процессах, использующих этот же семафор, так как операции над семафорами во всех взаимодействующих процессах должны быть координированы.

  2. Операции над семафорами в процессах должны быть тщательно отлажены. Пропуск одной из операций может привести к несостоятельности (нарушение целостности разделяемого ресурса) или к взаимной блокировке.

  3. Программы, использующие семафоры, очень трудно проверять на корректность.

9.3. Мониторы

Чтобы упростить написание программ, был предложен примитив синхронизации более высокого уровня.

Монитор – набор процедур, переменных и других структур данных, объединенных в особый модуль. Это высокоуровневая конструкция языка программирования, которая обеспечивает функциональность, эквивалентную функциональности семафоров, но при этом легче управляется. Мониторы реализованы в языках программирования Concurrent Pascal, Pascal-Plus, Modula-2,-3, Java.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]