Распределённый алгоритм для WCP — различия между версиями
Rgolchin (обсуждение | вклад) |
(→Псевдокод) |
||
Строка 14: | Строка 14: | ||
− | + | ||
<font color="green"> // vector clock from the candidate state</font> | <font color="green"> // vector clock from the candidate state</font> | ||
− | + | '''var''' candidate: array[1..n] of integer initially 0; | |
Upon receiving the token (G, color) | Upon receiving the token (G, color) | ||
'''while''' (color[i] = red) '''do''' | '''while''' (color[i] = red) '''do''' |
Версия 20:26, 16 мая 2018
Распределенный алгоритм для WCP – алгоритм для поиска наименьшего (проще говоря, самого левого) согласованного среза в котором выполняется слабый конъюнктивный предикат.
В распределенном алгоритме используются векторные часы.
В дополнение к каждому из $N$ процессов заведем еще $N$ монитор-процессов, где каждый процесс связан со своим монитор-процессом. Монитор-процессы отправляют друг другу так называемый токен (его описание ниже) и получают вектор часов от соответствующих процессов.
Токен состоит из двух векторов. Первый назовем $G$. $G[i] = k$ означает, что состояние номер $k$ $i$-го процесса входит в срез-кандидат. Важно, что этот срез может не быть согласованным, но все состояния в нем удовлетворяют локальным предикатам. $G$ инициализируется нулями.
Второй вектор назовем $color$, где $color[i]$ обозначает цвет состояния среза-кандидата для $i$-го процесса. Цвет состояния может быть красным или зеленым. Если $color[i]$ равен красному, то состояние $(i, G [i])$ и все его предшествующие состояния уже красные и никогда не смогут удовлетворить $WCP$. Если $color[i]$ зеленый, то нет такого состояния в $G$, что $(i, G[i])$ предшествует ему. $color$ инициализируется красными.
Работа $i$-го монитор-процесса описана следующим псевдокодом. Гарантируется: когда переменная $detect = true$, мы получим искомый срез.
Псевдокод
// vector clock from the candidate state var candidate: array[1..n] of integer initially 0; Upon receiving the token (G, color) while (color[i] = red) do receive candidate from application process P if (candidate[i] > G [i]) then G [i] := candidate[i]; color[i] := green; for j := 1 to n, (j != i) do if (candidate[j] >= G [j]) then G [j] := candidate[j]; color[j]:= red; if (: color[j] = red) then send token to ; else detect := true;