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)