Pr-1st-1.1-m05-Slajd48
Przykład działania algorytmu (1)
Dla ilustracji działania algorytmu rozważmy przykładowy stan globalny reprezentowany przez graf oczekiwanych potwierdzeń przedstawiony na slajdzie. Procesy
, , i
należące do zbioru
są pasywne i oczekują na wiadomości od innych procesów ze zbioru , zgodnie z grafem WFG. Dla prostoty prezentacji skojarzymy z każdym wierzchołkiem grafu WFG (procesem) dwa wektory reprezentujące stan algorytmu w danym wierzchołku. Pierwszy wektor, oznaczony przez
(ang. process state), jest zmienną reprezentowaną przez tablicę [1..2] liczb naturalnych. Wartość zależy od wartości zmiennej
, i od liczby odebranych wiadomości typu DONE. Początkowo wartość jest równa 0. Po nadaniu zmiennej
wartości True przez monitor
, przyjmuje wartość 1. Następnie, gdy zakończy się zainicjowana ewentualnie faza potwierdzania i odebrana zostanie ostatnia wiadomość typu DONE, wartość
jest zmieniana na 2. Podobnie wartość
zależy od zmiennej , oraz od liczby odebranych wiadomości typu ACK. Początkowo
równa się 0. Po nadaniu zmiennej wartości True przez monitor ,
przyjmuje wartość 1. Następnie, po odebraniu ostatniej wiadomości typu ACK, wartość elementu
jest zmieniana na 2. Drugi wektor skojarzony z każdym monitorem , oznaczony przez
(ang. communication state), jest zmienną reprezentowaną przez tablicę [1..3], której elementy odpowiadają licznikom odebranych wiadomości typu CONFIRM, ACK i DONE. Początkowo, wszystkie te liczniki mają wartość 0. Są one stosownie zwiększane w wyniku odebrania wiadomości typu CONFIRM, ACK i DONE. Na rysunku wektor jest umieszczony wewnątrz wierzchołka, a wektor
obok wierzchołka.
W rozważanym przykładzie przyjęto, że jest jedynym inicjatorem procesu detekcji zakleszczenia. Monitor wywołuje procedurę NotifyProc i w konsekwencji jego stan zmienia się, wiadomości typu NOTIFY zostają wysłane (co zaznaczono białym kółkiem i strzałką) do monitorów wszystkich procesów tworzących zbiór warunkujący , a monitor oczekuje na wiadomości typu DONE potwierdzające wszystkie wiadomości typu NOTIFY. Następnie, monitory , i odbierają współbieżnie wiadomości typu NOTIFY i w konsekwencji wywołują procedurę NotifyProc, zmieniając tym samym odpowiednio i wysyłając wiadomości typu NOTIFY do monitorów wszystkich procesów tworzących ich zbiory warunkujące. W następnym kroku, wiadomości typu NOTIFY docierają do monitorów, których flagi są już zapalone (True). Dlatego, monitory te wysyłają w odpowiedzi wiadomości typu DONE (zaznaczone czarnym kółkiem). W rezultacie, wektory stanów monitorów , i przyjmują wartość [2,0]. Umożliwia to dalej wysłanie wiadomości typu DONE do inicjatora . Gdy inicjator otrzyma wszystkie oczekiwane wiadomości typu DONE, algorytm kończy się stwierdzając zakleszczenie procesu .