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

Взаимоисключение с активным ожиданием

Активным ожиданием называется постоянная проверка наступления какого-либо события (например, проверка значения переменной в ожидании некоторого ее значения). Рассмотрим разные способы реализации взаимоисключения с активным ожиданием.

Запрещение прерываний – самое простое решение. При входе процесса в критическую область все прерывания для него запрещаются (в т.ч. прерывания по таймеру) и разрешаются при выходе из критической области. Поскольку процессор переключается с одного процесса на другой только по прерыванию, запрет прерываний исключает передачу ЦП другому процессу. Однако представьте ситуацию, когда процесс отключил все прерывания, и в результате какого-либо сбоя не включил их обратно. ОС на этом завершает существование. Запрет прерываний используется только для процессов внутри ядра ОС.

Блокирующие переменные – программное решение. Назначается переменная, которая может принимать значения 0 и 1. Если какой-либо процесс хочет попасть в критическую область, он считывает состояние этой переменной. Если она 0, процесс изменяет ее на 1 и входит в критическую область. Если она 1, процесс ждет, пока значение не сменится на 0.

Возможна ситуация, когда процесс может потерять управление, если он уже считал значение переменной блокировки, но еще не изменил его. А второй процесс тоже считал, и зашел в критическую область. После этого зашел и первый процесс.

Строгое чередование – когда процессы получают доступ к критической области строго по очереди. В этом случае один процесс блокирует другой до своего завершения, и ни один процесс не может попасть в критическую область два раза подряд. Практически не применяется: в случаях, когда один процесс существенно медленнее другого, второй (быстрый) сильно замедляется. Т.е. происходит блокировка одного процесса другим, не находящимся в критической области.

Разработаны разные алгоритмы взаимного исключения с активным ожиданием, но они все используют одну схему: перед входом в критическую область процесс проверяет, можно ли это сделать. Если нельзя, он входит в цикл ожидания.

Недостатки взаимного исключения с активным ожиданием:

  1. Бесцельные потери времени процессора.

  2. Инверсия приоритета.

Это значит следующее. При попадании в критическую область процесса с низким приоритетом, процесс с бо’льшим приоритетом будет в состоянии ожидания. Но т.к. при работающем процессе с большим приоритетом процесс с меньшим приоритетом никогда не получит процессорное время, у него не будет возможности выйти из критической области.

Семафоры

Способ предложен Дейкстрой в 1965 (Dijkstra).

Семафоры - Это целые неотрицательные переменные для синхронизации процессов (для подсчета сигналов запуска, сохраненных на будущее).

Семафор может быть:

  1. Нулем (в случае отсутствия сохраненных сигналов активации).

  2. Положительным числом (по количеству отложенных сигналов).

Над семафором возможны две операции, down и up (другие традиционные обозначения P и V (от датского слова proberen – проверять и verhogen – увеличивать)). Никакие прерывания во время выполнения этих операций недопустимы. Операция down сравнивает значение семафора с нулем. Если значение семафора больше нуля, down уменьшает его на 1, т.е. расходует один из отложенных сигналов активации, и возвращает управление процессу. Если значение семафора равно 0, управление процессу не возвращается, а процесс переводится в состояние ожидания.

Операция up увеличивает значение семафора. Один из связанных с семафором ожидающих процессов, выбирается системой для выхода из состояния ожидания.

В частном случае, когда семафор может принимать значения только 0 или 1, он превращается просто в блокирующую переменную.