Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Dijkstra-Scholten Алгоритм

Алгоритм Dijkstra и Scholten [DS80] обнаруживает завершение централизованного основного вычисления (называемого диффузийным вычислением в [DS80]). Инициатор основного вычисления (называемого окружением в [DS80]), также играет специальную роль в алгоритме обнаружения и обозначается p0.

Алгоритм обнаружения динамически поддерживает дерево вычислений T = (VT, ET) со следующими двумя свойствами.

(1) T пусто или T - направленное дерево с корнем p0.

(2) Множество VT  включает все активные процессы и все основные сообщения, находящиеся в процессе передачи.

Инициатор p0 вызывает алгоритм объявления когда p 0 Ï VT согласно первому свойству, T пусто в этом случае, и согласно второму свойству, предикат term принимает значение истина.

Для сохранения свойств дерева вычислений во время выполнения основного вычисления, T должно расширятся при отправке основного сообщения или при переходе процесса, не принадлежащего дереву, в активное состояние. Когда p посылает основное сообщение (mes), (mes) вставляется в дерево, и отцом (mes) является p. Когда процесс p, не принадлежащий дереву, становится активным получая сообщения от q, q становится отцом p. Для того, чтобы представить отправителя сообщения явно, основное сообщение (mes) послаемой q будем обозначать (mes, q).

Удаление узлов из T также необходимо по двум причинам. Во первых, основное сообщение удаляется после его получения. Во вторых, для того чтобы гарантировать продвижение алгоритма обнаружения дерево должно быть опустошено за конечное число шагов после завершения.

 

var statep: (active, passive) init if p = p0 then active else passive;

 sсp : integer           init 0;

 fatherp: P                    init if p == p0 then p else udef;

 

S p: { statep = active }

  begin send (mes, p); scp:= scp + 1 end

 

R p: { сообщение (mes, q) прибывает в p }

  begin receive (mes, q);, statep:= active;,

            if fatherp = udef then fatherp:= q else send (sig, q) to q

  end

I p: { statep = active }

begin statep:= passive;

           if scp = 0 then (* Удаляем p из T *)

                begin if fatherp = p then Announce else send (sig, fatherp) to fatherp;

                           fatherp:= udef

                end

  end

A p: { Сигнал (sig,p) прибывает в p }

begin receive (sig,p); scp:= scp -1;

            if scp = 0 and statep = passive then

                 begin if fatherp = p then Announce else send (sig, fatherp) to fatherp;

                            fatherp:= udef

                 end

end

Алгоритм 8.3 dijkstra-scholten алгоритм.

 

Сообщения - листья T; процессы поддерживают переменную, которая считает число их сыновей в T. Удаление сына процесса p происходит в другом процессе q; это происходит при получении сообщения сына или удалении сына процесса q. Для того, чтобы предотвратить искажение данных счетчика сына p, процессу p посылается сигнальное сообщение (sig, p) об удалении его сына. Это сообщение заменяет удаленного сына p, и его удаление, т.е. получение, происходит в процессе p и p при получении сигнала уменьшает на единицу счетчик сыновей.

Алгоритм описан как Алгоритм 8.3. Каждый процесс p имеет переменную fatherp, которая не определена если pÏV T , равна p если p является корнем, и является отцом p, если p - не корень в T. Переменная sc p содержит число сыновей p в T.

Доказательство правильности строго устанавливает, что граф T, как определено, является деревом и что он становится пустым только после завершения основного вычисления. Для любой конфигурации g Алгоритма 8.3, определено

V T = {p: fatherp ¹ udef} È {передается (mes, p) } È {передается (sig ,p) }

И

ET = {(p, fatherp): fatherp ¹ udef Ù fatherp ¹ p }

            È { ((mes, p), p): (mes, p) передается }È{((sig,p), p): (sig, p) передается }.

Безопасность алгоритма следует из утверждения P, определенного следующим образом

