
Такая ситуация называется состоянием гонок.
Синхронизация процесса с использованием семафоров
Проблему состояния гонок можно решить по крайней мере двумя спосо-
бами. Первый способ – снабдить каждый процесс специальным битом ожида-
ния пробуждения. Если процесс, который функционирует в данный момент,
получает сигнал «пробуждения», то этот бит устанавливается. Если процесс
отключается в тот момент, когда бит установлен, он немедленно перезапус-
кается, а бит сбрасывается. Этот метод решает проблему состояния гонок
только в том случае, если у нас всего два процесса. В общем случае, при
наличии n процессов он не работает.
Дейкстра предложил другое решение этой проблемы. Где-то памяти на-
ходятся две переменные, которые могут содержать неотрицательные целые
числа. Эти переменные называются
семафорами. Операционная система пре-
доставляет два системных вызова,
in и down, которые оперируют семафора-
ми.
Up прибавляет 1 к семафору, а down – отнимает 1. Если операция down
совершается над семафором, значение которого больше 0, то этот семафор
уменьшается на 1 и процесс продолжается. Если значение семафора равно 0,
то операция
down не может завершиться. Тогда процесс отключается до тех
пор, пока какой-нибудь процесс не выполнит операцию
up над этим
семафором.
Команда
up проверяет, не равен ли семафор нулю. Если он равен нулю
и другой процесс находится в режиме ожидания, то семафор увеличивается
на 1. После этого процесс, который «спит», может завершить операцию
down, установив семафор на 0. Теперь оба процесса продолжают работать.
Если семафор не равен 0, команда
up просто увеличивает его на 1. Семафор
позволяет сохранить сигналы пробуждения, так что они не пропадут зря. У
семафорных команд есть одно важное свойство: если один из процессов
начал выполнять команду над семафором, то другой процесс не может
получить доступ до тех пор, пока первый не завершит выполнение команды
или не будет приостановлен при попытке выполнить команду down над 0.
Операции над семафорами неделимы. Если операция над семафором уже
началась, то никакой другой процесс не может использовать этот семафор до
тех пор, пока первый процесс не завершит операцию или не пока он не будет
приостановлен. Более того, при наличии семафоров сигналы пробуждения не
пропадают. В сущности, проблема была решена за счет введения неделимых
системный прерываний
up и down. Чтобы эти операции были неделимы,
операционная система должна запретить двум и более процессам
использовать один семафор одновременно. Если был сделан системный
вызов up или down, ни один другой код пользователя не будет запущен, пока
данный вызов не завершится. Для этого обычно во время выполнения
операций над семафорами вводится запрет на прерывания.
Технология с использованием семафоров работает для произвольного
количества процессов. Несколько процессов могут «спать», не завершив
131