135
В этом случае между процессами “поставщик” и “потребитель” будем
иметь очередь заполненных буферов, содержащих сообщения. Когда “по-
ставщик” хочет послать очередное сообщение, он добавляет в конец этой
очереди еще один буфер. “Потребитель”, чтобы получить сообщение, за-
бирает из очереди буфер, который стоит в ее начале. Такое решение, хотя
и кажется тривиальным
, требует, чтобы “поставщик” и “потребитель”,
синхронизировали свои действия. Например, они должны следить за ко-
личеством свободных и заполненных буферов. “Поставщик” может пере-
давать сообщения только до тех пор, пока имеются свободные буферы.
Аналогично, “потребитель” может получать сообщения только если оче-
редь не пуста. Ясно, что для учета заполненных и свободных
буферов
нужны разделяемые переменные, поэтому для сотрудничающих процес-
сов, как и для конкурирующих, тоже возникает необходимость во взаим-
ном исключении.
Таким образом, до окончания обращения одной задачи к общим пере-
менным следует исключить возможность обращения к ним другой задачи.
Эта ситуация и называется взаимным исключением. Другими словами,
при организации различного рода
взаимодействующих процессов прихо-
дится организовывать взаимное исключение и решать проблему коррект-
ного доступа к общим переменным (критическим ресурсам). Те места в
программах, в которых происходит обращение к критическим ресурсам,
называются критическими секциями или критическими интервалами
(Critical Section – CS). Решение этой проблемы заключается в организации
такого доступа к критическому ресурсу, когда только одному процессу
разрешается входить в критическую секцию. Данная задача только на пер-
вый взгляд кажется простой, ибо критическая секция, вообще говоря, не
является последовательностью операторов программы, а является процес-
сом, то есть последовательностью действий, которые выполняются этими
операторами. Другими словами, несколько процессов, которые выполня-
ются по одной и той же программе, могут
выполнять критические интер-
валы, базирующиеся на одной и той же последовательности операторов
программы.
Когда какой-либо процесс находится в своем критическом интервале,
другие процессы могут, конечно, продолжать свое исполнение, но без
входа в их критические секции. Взаимное исключение необходимо только
в том случае, когда процессы обращаются к разделяемым, общим данным.
Если
же они выполняют операции, которые не приводят к конфликтным
ситуациям, они должны иметь возможность работать параллельно. Когда
процесс выходит из своего критического интервала, то одному из осталь-
ных процессов, ожидающих входа в свои критические секции, должно
быть разрешено продолжить работу (если в этот момент действительно
есть процесс в состоянии ожидания
входа в свой критический интервал).