P º statep = active Þ p Î V p                                            (1)

           Ù (u, v) Î ET Þ u ÎV T Ù v Î VT  Ç P      (2)

           Ù sc p = # { v: (v, p) ÎE T }                         (3)

           Ù V T ¹ Æ Þ T дерево с корнем p 0        (4)

           Ù (state p = passive Ù s cp = 0) Þ p Ï V T (5)

 

Значение этого инварианта следующие. По определению, множество узлов T включает все сообщения (основные и управляющие), и согласно пункту (1) оно также включает все активные процессы. Пункт (2) скорее технический; он заявляет, что T - действительно граф, и все ребра направлены к процессам. Пункт (3) выражает правильность счетчика сыновей каждого процесса, и пункт (4) заявляет, что T - дерево, и p0 - корень. Пункт (5) используется, чтобы показать, что дерево действительно разрушается, если основное вычисление заканчивается. Для доказательства правильности, обратите внимание, что из P следует, что fatherp = p только для p = p0.

Lemma 8.4 P - инвариант Dijkstra-Scholten алгоритма.

Доказательство. Первоначально statep = passive для всех p ¹ p0 и fatherp0 ¹ udef, который доказывает пункт (1). Также, E T = Æ, что доказывает (2). Так как sc p = 0 для каждого p, удовлетворяется (3). V T = {po} и E T = Æ, таким образом T - дерево с корнем p0, что доказывает (4). Единственный процесс в V T - p 0, и p 0 активен.

S p: Никакой процесс не становится активным в S p, и никакой процесс не удаляется из VT, так что (1) сохраняется.

Применимость действия означает, что p, отец нового узла (mes, p), находится в VT, что доказывает, что (2) сохраняется. В результате действия, VT  дополняется узлом (mes, p) и ET  дугой ((mes, p), p), что означает, что T остается деревом, и sc p правильно увеличивается, чтобы представить нового сына p, следовательно (3) и (4) сохраняются.

Никакой процесс не становится пассивным листом, и никакой процесс не вставлен в VT, таким образом (5) сохраняется.

 

R p: Или p уже был в VT (fatherp ¹ udef) или p вставлен в VT  после действия, таким образом (1) сохраняется.

Если значение fatherp определено, его новое значение - q, и если сигнал послан процессом p, его отец - также q, и q находится в VT, таким образом (2) сохраняется. Число сыновей q не изменяется, потому что сын (mes, q) процесса q заменяется сыном p или сыном (sig, q), так что s cq остается правильным, который сохраняет (3).

Структура графа не изменяется, таким образом (4) сохраняется. Процесс p находится в VT после действия в любом случае, таким образом (5) сохраняется.

I p: Переход p в пассивное состояние сохраняют (1), (2), (3) и (4). Из того, что p был прежде активен следует, что p был в VT. Если sc p = 0, p удаляется из VT, таким образом (5) сохраняется.

Затем мы рассматриваем что случится при удалении p из T, то есть, если p окажется пассивным листом T.

Если сигнал посылается процессом p, отец сигнала - последний отец p, который находится в VT, следовательно (2) сохраняется. В этом случае, сигнал заменяет p как сын процесса fatherp, следовательно father father pостается правильным, и (3) сохраняется. Структура графа не изменилась, следовательно (4) сохраняется.

Иначе, то есть, если fatherp = p, p = p0 и p, являющийся листом, означает, что p был единственным узелом T, так что удаление опустошает T, что сохраняет (4).

A p: Получение сигнала уменьшает число сыновей p на единицу, и присваивание значения на sc p гарантируетсохранение (3). То, что p был отецом сигнала, означает, что p был в VT. Если statep = passive и после получения sc p присваивается 0, p удаляется, таким образом сохраняется (5). Если p удаляется из VT, инвариант сохраняется по тем же причинам, что и для действия I p. o

 

Теорема 8. 5 Dijkstra-Scholten алгоритм (Алгоритм 8.3) - правильный алгоритм обнаружения завершения и использует М управляющих сообщений.

