pdf kolor (zaktualizowane 30.03.2009)

Transkrypt

pdf kolor (zaktualizowane 30.03.2009)
Przetwarzanie rozproszone
Plan wykładu
Detekcja zakleszczenia (2)
• Detekcja zakleszczenia w środowisku asynchronicznym
dla modelu k spośród r
Wykład prowadzą:
• Dwufazowy algorytm detekcji zakleszczenia
• Detekcja zakleszczenia dla modelu predykatowego
Jerzy Brzeziński
Jacek Kobusiński
Detekcja zakleszczenia (2) (2)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Algorytm detekcji zakleszczenia w środowisku
asynchronicznym (1)
Algorytm detekcji zakleszczenia w środowisku
asynchronicznym (2)
Wyróżnia się cztery kolory łuków:
Zakładamy, że w rozważanym środowisku rozproszonym
czas transmisji w niezawodnych kanałach FIFO jest
skończony ale nieznany. Wyznaczenie stanu globalnego
takiego systemu musi zatem uwzględnić stany kanałów.
• Grey – jeżeli proces Pi wysłał do Pj wiadomość typu REQUEST, a
Pj jeszcze tej wiadomości nie odebrał, ani też Pi nie wysłał jeszcze
wiadomości typu CANCEL.
• Black – jeżeli Pj odebrał już wiadomość typu REQUEST od Pi, lecz
Pj jeszcze nie wysłał w odpowiedzi wiadomości typu GRANT do Pi,
ani też Pi nie wysłał jeszcze wiadomości typu CANCEL do Pj.
• White – jeżeli Pj wysłał już wiadomość typu GRANT do Pi, lecz Pi
jeszcze jej nie odebrał, ani też Pi nie wysłał jeszcze do Pj
wiadomości typu CANCEL.
• Translucent – jeżeli Pi wysłał wiadomość typu CANCEL do Pj, lecz Pj
jeszcze jej nie odebrał.
Detekcja zakleszczenia (2) (3)
Detekcja zakleszczenia (2) (4)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Algorytm detekcji zakleszczenia w środowisku
asynchronicznym (3)
Załóżmy teraz, że każdy monitor zna odpowiadające mu
zbiory INi oraz OUTi oraz kolory wszystkich krawędzi
incydentnych grafu WFGC. W tym wypadku, w
przeciwieństwie do środowiska synchronicznego, nie jest
prawdziwa relacja:
Pi ∈ OUTj ⇔ Pj ∈ INi.
(6.1)
Alg. Bacha, Toueg’a dla środowiska
asynchronicznego (1)
type
type
type
type
NOTIFY
DONE
CONFIRM
ACK
notifyOut
doneOut, doneIn
confirmOut
ackOut, ackIn
notifiedi
confirmedi
deadlockDetectedi
Detekcja zakleszczenia (2) (5)
Przetwarzanie rozproszone
:
:
:
:
:
:
:
SIGNAL
SIGNAL
SIGNAL
SIGNAL
NOTIFY
DONE
CONFIRM
ACK
BOOLEAN := False
BOOLEAN := False
BOOLEAN := False
Detekcja zakleszczenia (2) (6)
Przetwarzanie rozproszone
Alg. Bacha, Toueg’a dla środowiska
asynchronicznego (2)
AC : set of record of
predId : PROCESS_ID
succId : PROCESS_ID
end record
Alg. Bacha, Toueg’a dla środowiska
asynchronicznego (3)
1.
2.
3.
4.
OUTiBlack:set
JNiBlack
extends
extends
extends
extends
of PROCESS_ID :=
{Pj: 〈Pi,Pj〉 ∈ AC ∧ outArcColouri[j]=Black}
:set of PROCESS_ID :=
{Pj: 〈Pi,Pj〉 ∈ AC ∧ inArcColouri[j]=Black}
5.
6.
7.
8.
9.
expectNoi
: INTEGER
outArcColouri
: array [1..n] of enum {Black,White,Grey,Transl}
inArcColouri
: array [1..n] of enum {Black,White,Grey,Transl}
confirmNoi
: INTEGER := 0
outGreyWhiteNoi
: INTEGER :=
|{Ai,jC:outArcColouri[j]=Grey ∨ outArcColouri[j]=White}|
Detekcja zakleszczenia (2) (7)
10.
11.
12.
13.
procedure NOTIFYPROC() do
notifiedi := True
for all Qk ∈ OUTiBlack do
send(Qi, Qk, notifyOut)
end for
if expectNoi - outGreyWhiteNoi 0
then
CONFIRMPROC()
end if
for all Qk ∈ OUTiBlack do
receive(Qk, Qi, doneIn)
end for
end procedure
Detekcja zakleszczenia (2) (8)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Alg. Bacha, Toueg’a dla środowiska
asynchronicznego (4)
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure CONFIRMPROC() do
confirmedi := True
for all Qk ∈ INiBlack do
send(Qi, Qk, confirmOut)
end for
for all Qk ∈ INiBlack do
receive(Qk, Qi, ackIn)
end for
end procedure
Alg. Bacha, Toueg’a dla środowiska
asynchronicznego (5)
23.
24.
25.
26.
27.
28.
29.
30.
when e_start(Qα, DeadlockDetection) do
NOTIFYPROC()
if confirmNoα < expectNoα - outGreyWhiteNoα
then
deadlockDetectedα := True
decide(deadlockDetectedα)
end if
end when
Detekcja zakleszczenia (2) (9)
Przetwarzanie rozproszone
Detekcja zakleszczenia (2) (10)
Przetwarzanie rozproszone
Alg. Bacha, Toueg’a dla środowiska
asynchronicznego (6)
31.
32.
33.
34.
35.
36.
37.
38.
when e_receive(Qj, Qi, confirmIn: CONFIRM) do
confirmNoi := confirmNoi + 1
if ¬confirmedi ∧
(confirmNoi expectNoi- outGreyWhiteNoi)
then
CONFIRMPROC()
end if
send(Qi, Qj, ackOut)
end when
Detekcja zakleszczenia (2) (11)
Alg. Bacha, Toueg’a dla środowiska
asynchronicznego (7)
39.
40.
41.
42.
43.
44.
45.
when e_receive(Qj, Qi, notifyIn: NOTIFY) do
if ¬notifiedi
then
NOTIFYPROC()
end if
send(Qi, Qj, doneOut)
end when
Detekcja zakleszczenia (2) (12)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (1)
Dwufazowy algorytm detekcji zakleszczenia
Algorytm detekcji zakleszczenia
rozproszonego w
środowisku z niezawodnymi kanałami FIFO dla modelu
k spośród r składa się z dwóch faz wymiany wiadomości:
•
fazy inicjacji (ang. outward sweep)
•
fazy detekcji (ang. inward sweep)
type CONTROL extends FRAME
record of
initIndex
initClock
weight
end record
is
type FLOOD
extends CONTROL
type ECHO
extends CONTROL
type SHORT
extends CONTROL
: INTEGER
: INTEGER
: REAL
Realizacja obu powyższych faz może nakładać się w czasie.
Detekcja zakleszczenia (2) (13)
Przetwarzanie rozproszone
Detekcja zakleszczenia (2) (14)
Przetwarzanie rozproszone
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (2)
:
:
:
:
:
:
:
:
:
:
:
αi
:
INi
:
OUTi
:
deadlockDetectedi :
floodOut
echoOut
shortOut
inStatei
outStatei
expectNoi
expectNoStatei
latestInitClocki
latestBlockClocki
weighti
clocki
FLOOD
ECHO
SHORT
array [1..n] of set of PROCESS_ID
array [1..n] of set of PROCESS_ID
INTEGER
array [1..n] of INTEGER
INTEGER := 0
INTEGER := 0
REAL
INTEGER
INTEGER
set of PROCESS_ID := ∅
set of PROCESS_ID := ∅
BOOLEAN := False
Detekcja zakleszczenia (2) (15)
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (3)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure FILL (pcktOut:CONTROL, index, clock, weight) do
pcktOut.initIndex:= index
pcktOut.clock:= clock
pcktOut.weight:= weight
end procedure
when e_start(Qα, DeadlockDetection) do
weightα := 0
latestInitClockα[α] := clockα
outStateα[α] := OUTα
inStateα[α] := ∅
expectNoStateα[α] := expectNoα
FILL(floodOut, α, clockα, 1 / | OUTα |)
send(Qα, OUTα, floodOut)
end when
Detekcja zakleszczenia (2) (16)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (4)
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
when e_receive(Qj, Qi, floodIn : FLOOD) do
αi:= floodIn.initIndex
if latestInitClocki[αi] < floodIn.initClock ∧ Pj∈INi then
inStatei[αi]:= {Pj}
outStatei[αi]:= OUTi
expectNoStatei[αi]:= expectNoi
latestInitClocki[αi]:= floodIn.initClock
if expectNoStatei[αi] > 0 then
FILL(floodOut, αi, floodIn.initClock,
floodIn.weight/ |OUTi|)
send(Qi, OUTi ,floodOut)
end if
if expectNoStatei[αi] = 0 then
FILL(echoOut, αi, floodIn.initClock, floodIn.weight)
send(Qi, Qj, echoOut)
end if
end if
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (5)
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
if latestInitClocki[αi]≤floodIn.initClock ∧ Pj∉INi then
FILL(echoOut,αi,floodIn.initClock,floodIn.weight)
send(Qi, Qj, echoOut)
end if
if latestInitClocki[αi]=floodIn.initClock ∧ Pj∈INi then
inStatei[j]:= inStatei[j] ∪ {Pj}
if expectNoStatei[αi] > 0 then
FILL(shortOut,αi,floodIn.initClock,floodIn.weight)
send(Qi, Qj, shortOut)
end if
if expectNoStatei[αi] = 0 then
FILL(echoOut,αi,floodIn.initClock,floodIn.weight)
send( Qi, Qj, echoOut )
end if
end if
if latestInitClocki[αi] > floodIn.initClock then
/* zignoruj przetwarzaną wiadomość FLOOD */
end if
end when
Detekcja zakleszczenia (2) (17)
Przetwarzanie rozproszone
Detekcja zakleszczenia (2) (18)
Przetwarzanie rozproszone
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (6)
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (7)
58.
50.
51.
52.
53.
54.
55.
56.
57.
when e_receive(Qj, Qi, echoIn: ECHO) do
αi:= echoIn.initIndex
if latestInitClocki[αi] = echoIn.initClock then
outStatei[αi]:= outStatei[αi]\{Pj}
if expectNoStatei[αi] = 0
FILL(shortOut, αi, echoIn.initClock, echoIn.weight)
send(Qi, Qα, shortOut)
end if
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
Detekcja zakleszczenia (2) (19)
if expectNoStatei[αi] > 0 then
expectNoStatei[αi]:= expectNoStatei[αi] - 1
if expectNoStatei[αi]=0 then
if αi=i then
deadlockDetectedi:= False
decide(deadlockDetectedi)
end if
FILL(echoOut, αi, echoIn.initClock,
echoIn.weight/|inStatei[αi]|)
send(Qi ,inStatei[αi], echoOut)
else
FILL(shortOut, αi, echoIn.initClock,
echoIn.weight)
send(Qi, inStatei[αi], shortOut)
end if
end if
end if
end when
Detekcja zakleszczenia (2) (20)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Dwufazowy algorytm detekcji zakleszczenia
dla modelu k spośród r (8)
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
when e_receive(Qj, Qα, shortIn: SHORT) do
if shortIn.initClock < latestBlockClockα then
/* zignoruj nieaktualną wiadomość SHORT */
end if
if shortIn.initClock=latestBlockClockα ∧
expectNoStateα[α]=0 then
/* zignoruj wiadomość */
end if
if shortIn.initClock=latestBlockClockα ∧
expectNoStateα[α] > 0 then
weightα:= weightα + shortIn.weight;
if weightα = 1 then
deadlockDetectedα:= True
decide(deadlockDetectedα)
end if
end if
end when
Przykład działania dwufazowego algorytmu
detekcji zakleszczenia rozproszonego
wiadomość typu FLOOD
wiadomość typu ECHO
wiadomość typu SHORT
P4
1/3
1/3
1/6
1/3
P3
1/6
1/3
1/6
1/6
1/6
1/6
1/3
3/6
5/6
0
1
P1 - inicjator
Detekcja zakleszczenia (2) (21)
Przetwarzanie rozproszone
1/6
1/6
1/3
1/3
P2
Detekcja zakleszczenia (2) (22)
Przetwarzanie rozproszone
Analiza złożoności czasowej
dwufazowego algorytmu detekcji zakleszczenia
Parametry graf niezorientowanego odpowiadającego WFG:
•
d – średnica grafu ,
•
l – najdłuższa ścieżka w grafie
1. Przesłanie wiadomości typu ECHO przez wszystkie krawędzie musi
być poprzedzone wysłaniem wiadomości FLOOD w przeciwnym
kierunku. Przejście wiadomości typu FLOOD przez wszystkie
krawędzie wymaga d+1 kroków.
2. Najdłuższa ścieżka w grafie determinuje czas wymagany na
propagację wiadomości typu ECHO od monitora procesu aktywnego
do inicjatora.
Detekcja zakleszczenia
dla modelu predykatowego (1)
W algorytmie detekcji zakleszczenia dla modelu
predykatowego wykorzystana jest koncepcja ciągu
(łańcucha, sekwencji) cykli detekcyjnych (ang. wave
sequence), polegająca na wielokrotnym w ogólności
komunikowaniu się inicjatora procesu detekcji z pozostałymi
monitorami w celu wyznaczenia stanu globalnego, lub
wartości predykatu globalnego.
Złożoność czasowa algorytmu wynosi (d+1)+l
Detekcja zakleszczenia (2) (23)
Detekcja zakleszczenia (2) (24)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Detekcja zakleszczenia
dla modelu predykatowego (2)
W celu uproszczenia prezentacji
algorytmu detekcji zakleszczenia dla
modelu predykatowego przyjmiemy,
że monitory procesów aplikacyjnych
tworzą strukturę pierścienia.
Niech ponadto:
succ(i) = (i) modn + 1
pred(i) = (i + n – 2) modn + 1
Alg. detekcja zakleszczenia
dla modelu predykatowego (1)
type PACKET extends FRAME is
record of
data
end record
1
5
2
4
3
type TOKEN extends FRAME is
record of
PD
firstWave
end record
Detekcja zakleszczenia (2) (26)
Przetwarzanie rozproszone
Alg. detekcja zakleszczenia
dla modelu predykatowego (2)
msgIn
pcktOut
tokenOut
ackOut
firstWavei
contPassivei
prevWavei
PDi
AVi
notAcki
deadlockDetectedi
passivei
: set of PROCESS_ID
: BOOLEAN
type ACK extends SIGNAL
Detekcja zakleszczenia (2) (25)
Przetwarzanie rozproszone
: MESSAGE
:
:
:
:
:
:
:
:
:
:
:
:
MESSAGE
PACKET
TOKEN
ACK
BOOLEAN:= True
BOOLEAN
INTEGER
set of PROCESS_ID
set of PROCESS_ID={Pj:availablei[j]=True}
INTEGER
BOOLEAN:= False
BOOLEAN
Detekcja zakleszczenia (2) (27)
Alg. detekcja zakleszczenia
dla modelu predykatowego (3)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure WAITUPDATEPROC()
if tokenIn.firstWave
then
contPassivei := passivei
end if
wait until (¬contPassivei)
∨ activatei(AVi∪(P\PDi))∨ (notAcki=0)
if (¬contPassivei) ∨ activatei(AVi ∪ (P\PDi)) then
PDi := PDi\{Pi}
end if
contPassivei := passivei
end procedure
Detekcja zakleszczenia (2) (28)
Przetwarzanie rozproszone
Przetwarzanie rozproszone
Alg. detekcja zakleszczenia
dla modelu predykatowego (4)
12.
13.
14.
15.
16.
17.
when e_start(Qα ,DeadlockDetection) do
prevWaveα := |P|
tokenOut.PD := P
tokenOut.firstWave := firstWaveα
send(Qα, Qsucc(α), tokenOut)
end when
Alg. detekcja zakleszczenia
dla modelu predykatowego (5)
18.
19.
20.
21.
22.
23.
24.
25.
26.
when e_receive(Qj ,Qi ,tokenIn:TOKEN) do
PDi := tokenIn.PD
if Pi ∈ PDi then
WAITUPDATEPROC()
end if
tokenOut.PD := PDi
tokenOut.firstWave := tokenIn.firstWave
send(Qi, Qsucc(i), tokenOut)
end when
Detekcja zakleszczenia (2) (29)
Przetwarzanie rozproszone
Detekcja zakleszczenia (2) (30)
Przetwarzanie rozproszone
Alg. detekcja zakleszczenia
dla modelu predykatowego (6)
Alg. detekcja zakleszczenia
dla modelu predykatowego (7)
42.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
when e_receive(Qj ,Qα ,tokenIn: TOKEN) do
PDα := tokenIn.PD
if Pα ∈ PDα then
WAITUPDATEPROC()
end if
if (tokenIn.firstWave∨prevWaveα≠|PDα|)∧(|PDα|≠0) then
prevWaveα := |PDα|
tokenOut.PD := PDα
tokenOut.firstWave := False
send(Qα, Qsucc(α), tokenOut)
else
deadlockDetectedα := (PDα≠∅)
decide(deadlockDetectedα ,PDα)
end if
end when
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Detekcja zakleszczenia (2) (31)
when e_send (Pi ,Pj ,msgOut: MESSAGE) do
notAcki := notAcki + 1
pcktOut.data := msgOut
send(Qi, Qj ,pcktOut)
end when
when e_receive(Qj ,Qi ,pcktIn: PACKET) do
msgIn := pcktIn.data
deliver( Pi, Pj, msgIn )
send( Qi, Qj, ackOut )
end when
when e_receive(Qj ,Qi ,ackIn: ACK) do
notAcki := notAcki - 1
end when
when e_activate(Pi) do
contPassivei := False
end when
Detekcja zakleszczenia (2) (32)