Смекни!
smekni.com

Распределенные алгоритмы (стр. 54 из 85)

Все не-инициаторы приходят в состояние проигравший, но навсегда остаются в ожидании сообщений <tok,r>. Ожидание может быть прервано, если лидер посылает по кольцу специальный маркер, чтобы объявить об окончании выбора.

Алгоритм Чанга-Робертса [CR79] улучшает алгоритм ЛеЛанна, устраняя из кольца маркеры тех процессов, для которых очевидно, что они проиграют выборы. Т.е. инициатор p удаляет из кольца маркер <tok,q>, если q > p. Инициатор p становится проигравшим, когда получает маркер с идентификатором q < p, или лидером, когда он получает маркер с идентификатором p; см. Алгоритм 7.3.

var statep ;

begin if p - инициатор then

begin statep := cand ; send <tok,p> to Nextp ;

repeat receive <tok,q> ;

if q = p then statep := leader

else if q < p then

begin if statep = cand then statep := lost ;

send <tok,q> to Nextp

end

until statep = leader

end

else repeat receive <tok,q> ; send <tok,q> to Nextp ;

if statep = sleep then statep := lost

until false

end

(* Только лидер завершает выполнение программы. Он передает сообщение всем процессам, чтобы сообщить им идентификатор лидера и завершить их *)

Алгоритм 7.3 Алгоритм выбора Чанга-Робертса.

Теорема 7.5 Алгоритм Чанга-Робертса (Алгоритм 7.3) решает задачу выбора для колец, используя Q(N2) сообщений в наихудшем случае и O(N) единиц времени.

Доказательство. Пусть p0 - инициатор с наименьшим идентификатором. Все процессы являются либо не-инициаторами, либо инициаторами с идентификаторами большими p0, поэтому все процессы передают дальше маркер <tok,p0>, отправленный p0. Следовательно, p0 получает свой маркер обратно и становится выбранным.

Не-инициаторы не могут быть выбраны, т.к. все они приходят в состояние проигравший самое позднее, когда через них передается маркер p0. Инициатор p с p > p0 не может быть выбран; p0 не передаст дальше маркер <tok,p>, поэтому p никогда не получит свой собственный маркер. Такой инициатор p приходит в состояние проигравший самое позднее, когда через него передается маркер <tok,p0>. Таким образом доказано, что алгоритм решает задачу выбора.

Рис.7.4 Наихудший случай для алгоритма Чанга-Робертса.

Всего используется не более N различных маркеров и каждый маркер делает не более N переходов, что подтверждает границу сложности сообщений O(N2). Чтобы показать, что в самом деле можно использовать W(N2) сообщений, рассмотрим начальную конфигурацию, где все идентификаторы расположены в возрастающем порядке вдоль кольца (см. Рис. 7.4) и каждый процесс является инициатором. Маркер каждого процесса удаляется из кольца процессом 0, таким образом маркер процесса i совершает N-i переходов, откуда следует, что количество пересылок сообщений равно .

Алгоритм Чанга-Робертса не улучшает алгоритм ЛеЛанна в отношении временной сложности или наихудшего случая сложности сообщений. Улучшение касается только среднего случая, где усреднение ведется по всевозможным расположениям идентификаторов вдоль кольца.

Теорема 7.6 Алгоритм Чанга-Робертса в среднем случае, когда все процессы являются инициаторами, требует только O(N logN) пересылок сообщений.

Доказательство. (Это доказательство основано на предложении Friedemann Mattern.)

Предположив, что все процессы являются инициаторами, вычислим среднее количество пересылок маркера по всем круговым расположениям N различных идентификаторов. Рассмотрим фиксированное множество из N идентификаторов, и пусть s будет наименьшим идентификатором. Существует (N-1)! различных круговых расположений идентификаторов; в данном круговом расположении пусть pi - идентификатор, находящийся за i шагов до s; см. Рис. 7.5.

Рис.7.5 Расположение идентификаторов на кольце.

Чтобы вычислить суммарное количество пересылок маркера по всем расположениям, вычислим сначала суммарное количество пересылок маркера <tok,pi> по всем расположениям, а потом просуммируем по i. Маркер <tok,s> при любом расположении передается N раз, следовательно, он пересылается всего N(N-1)! раз. Маркер <tok,pi> передается не более i раз, так как он будет удален из кольца, если достигнет s. Пусть Ai,k - количество циклических расположений, при которых <tok,pi> передается ровно k раз. Тогда суммарное число пересылок <tok,pi> равно .

Маркер <tok,pi> передается ровно i раз, если pi является наименьшим из идентификаторов от p1 до pi, что имеет место в (1/i)*(N-1)! расположениях; итак