Доказательство. Пусть S сумма всех счетчиков сыновей, то есть, S = SpÎ P sc p . Первоначально S = 0, S увеличивается на единицу при посылке основного сообщения (в S p), S - уменьшается на единицу, когда получается управляющее сообщение (в A p), и S никогда не становится отрицательным (из (3)). Это означает, что число управляющих сообщений никогда не превышает число основных сообщений в любом вычислении.

Чтобы доказать живость алгоритма, предположим, что основное вычисление закончилось. После завершения только действия A p может иметь место и т.к. S уменьшается на единицу при каждом таком переходе, алгоритм достигает конечной конфигурации. Заметьте, что в этой конфигурации, VT не содержит никакие сообщения. Также, из (5), VT не содержит никаких пассивных листьев. Следовательно, T не имеет никаких листьев, что означает, что T пусто. Дерево стало пустым, когда p 0 удалил себя, и программа такова, что p 0 на этом шаге вызывает алгоритм объявления.

Чтобы доказать безопасность, обратите внимание, что только p 0 вызывает алгоритм объявления, и делает это после того, как удаляет себя из VT. Из (4), T пусто, когда это случается,что заключает в себе term. o                                                                                       

Dijkstra-Scholten алгоритм достигает привлекательного баланса между передачей основных и управляющих сообщений; для каждого основного сообщения, посланного от p в q алгоритм посылает точно одно управляющее сообщение от q в p. Передача управляющих сообщений имеет нижнюю границу представленную в Теореме 8.2, так что алгоритм является оптимальным алгоритмом обнаружения завершения централизованных вычислений для худшего случая.

В описании этого подраздела, все сообщения содержат явное указание на их отца, но обычно это не является необходимым, потому что отец основных (управляющих) сообщений всегда их отправитель (адресат).

 

8.2.2 Алгоритм Shavit-Francez

Dijkstra-Scholten алгоритм был обобщен для децентрализованных основных вычислений Shavit и Francez [SF86]. В их алгоритме, граф вычисления - лес, каждое дерево которого имеет в качестве корня инициатора основного вычисления. Дерево с корнем p обозначается Tp.

Алгоритм поддерживает граф F = (Vp , Ep), такой что (1) F является пустым или F - лес, каждое дерево которого имеет в качестве корня инициатора; (2) Vp включает все активные процессы и все основные сообщения. Как в алгоритме Dijkstra-Scholten завершении обнаруживается, когда граф становится пустым. К сожалению, в случае леса не так просто выяснить,является ли граф пустым. Действительно, свойство дерева вычислений иметь в качестве корня инициатора означает, что пустота дерева замечается корнем, который и вызывает алгоритм объявления. В случае леса, каждый инициатор замечает пустоту только собственного дерева, но это не означает, что весь леса пуст.

Проверка пустоты всех деревьев выполняется отдельной волной. Лес поддерживает дополнительное свойство, что если дерево Tp стало пустым, оно остается пустым и после этого. Обратите внимание, что это не мешает p стать активным; если p становится активным после разрушения дерева, p вставляется в дерево другого инициатора. Каждый процесс участвует в волне только, если его дерево разрушилось; когда волна принимает решение, вызывается алгоритм объявления. (вызов объявления не нужен, если выбранный волновой алгоритм генерирует решение в каждом процессе; в этом случае, процесс просто останавливается после принятия решения и завершения волнового алгоритма.)

Алгоритм дается как Алгоритм 8.4, в котором волновой алгоритм не показан явно. Каждый процесс p имеет переменную f atherp , которая не определена, если PÏV T, и равна p если p является корнем или равна отцу p, если p не-корень в F. Переменная sс p содержит число сыновей p в F. Логическая переменная empty истинна, тогда и только тогда, когда дерево p пусто.

Доказательство правильности алгоритма подобно доказательству Dijkstra-Scholten алгоритма. Для любой конфигурации g Алгоритма 8.4, определим

VF = {p: fatherp ¹ udef} U {передается (mes, p) } U {передается (sig,p) }

И 

Ep = {(P, fatherp): fatherp ¹ udef Ù fatherp ¹ p}

          U {((mes, p), p): (mes, p) передается } U {((sig,p}, p): (sig,p} передается }.

