
5.5. Взаимное исключение 299
На рис. 5.12 мы видим, что происходит, когда два процесса, 2 и 5, одновре-
менно обнаруживают, что предыдущий координатор, процесс 7, перестал рабо-
тать.
Каждый из них строит сообщение
ГОЛОСОВАНИЕ
и запускает это сообще-
ние в путь по кольцу независимо от другого. В конце концов, оба сообщения
проходят все кольцо, и процессы 2 и 5 превращают их в сообщения
КООРДИ-
НАТОР,
которые пересылаются тем же элементам кольца и в том же порядке.
Когда эти сообщения, в свою очередь, совершают полный круг, они удаляются.
Больше не происходит ничего такого, что потребовало бы дополнительного об-
мена сообщениями. Даже в наихудшем случае все проделанное столь незначи-
тельно загружает сеть, что это нельзя назвать расточительством.
5.5. Взаимное исключение
Системы, состоящие из множества процессов, обычно проще всего программиро-
вать,
используя критические области. Когда процесс нуждается в том, чтобы счи-
тать или обновить совместно используемые структуры данных, он сначала вхо-
дит в критическую область, чтобы путем взаимного исключения убедиться, что
ни один из процессов не использует одновременно с ним общие структуры дан-
ных. В однопроцессорных системах критические области защищаются семафорами,
мониторами и другими конструкциями подобного рода. Теперь мы рассмотрим
несколько примеров того, как именно критические области и взаимные исключе-
ния реализуются в распределенных системах. Описание этих методов и библио-
графию по ним можно найти в [373, 420].
5.5.1.
Централизованный алгоритм
Наиболее простой способ организации взаимных исключений в распределенных
системах состоит в том, чтобы использовать методы их реализации, принятые в
однопроцессорных системах. Один из процессов выбирается координатором (на-
пример, процесс, запущенный на машине с самым большим сетевым адресом).
Каждый раз, когда этот процесс собирается войти в критическую область, он по-
сылает координатору сообщение с запросом, в котором уведомляет, в какую кри-
тическую область он собирается войти, и запрашивает разрешение на это. Если
ни один из процессов в данный момент не находится в этой критической области,
координатор посылает ответ с разрешением на доступ, как показано на рис.
5.13,
а.
После получения ответа процесс, запросивший доступ, входит в критическую об-
ласть.
Предположим теперь, что другой процесс, 2, запрашивает разрешение на вход
в ту же самую область (рис. 5.13, б). Координатор знает, что в этой критической
области уже находится другой процесс, и не дает разрешения на вход. Конкрет-
ный способ запрещения доступа зависит от особенностей системы. На рис. 5.13, б
координатор просто не отвечает, блокируя этим процесс 2, который ожидает от-
вета. Он также может послать ответ, гласящий «доступ запрещен». В любом случае
он ставит запрос от процесса 2 в очередь и ожидает дальнейших сообщений.