Маркер <tok,pi> передается не менее k раз (здесь k £ i), если за процессом pi следует k-1 процесс с идентификаторами, большими pi. Количество расположений, в которых pi - наименьший из k идентификаторов pi-k+1, ..., pi, составляет 1/k часть всех расположений, т.е. (1/k)*(N-1)!. Теперь, для k<i <tok,pi> передается ровно k раз, если он передается не менее, но и не более k раз, т.е. ³ k раз, но не ³ k+1 раз. В результате количество расположений, где это выполняется, равно , т.е. ( для k < i ).

Общее количество передач <tok,pi> во всех расположениях равно:

,

что равняется . Сумма известна как i-е гармоническое число, обозначаемое Hi. В качестве Упражнения 7.3 оставлено доказательство тождества .

Далее мы суммируем по i количество передач маркера, чтобы получить общее количество передач (исключая передачи <tok,s>) во всех расположениях. Оно равно

.

Добавляя N(N-1)! передач маркера для <tok,s>, мы получаем общее количество передач, равное

.

Т.к. это число выведено для (N-1)! различных расположений, среднее по всем расположениям, очевидно, равно N×HN, что составляет »0.69N logN (см. Упр.7.4).

7.2.2 Алгоритм Petersen / Dolev-Klawe-Rodeh

Алгоритм Чанга-Робертса достигает сложности сообщений O(N logN) в среднем, но не в наихудшем случае. Алгоритм со сложностью O(N logN) в наихудшем случае был дан Франклином [Franklin; Fra82], но этот алгоритм требует, чтобы каналы были двунаправленными. Petersen [Pet82] и Dolev, Klawe, Rodeh [DKR82] независимо разработали очень похожий алгоритм для однонаправленных колец, решающий задачу с использованием только O(N logN) сообщений в наихудшем случае. Алгоритм требует, чтобы каналы подчинялись дисциплине FIFO.

Сначала алгоритм вычисляет наименьший идентификатор и сообщает его каждому процессу, затем процесс с этим идентификатором становится лидером, а все остальные терпят поражение. Алгоритм легче понять, если представить, что он выполняется идентификаторами, а не процессами. Изначально каждый идентификатор активен, но на каждом круге некоторые идентификаторы становятся пассивными, как будет показано позднее. При обходе круга активный идентификатор сравнивает себя с двумя соседними активными идентификаторами по часовой стрелке и против нее. Если он является локальным минимумом, он остается в круге, иначе он становится пассивным. Т.к. все идентификаторы различны, идентификатор рядом с локальным минимумом сам не является локальным минимумом, откуда следует, что не менее половины идентификаторов выбывают из круга при каждом обходе. Следовательно, после не более чем logN кругов остается только один активный идентификатор, который и является победителем.

Рис.7.6 Процесс p получает текущие идентификаторы q и r.

Этот принцип может быть непосредственно реализован в двунаправленных сетях, как это сделано в алгоритме Франклина [Fra82]. В ориентированных кольцах сообщения можно посылать только по часовой стрелке, что затрудняет получение соседнего активного идентификатора в этом направлении; см. Рис. 7.6. Идентификатор q нужно сравнить с r и p; идентификатор r можно послать q, но идентификатор p нужно было бы передавать против направления каналов. Чтобы сравнить q и с r, и с p, идентификатор q передается (в направлении кольца) процессу, который имеет идентификатор p, а r передается не только процессу с идентификатором q, но и дальше, процессу с идентификатором p. Если q является единственным активным идентификатором в начале обхода круга, первый идентификатор, который q встречает при обходе, равен q (т.е. в этом случае p = q). Когда это происходит, идентификатор q выигрывает выборы.

Алгоритм для процессов в однонаправленном кольце обозначен как Алгоритм 7.7. Процесс p является активным в круге, если он в начале круга имеет активный идентификатор cip. Иначе p является пассивным и просто пропускает через себя все получаемые сообщения. Активный процесс посылает свой текущий идентификатор следующему активному процессу, и получает текущий идентификатор предыдущего активного процесса, используя сообщения <one,·>. Полученный идентификатор сохраняется (в переменной acnp), и если он не выбывает из круга, он будет текущим идентификатором p в следующем круге. Чтобы определить, остается ли идентификатор acnp в круге, его сравнивают с cip и активным идентификатором, полученным в сообщении <two,·>. Процесс p посылает сообщение <two,acnp>, чтобы следующий активный процесс мог провести такое же сравнение. Исключение возникает, когда acnp = cip; в этом случае остался один активный идентификатор и об этом сообщается всем процессам в сообщении <smal,acnp>.