Безопасность алгоритма будет следовать от утверждения Q, определенный ниже. Это инвариант алгоритма, и доказательство инвариантности подобно доказательству Lemma 8.4. Значение пунктов (1)-(5) из Q такие же как для инварианта алгоритма Dijkstra-Scholten и пункт (6) выражает тот факт, что каждый процесс правильно отслеживает,является ли он все еще корнем дерева в лесе. Конечно, лес пуст, если никакой процесс не является корнем.

 

 

Q Û statep = active Þ p Î V F                    (1)

Ù (u, v) Î E F Þ u Î VF Ù   v ÎV F  Ç  P         (2)

Ù sc p = # { v: (v, p) Î Ep }                     (3)

Ù  V F ¹ Æ Þ F is a forest                      (4)

Ù   (state p = passive A s cp = 0) Þ p Ï Vp (5)

Ù emptyp Û Tp is empty                       (6)

 

Lemma 8.6 Q - инвариант Shavit-Francez алгоритма.

Доказательство. Первоначально statep = passive для каждого не-инициатора p, и fatherp = p для каждого инициатора p, что доказывает (1). Также, Ep = Æ, что доказывает (2). Так как sc p = 0 для каждого p, (3) удовлетворяется. V F = {p: p -инициатор} и E F = Æ, так что F - лес, состоящий из деревьев, содержащих один узел для каждого инициатора, что доказывает (4). Процессы в VF - инициаторы, которые являются активными; это доказывает (5). Первоначально emptyp равны (p - не-инициатор) и Tp действительно пуст, тогда и только тогда, когда p - не инициатор, что доказывает (6).

S p: Никакой процесс не становится активным в S p, и никакой процесс не удаляется из VF, таким образом (1) сохраняется.

Применимость действия означает, что p, отец нового узла, находится в VF, таким образом (2) сохраняется.

В результате действия, VF пополняется вершиной (mes, p) и E F ребром ((mes, p), p), что означает, что F остается лесом, и s cp правильно увеличивается на единицу, чтобы представить наличие нового сына процесса p, таким образом (3) и (4) сохраняются.

Никакой процесс не становится пассивным листом, и никакой процесс не вставляется в VF, таким образом (5) сохраняется.

Поскольку новый лист добавлен в не-пустое дерево, никакое дерево не становится непустым, и поскольку ни одна переменная empty не изменяется, (6) сохраняется.

R p: p уже был в V F (fatherp ¹ udef) или p вставлен после действия, таким образом (1) сохраняется.

Если значение fatherp определено, его новое значение - q, и если послан сигнал, его отец также q, и q находится в V T , таким образом (2) сохраняется.

Число сыновей процесса q не изменяется, потому что сын (mes, q) процесса q заменяется сыном p или сыном (sig, q), таким образом sc q оставляет правильным (3).

Структура графа не изменяется, таким образом (4) сохраняется. Никакой процесс не становится пассивным листом, и никакой процесс не вставляется в VF, таким образом (5) сохраняется.

Никакое дерево не становится пустым, следовательно (6) сохраняется.

I p: Перевод p в пассивное состояние сохраняет (1), (2), (3), и (4). То, что p прежде был активен означает, что p был в VF. Если sc p = 0, p удаляется из VF, таким образом (5) сохраняется.

Затем мы рассмотрим что случится, если p удалить из F, то есть если p окажется, пассивным листом F. Если послан сигнал, отец сигнала - последний отец процесса p, который находится в VF, следовательно (2) сохраняется. В этом случае, сигнал заменяет p на сына процесса fatherp, следовательно sc father p остается правильным, и (3) сохраняется. Структура графа не изменилась, следовательно (4) сохраняется. Никакое дерево не становится пустым, таким образом (6) сохраняется. Иначе, то есть, если fatherp = p, p был корнем и то, что  p является листом означает, что p единственная иуршина в Tp , таким образом ее удаление делает T p пустым и присваивание emptyp сохраняет (6).

 

 

