Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

3.3.1. Состязательная ситуация

Некоторые операционные системы могут предоставлять для чтения и записи некие общие хранилища данных для совместно работающих процессов. Такое хранилище может либо размещаться в оперативной памяти, как структура данных ядра, либо быть представленным в виде общего файла. В качестве примера взаимодействия процессов рассмотрим простой пример — спулер печати, который присутствует практически в каждой операционной системе. При возникновении необходимости печати некоторого файла процесс помещает имя данного файла в специальный каталог спулера.

Другой процесс, который именуется демоном принтера, через определенные интервалы времени проверяет наличие фай¬лов для печати. Когда такие файлы в спулере имеются, демон принтера печатает их и затем удаляет их имена из каталога спулера.

Рис

Рис. 3.9. Одновременное стремление
двух процессов получить
доступ к общей памяти

Представим, что в каталоге спулера есть большое количество областей памяти, пронумерованных с 0. Каждая такая область может хранить имя файла, подготовленного для печати. Кроме этого, есть также общие переменные: out, которая указывает на следующий файл для печати, и in, которая указывает на следующую свободную для записи область в каталоге спулера. Допустим возникновение следующей ситуации, что в некоторый момент времени области от 0 до 3 не заняты, и процессы А и Б одновременно решают поставить свои файлы в очередь на печать. Данная ситуация представлена на рис. 3.9. Допустим, что процесс А считывает значение переменной in и сохраняет значение 7 в локальной переменной next_ free_slot, содержащей индекс следующей свободной области. После чего происходит прерывание по таймеру, и центральный процессор переключается на выполнение процесса Б. Процесс Б также считывает значение 7 из переменной in и сохраняет его уже в своей локальной переменной next_ free_slot. К данному моменту у каждого процесса имеется информация о том, что следующей доступной областью для записи имени файла будет область с индексом 7.

Затем процесс Б сохраняет имя своего файла в область 7 и присваивает переменной in значение 8, после чего возвращается к выполнению других не связанных со спулером действий. Очевидно, что в некоторый момент выполнение процесса А возобновится, причем с того места, где он был приостановлен. Процесс А считывает значение переменной next_free_slot, в которой находится число 7 и записывает в область 7 имя своего файла, тем самым затирая имя файла процесса Б. Затем он также инкрементирует переменную next_free_slot, получая значение 8 и присваивая его переменной in. Демон печати не заметит никаких нестыковок в каталоге спулера, но в описанной ситуации файл процесса Б не получит вывода на печать.

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

Предыдущий раздел Оглавление Следующий раздел