
302 Глава 5. Синхронизация
тересуется входом в критическую область и в ответ посылает сообщение ОК им
обоим. Процессы
О
и 2 замечают конфликт и сравнивают отметки времени. Про-
цесс 2 видит, что проиграл, и разрешает доступ процессу
О,
посылая ему сообще-
ние
ОК.
Процесс
О
ставит ответ от процесса 2 в очередь для дальнейшей обработ-
ки и входит в критическую секцию, как показано на рис. 5.14, б. Когда процесс
О
заканчивает работу в критической области, он удаляет ответ 2 из очереди сооб-
щений и отправляет процессу 2 сообщение ОК, разрешая ему войти в критиче-
скую область, что и показано на рис. 5.14, в. Алгоритм работает, поскольку в слу-
чае конфликтов наименьшая отметка времени выигрывает, а с очередностью
отметок времени способен разобраться любой процесс.
Отметим, что показанная на рисунке ситуация могла бы в корне измениться,
если бы процесс 2 послал свое сообщение раньше, чем это сделал процесс
О,
и по-
лучил разрешение на доступ до создания своего ответа на сообщение от процесса 0.
В этом случае процесс 2, зная о том, что в момент отсылки ответа он находится в
критической области, просто поместил бы запрос от процесса
О
в очередь, не по-
сылая никакого ответа.
Как и централизованный алгоритм, который мы обсуждали ранее, распреде-
ленное взаимное исключение гарантировано от тупиков и зависаний. Число со-
общений, приходящихся на один процесс,
—
2(п-1), где п
—
общее число процес-
сов в системе. Больше нет единой точки, сбой в которой мог бы погубить всю
систему.
Однако, к сожалению, одна точка сбоя сменилась на п точек сбоев. Если ка-
кой-либо из процессов «рухнет», он не сможет ответить на запрос. Это молчание
будет воспринято (неправильно) как отказ в доступе и блокирует все последую-
щие попытки всех процессов войти в какую-либо из критических областей. По-
скольку вероятность того, что рухнет один из п процессов как минимум в п раз
больше, чем вероятность сбоя единственного координатора, мы пришли к тому,
что заменили слабый алгоритм в п раз худшим и требующим более интенсивного
сетевого трафика.
Этот алгоритм может быть исправлен тем же приемом, который мы использова-
ли ранее. Когда приходит запрос, его получатель посылает ответ всегда, разрешая
или запрещая доступ. Всякий раз, когда запрос или ответ утеряны, отправитель
выжидает положенное время и либо получает ответ, либо считает, что получа-
тель находится в нерабочем состоянии. После получения запрещения отправи-
тель ожидает последующего сообщения ОК.
Другая проблема этого алгоритма состоит в том, что либо должны использо-
ваться примитивы групповой связи, либо каждый процесс должен поддерживать
список группы самостоятельно, обеспечивая внесение процессов в группу, уда-
ление процессов из группы и отслеживание сбоев. Метод наилучшим образом
работает, когда группа процессов мала, а членство в группе постоянно и никогда
не меняется.
И, наконец, вспомним, что одной из проблем централизованного алгоритма
было то, что обработка всех запросов в одном месте могло стать его узким ме-
стом. В распределенном алгоритме все процессы вынуждены участвовать во всех
решениях, касающихся входа в критические области. Если один из процессов