var statep: (active, passive)   init if p is initiator then active else passive;

sc p  : integer                   init 0;

fatherp  : P                           init if p is initiator then p else udef;

emptyp: boolean                init if p is initiator then false else true;

   

S p: { statep = active }

begin send (mes, p); sc p:= scp + 1 end

R p: { Сообщение (mes, q) пришло в p }

  begin receive (mes, q); statep:= active;

            if fatherp = udef then fatherp:= q else send (sig, q) to q

  end

 

I p: { statep = active }

begin statep:= passive;

          if sc p = 0 then (* Delete p from F *)

             begin if fatherp = p then emptyp:= true else send (sig, fatherp } to fatherp;

                        fatherp:= udef

            end

End

A p: { Сигнал (sig,p) пришел в p }

  begin receive (sig,p); sc p:= scp - 1;

            i f sc p = 0 and statep = passive then

               begin if fatherp = p then emptyp:= true else send (sig, fatherp) to fatherp;

                          fatherp:= udef

               end

   end

 

Процессы одновременно выполняют волновой алгоритм, в котором посылка или принятие решения процессом p разрешается только, если emptyp истина и тогда decide вызывает алгоритм объявления.

Алгоритм 8.4 shavit-francez алгоритм.

 

A p: получение сигнала уменьшает число сыновей процесса p на единицу, и присваивание scp гарантирует, что (3) сохраняется. То, что p был отцом сигнала означает, что p был в VF. Если statep=passive и после получение сигнала scp = 0, p удаляется, таким образом (5) сохраняется.

Если p удаляется из VF, инвариант сохраняется по тем же причинам, что и при действии I p.

 

Теорема 8.7 Алгоритм Shavit-Francez (Алгоритм 8.4) - правильный алгоритм обнаружения завершения и использует М + W управляющих сообщени.

Доказательство. Также как в Теореме 8.5 можно показано, что число сигналов не превышает число основных сообщений. Помимо сигналов, управляющий алгоритм только посылает сообщения для одной волны. Из этого следует, что послано не более М + W управляющих сообщений.

Чтобы доказать живость алгоритма предположим, что основное вычисление закончилось. За конечное число шагов алгоритм обнаружения завершения достигает конечной конфигурации, и можно показать, как это было сделано в Теореме 8.5, что в этой конфигурации F пуст. Следовательно, все события волны возможны в каждом процессе, и то, что конфигурация является конечной теперь означает, что все события волны были выполнены, включая по крайней мере одно принятие решения, при котором был вызван алгоритм объявления.

Чтобы доказывать безопасность, обратим внимание на то, что алгоритм объявления вызывается после принятия решения в волновом алгоритме. Это означает, что каждый процесс p послал сообщение волны или принял решение, и из алгоритма следует, что empty p истина, когда p сделает это. Никакое действие не присваивает переменной empty значение ложь повторно, так что (для каждого p) emptyp  истина, когда вызывается алгоритм объявления. Из (6), V F пусто, что имеет следствием term. o

Число управляющих сообщений, используемых алгоритмом Shavit-Francez имеет тот же порядок, что и нижнии границы, выведенные в Теоремах 8.2 и 8.3. Алгоритм является оптимальным алгоритмом для обнаружения завершения децентрализованных вычислений для худшего случая (если используется оптимальный волновой алгоритм).

Применение алгоритмов, рассматриваемых в этом разделе требует, чтобы каналы связи были двунаправленными; для каждого основного сообщения, посланного от p в q сигнал должен быть послан от q в p. Сложность с средним случаем равняется сложности в худшем случае; каждое выполнение требует одного сигнального сообщения на одно основное сообщение и, в случае Shavit-Francez алгоритма, точно одного выполнение волны. 

 

 

8.3 Решения, основанные на волнах

По двум причинам полезно рассмотреть некоторые другие алгоритмы для обнаружения завершения кроме двух алгоритмов, данных в Разделе 8.2. Во первых,

