d = e;
}
else break;
}
relay:
while (true)
{
receive(d);
send(d)
}
Из рассмотрения протокола следует, что первоначально каждый
процесс активен (active). В течение того времени, пока он активен,
процесс отвечает за определенное процессное число (сохраненное в
переменной d). Это значение может изменяться в ходе работы
протокола. Когда процесс определяет, что он не несет идентификатор
текущего лидера, он начинает уступать. Если процесс уступает (relay),
он передает сообщения слева направо прозрачным способом – без
просмотра или модификации их содержимого.
Каждый активный процесс посылает свою переменную d своему
соседу по часовой стрелке и потом ждет до тех пор, пока не получит
значение (e) от своего ближайшего активного соседа против часовой
стрелки. Если процесс получает свое собственное значение d, он
заключает, что остался единственный активный процесс и что это d в
действительности является идентификатором нового лидера, и
прекращает работу. (Отметим, что процесс сам по себе не обязан
становиться новым лидером!) В случае если принято другое значение
(e ≠ d), процесс ждет второго сообщения (f), содержащего значение d,
которое несет второй ближайший активный сосед против часовой
стрелки. Если значение ближайшего активного соседа против часовой
стрелки наибольшее среди e, f и d, то процесс обновляет свое
локальное значение (d := e). В противном случае он начинает
уступать. Таким образом, из любого множества активных соседей
один будет уступать в каждом раунде.
Для того чтобы проиллюстрировать, как работает протокол,
рассмотрим пример его запуска для четырех процессов с
идентификаторами 1 — 4, как показано на рис. 3.2. Здесь процессы
обозначаются вершинами, а коммуникационные каналы – стрелками.
Содержимое канала указано в метке возле стрелки, точка с запятой
используется для разделения различных сообщений. Каждая вершина
помечена тройкой, содержащей значения локальных переменных d, e
и f. Черная вершина обозначает, что процесс уступает, в противном
случае он активен.