Распределённый алгоритм для WCP — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
Строка 12: Строка 12:
 
Работа $i$-го монитор-процесса описана следующим псевдокодом. Гарантируется: когда переменная $detect = true$, мы получим искомый срез.
 
Работа $i$-го монитор-процесса описана следующим псевдокодом. Гарантируется: когда переменная $detect = true$, мы получим искомый срез.
 
=== Псевдокод ===
 
=== Псевдокод ===
[[Файл:Proc_algo.png]]
+
 
 +
 
 +
  '''var'''
 +
    <font color="green"> // vector clock from the candidate state</font>
 +
    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''' (<tex>\exists j</tex>: color[j] = red) '''then''' send token to <tex>M_j</tex> ;
 +
  '''else''' detect := '''true''';

Версия 02:52, 29 апреля 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$, мы получим искомый срез.

Псевдокод

 var
    // vector clock from the candidate state
   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 ([math]\exists j[/math]: color[j] = red) then send token to [math]M_j[/math] ;
 else detect := true;