Описанные алгоритмы могут использоваться только когда каналы двунаправленные. Во вторых, хотя сложность по сообщениям этих алгоритмов оптимальна в худшем случае, существуют алгоритмы, которые имеют лучшую сложность в среднем случае. Алгоритмы предыдущего раздела используют их число сообщений в наихудшем случае в каждом выполнении.

В этом разделе будут изучаться некоторые алгоритмы, основанные на повторном выполнении алгоритма волны; в конце каждой волны, либо обнаружевается завершение, либо начинается новая волна. Завершение обнаружено, если локальное условие окажется удовлетворенным в каждом процессе.

Сначала мы рассмотрим конкретные примеры алгоритмов, в которых во всех случаях волновой алгоритм является кольцевым алгоритмом. Для этого предположим, что кольцо вложено как подтопология сети; но обмен основными сообщениями не ограничен каналам, принадлежащими к кольцу. Процессы перенумерованы с po до pN -1 и кольцевой алгоритм начинается процессом po, посылая маркер процессу pN -1. Процесс p i + 1 (для i < N -1) передает маркер процессу p i. Передвижение маркера заканчивается, когда маркер получает процесс p 0.

Первое решение, обсуждаемое в этом классе - алгоритм Dijkstra, Feijen, и Van Gasteren (Подраздел 8.3.1); этот алгоритм обнаруживает завершение вычислений с синхронным прохождением сообщений. Несколько авторов обобщили алгоритм для вычислений с асинхронным прохождением сообщений; главная проблема здесь состоит в том, чтобы проверить, что каналы связи пусты. Мы обсуждаем решение Safra (Подраздел 8.3.2), в котором в каждом процессе подсчитывается число сообщений, которые посланы и получены; сравнивая счетчики можно определить действительно ли каналы являются пустыми. Также возможно использовать подтверждения для этой цели (Подраздел 8.3.3); но это решение снова требует, чтобы каналы были двунаправленными и чтобы число управляющих сообщений равнялось по крайней мере числу, используемому алгоритмом Shavit-Francez.

В Подразделе 8.3.4 принцип обнаружения будет обобщен для использования произвольного волнового алгоритма.

 

 

8.3.1 Алгоритм Dijkstra-Feijen-Van Gasteren

Алгоритм Dijkstra, Feijen, и Van Gasteren [DFG83] обнаруживает завершение основного вычисления, используя синхронное прохождение сообщений; действия такого вычисления даются как Алгоритм 8.5. В этих вычислениях, завершение описано с помощью предиката

term Û "p: state p = passive

term Û "p: statep = passive

 

var statep: (active, passive);,

     

C pq: { statep = active }

    begin (* p посылает основное сообщение, которое получает q *)

             statep:= active

    end

I p: { statep = active }

  begin statep:= passive end

Алгоритм 8.5 основной алгоритм с синхронными сообщениями.

 

Сравните алгоритм и term с Алгоритмом 8.1 и Теоремой 8.1.

Алгоритм разработан как последовательность небольших шагов, каждый шаг прост для понимания, и правильность следует из инварианта, который разработан вместе с алгоритмом. Обработка взята из [DFG83]. Обзначим номер процесса, содержащего маркер t, или если маркер находится в процессе передачи, номер процесса, к которому направляется является маркер. Отправление маркера может быть выполнено только процессом pt, при этом t уменьшается на 1. Волна заканчивает когда t = 0; следовательно инвариант P должен быть выбран такой, что можно было сделать заклющение о наличии завершения из P, t = 0, и другой информации в p0. Инвариант должен сохранятся, когда p 0 начинает волну, то есть, когда t = N - 1.  

Сначала положим P = P0, где

 

P 0 º " i (N > i> t): statep = passive.

Действительно, P 0 истинен когда t = N - 1, и если t = 0 и statep p0 = passive, из этого утверждения можно сделать заключение о завершение. Отправление маркера сохраняет P 0, если только маркер отправляют пассивные процессы, поэтому мы принимаем следующее правило.

Правило 1. Процесс только тогда управляет маркером, когда он пассивен.

В этом режиме, P сохраняется с помощью отправления маркера и также с помощью внутренних действи1; к сожалению, P не сохраняется действиями связи. Предикат P0 может принимать значение ложь, когда процесс pj активизируется процессом pi, где j > t и i£ t; см. Упражнение 8.4. Так как P0 может принять значение ложь, P заменяется более слабым утверждением (P0 Ú P1), где P1 выбирается так, что каждый раз когда P0 принимает значение ложь, P1 является истинным. Каждому процессу присваивается цвет, белый или черный, и пусть P = (P0 Ú P1) где

P1 º$ j (t ³ j ³ 0): color pj = black.

Каждый раз, когда P0  принимает значение ложь, P1 является или становится истинным, если цвет посылающего процесса черный.

 

Правило 2. Посылающие процессы становятся черными.

Так как (P Ù color p0 = white Ù t = 0) Þ Ø P1, все еще возможно обнаружить завершение с новым инвариантом, а именно, смотря является ли p0 белым (и пассивным) когда он обрабатывает маркер.

Ослабление P   предотвращает обращение предиката в ложь при совершении собыий получения и передачи сообщений; но более слабое утверждение может принять значение ложь при отправлении маркера, а именно, если процесс t - единственный черный процесс и он передает маркер. Ситуация исправляется дальнейшим ослаблением P. Пусть маркер тоже имеет цвет (белый или черный), и P ослабим до (P0 Ú P1 Ú P2), где

P 2º маркер черный.

Отправление маркера сохраняет P 2, если черные процессы отправляют черный маркер.

 

Правило 3. Когда черный процесс отличный от p 0 посылает маркер, маркер становится черным.

Так как (маркер белый) Þ Ø P2, завершение все еще может обнаружиться процессом p 0, а именно, по тому получает ли он белый маркер (и белый ли он сам и пассивный).

Действительно, теперь можно проверить, что внутренние действия, основная соммуникации, и отправление маркера сохраняют P. Присвоение маркеру черного цвета представляет явление неудачных волн; завершение не может быть определено процессом p 0, если возвращающийся маркер черный. Если волна заканчивается неудачно, должна быть начата новая.

Правило 4. Когда волна заканчивается неудачно, p 0 начинает новую волну.

Следующая волна будет конечно столь же неудачна как предшествующая, если нет никакого способа черным процессам стать белыми снова; действительно, черные процессы были окрашивают маркер в черный цвет при его отправлении, поэтому следующая волна также заканчивается неудачно.

Заметьте, что процесс p, окрашивающий маркер в белый цвет, не изменяет значение  P на ложь если i > t, и P всегда принимет значение истина, когда p0 начинает волну, посылая маркер к PN - 1. Из этого следует, что окрашивание в белый цвет может благополучно иметь место при отправления маркера.

Правило 5. Каждый процесса становиться белым сразу после посылки маркера. Это гарантирует конечный успех волны после завершения основного вычисления. Алгоритм дается как Алгоритм 8.6.

 

 

var statep: (active, passive);

colorp: (white, black);

 

C pq: { statep = active }

   begin (* p посылает основное сообщение, которое получает q *)

              color p:= black; (* Правило 2 *)

             state q := active

   end

 

I p: { statep = active }

  begin statep:= passive end

Начало обнаружения, исполняется один раз процессом p 0:

  begin send (tok, white) to pN - 1 end

 

T p: (* Процесс p обрабатывает маркер (tok,c) *)

{ statep == passive } (* Правило I *)

begin if p = p 0

              then if (c = white Ù colorp = white)

                          then Announce

                         else send (tok, white} to p N -1 (* Правило 4 *)

              else if (colorp = white)  (* Правило 3 *)

                         then send (tok, c ) to Nextp

                         else send (tok, black) to Nextp;

            color p:= white (*Правило 5 *)

  end

Алгоритм 8.6 dukstra-feuen-van gasteren алгоритм.

 

Теорема 8.8 Dijkstra-Feijen- Фургон Gasteren алгоритм (Алгоритм 8.6) - правильный алгоритм обнаружения завершения для основных вычислений, использующих синхронное прохождение сообщений.

Доказательство. Предикат P º (P 0 Ú P 1 Ú P 2 ) и алгоритм были разработаны таким образом, что P является инвариантом алгоритма. Завершение считается обнаруженным когда пассивный, белый p 0 обрабатывает белый маркер. Действительно, при этом из цвета маркера следует, что Ø P2 , из цвета процесса p 0  и из t = 0 следует ØP1 , а из P 0 и состояния p 0 следует term. Следовательно алгоритм безопасен.

Чтобы доказать живость, предположим, что основное вычисление закончилось. После этого, все процессы отправляют маркеры без задержки, сразу после того, как их получают. Когда маркер заканчивает первый полный обход, начатый после завершения, все процессы окрашены в белый цвет и после того, как маркер заканчивает следующий обход, обнаруживается завершение. o

Теперь мы попытаемся оценить число управляющих сообщений, используемых алгоритмом. Основное вычисление, используемое в доказательстве Теоремы 8.2 заставляет алгоритм использовать по крайней мере один обход маркера для каждых двух основных сообщений; следовательно сложность алгоритма в худшем случае - ½ N.M управляющих сообщений; см. Упражнение 8.5.

Алгоритм может использовать значительно меньшее количество сообщений в "среднем" основном вычислении. Предположим, что основное вычисление имеет сложность по времени T. Т.к. маркер всегда отправляется последовательно, не неблагоразумно предположить, что маркер отправляется приблизительно T раз прежде, чем заканчивается основное вычисление. (Даже эта оценка может быть слишком пессимистичной, т.к. отправление маркеров приостановлено в активных процессах.) Т.к. маркер отправляется менее чем 3N раза после завершения, алгоритм в этом случае использует T + 3N управляющих сообщений. Сложность основного вычисления - по крайней мере T (а именно, сложность по времени), но если вычисление содержит достаточный параллелизм, сложность сообщения может достигать Ω (N.T). Если параллелизм позволяет каждому процессу посылать постоянное число сообщений в единицу времени, сложность по сообщениям основного вычисления - N.T. a, то есть Ω (N.T). Число управляющих сообщений, который является 0 (N + T), тогда намного лучше чем можно ожидать от сложности обнаружения завершения в худшем случае.

 

8.3.2 Подсчет Основных Сообщений: Алгоритм Сафра

Синхронность прохождения сообщений, принятая для основного вычисления в алгоритме Dijkstra-Feijen-Van Gasteren - серьезное ограничение для его общего применения. Несколько авторов обобщили этот алгоритм для вычислений с асинхронным прохождением сообщений (cf. Алгоритм 8.1). В данном подразделе будет обсуждено решение Сафра [Dij87]; в нем сложность в среднем случае сопоставима с сложностью алгоритма Dijkstra-Feijen-Van Gasteren.

Определим для каждой конфигурации число сообщений находящихсы в процессе передачи как B. Тогда term эквивалентен

("p: statep = passive) Ù B = 0.

Снова инвариант P будет составлен так, что завершение можно будет определить из P, t = 0, и другой информации из p 0. Инвариант должен сохраняться, когда p 0 начинает волну, то есть, когда t = N - 1.

Чтобы информация о B была доступна в процессах (распределенным способом), процесс p снабжается счетчеком сообщений mc p , и процессы поддерживают P m как инвариант, где

P m º B= S p Î P  m cp.

Инвариант Pm  получен, когда первоначально mcp = 0 для каждого p, и процессы подчиняются следующему правилу.

Правило М. Когда процесс p посылает сообщение, счетчик сообщений увеличивается на 1; когда процесс p получает сообщение, счетчик сообщений уменьшается на 1.

Инвариант должен позволять p 0 решать,что содержит term, когда он получает маркер (t = 0). Т.к. term теперь также включает ограничение на значение B, маркер будет использоваться для передачи целого числа q для вычисления суммы счетчиков сообщений процессов, которые его отправили. Попробуем установит

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...