Detekcja zakleszczenia (1) Wykład prowadzą: Jerzy Brzeziński Jacek Kobusiński Plan wykładu Procesy aktywne i pasywne Definicja zakleszczenia Problem detekcji wystąpienia zakleszczenia Detekcja zakleszczenia dla modelu OR Detekcja zakleszczenia dla modelu AND Detekcja zakleszczenia w środowisku synchronicznym dla modelu k spośród r Detekcja zakleszczenia 1 (2) Wprowadzenie Nieformalna definicja problemu Procesy tworzące przetwarzanie rozproszone komunikują się ze sobą za pomocą mechanizmu wymiany wiadomości, realizując wspólny cel przetwarzania. Jedne procesy wysyłają komunikaty zawierające żądania przydziału pewnych zasobów, inne w odpowiedzi przesyłają ewentualnie komunikaty potwierdzające przydział żądanych zasobów. W przetwarzaniu rozproszonym może w ogólności wystąpić sytuacja, w której wszystkie procesy pewnego niepustego zbioru procesów oczekują na wiadomości (potwierdzające na przykład przydział zasobów) od innych procesów tego właśnie zbioru. Stan taki nazywany jest zakleszczeniem rozproszonym (ang. distributed deadlock). Detekcja zakleszczenia 1 (3) Detekcja zakleszczenia 1 (4)
Procesy aktywne i pasywne Warunek uaktywnienia W każdej chwili proces może być w jednym z dwóch stanów: aktywnym albo pasywnym. Proces aktywny może realizować przetwarzanie wykonując operacje odpowiadające zajściu zdarzeń wewnętrznych i komunikacyjnych. Warunek uaktywnienia jest wyrażony przez predykat: ready i (X ) (P ia X) activate i (X ) (5.1) Detekcja zakleszczenia 1 (5) Detekcja zakleszczenia 1 (6) Definicja problemu Zakleszczenie w modelu jednostkowym Przez deadlock(b) oznaczamy predykat stwierdzający, że w danej chwili τ, niepusty zbiór procesów B jest zbiorem procesów zakleszczonych. deadlock(b) (5.2) ( P i :: P i B:: ( passive i D i = 1 ( P j :: P j D i B:: ( in-transit i [j] available i [j] )))) Detekcja zakleszczenia 1 (7) Detekcja zakleszczenia 1 (8)
Zakleszczenie w modelu AND Zakleszczenie w modelu OR deadlock(b) (5.3) ( P i :: P i B:: ( passive i ( P j :: P j D i B:: ( in-transit i [j] available i [j] )))) deadlock(b) (5.4) ( P i :: P i B:: ( passive i D i B ( P j :: P j D i :: ( in-transit i [j] available i [j] )))) Detekcja zakleszczenia 1 (9) Detekcja zakleszczenia 1 (10) Zakleszczenie w podstawowym modelu k spośród r Zakleszczenie w modelu OR AND deadlock(b) (5.5) ( P i :: P i B:: ( passive i ( B i ::B i D i B:: ( D i \B i < k i ( P j :: P j B i :: ( in-transit i [j] available i [j] )))))) deadlock(b) (5.6) ( P i :: P i B:: ( passive i ( u :: 1 u q i :: ( P j :: P j D iu B:: ( in-transit i [j] available i [j] ))))) Detekcja zakleszczenia 1 (11) Detekcja zakleszczenia 1 (12)
Zakleszczenie w modelu dysjunkcyjnym k spośród r Zakleszczenie w modelu predykatowym deadlock(b) (5.7) ( P i :: P i B:: ( passive i ( u :: 1 u q i :: ( B iu ::B iu D iu B:: ( D iu \B iu < k iu ( P j :: P j B iu :: ( in-transit i [j] available i [j] ))))))) deadlock(b) (5.8) ( P i :: P i B:: ( passive i activate i (AV i IT i (P \B)))) Detekcja zakleszczenia 1 (13) Detekcja zakleszczenia 1 (14) Przykłady zakleszczeń Przykład model jednostkowy Wait-For Graph (WFG): N 5 N 1 N 2 N 4 N 3 P i N 1, N 2, N 3, N 4, N 5 węzły środowiska przetwarzania P 1, P 2, P 3, P 4, P 5 procesy wykonywane w odpowiednich węzłach P j łuk P i, P j reprezentujący fakt, że proces P i, oczekuje na wiadomość od procesu P j Każdy proces w grafie z łukiem wychodzącym jest pasywny. Procesy bez łuków wychodzących są aktywne. Zakładamy, że wszystkie kanały są puste. P 5 P 1 P 2 D 21 deadlock(b) zachodzi dlab= {P 1, P 2, P 3, P 4 } B D 3 P 4 P 3 D 4 Zbiory warunkujące: D 1 = {P 4 }, D 2 = {P 4 }, D 3 = {P 2 }, D 4 = {P 3 }. Detekcja zakleszczenia 1 (15) Detekcja zakleszczenia 1 (16)
Przykład model AND Przykład model OR P 5 D 1 P 1 P 2 D 2 deadlock(b) zachodzi dlab= {P 1, P 2, P 3, P 4 } B D 3 P 4 P 3 D 4 Zbiory warunkujące: D 1 = {P 4, P 5 }, D 2 = {P 1, P 4 }, D 3 = {P 2 }, D 4 = {P 3 }. P 5 D 1 P 1 P 2 D 2 deadlock(b) zachodzi dlab= {P 2, P 3, P 4 } B D 3 P 4 P 3 D 4 Zbiory warunkujące: D 1 = {P 4, P 5 }, D 2 = {P 4 }, D 3 = {P 2 }, D 4 = {P 2, P 3 }. Detekcja zakleszczenia 1 (17) Detekcja zakleszczenia 1 (18) P 5 Przykład model k spośród r P 1 P 2 Modeleżądań: dla P 1 : 1 spośród 3 dla P 2 : 1 spośród 1 dla P 3 : 2 spośród 2 dla P 4 : 2 spośród 3 P Zbiory warunkujące: 4 P 3 D 4 D 1 = {P 2, P 4, P 5 }, D 31 B D2 D 2 = {P 3 }, D 3 = {P 2, P 4 }, D 4 = {P 1, P 2, P 3 }. deadlock(b) zachodzi dlab= {P 2, P 3, P 4 } Klasyfikacja problemów detekcji zakleszczenia problem detekcji wystąpienia zakleszczenia problem detekcji zakleszczenia procesu problem detekcji zakleszczenia zbioru procesów problem detekcji maksymalnego zbioru procesów zakleszczonych Detekcja zakleszczenia 1 (19) Detekcja zakleszczenia 1 (20)
Detekcja wystąpienia zakleszczenia Detekcja wystąpienia zakleszczenia procesu Czy istnieje w pewnej chwili zbiór B, dla którego predykat deadlock(b) jest prawdziwy? Detekcja zakleszczenia procesu P i sprowadza się do sprawdzenia czy prawdziwy jest predykat: Odpowiedź na to pytanie określa wartość predykatu: dp i ( B :: deadlock(b) ) P i B) (5.10) de ( B :: deadlock(b)) (5.9) Detekcja zakleszczenia 1 (21) Detekcja zakleszczenia 1 (22) Detekcja wystąpienia zakleszczenia zbioru procesów Detekcja maksymalnego zbioru zakleszczonego Detekcja zakleszczenia zbioru procesów polega na znalezienia zbiorub*, dla którego prawdziwy jest następujący predykat: deadlock(b*) ((B* = Ø) ( B :: deadlock(b))) (5.11) Detekcja maksymalnego zbioru zakleszczonego, sprowadza się do znalezienia takiego zbioru B*, dla którego spełniony jest warunek: (deadlock(b*) B* = Ø) (maxdead(b*)), (5.12) gdzie maxdead(b*) ( B :: deadlock(b) (B B*)) (5.13) Detekcja zakleszczenia 1 (23) Detekcja zakleszczenia 1 (24)
Model aplikacyjnego przetwarzania rozproszonego Alg. Chandy, Misra, Hass dla modelu AND (1) D i P i RELEASE REQUEST GRANT CANCEL type PROBE extends FRAME is record of initindex : INTEGER end record probeout : PROBE granted i : array [1..n] of BOOLEAN := False D i : set of PROCESS_ID recvprobe i : array [1..n] of BOOLEAN := False α i : INTEGER k : INTEGER deadlockdetected i : BOOLEAN := False Detekcja zakleszczenia 1 (25) Detekcja zakleszczenia 1 (26) Alg. Chandy, Misra, Hass dla modelu AND (2) Alg. Chandy, Misra, Hass dla modelu AND (3) 1. when e_start(q α, DeadlockDetection) do 2. if passive α 3. then 4. for all Q k :: P k D α do 5. probeout.initindex := α 6. send(q α, Q k, probeout) 7. end for 8. end if 9. end when 10. when e_activate(p i ) do 11. for all k {1, 2,..., n} do 12. recvprobe i [k]:= False 13. end for 14. end when Detekcja zakleszczenia 1 (27) Detekcja zakleszczenia 1 (28)
Alg. Chandy, Misra, Hass dla modelu AND (4) Detekcja zakleszczenia dla modelu OR (1) 15. when e_receive(q j, Q i, probein: PROBE) do 16. α i := probein.initindex 17. if passive i ( recvprobe i [α i ]) ( granted i [j]) 18. then 19. recvprobe i [α i ]:= True 20. if α i = i 21. then 22. deadlockdetected i := True 23. decide(deadlockdetected i ) 24. else Algorytm detekcji zakleszczenia dla modelu OR opiera się na przetwarzaniu dyfuzyjnym (ang. query computation). 25. probeout.initindex:=α i 26. for all Q k :: P k D i do 27. send(q i, Q k, probeout) 28. end for 29. end if 30. end if 31. end when Detekcja zakleszczenia 1 (29) Detekcja zakleszczenia 1 (30) Detekcja zakleszczenia dla modelu OR (2) Detekcja zakleszczenia dla modelu OR (3) Twierdzenie 5.2 Jeżeli inicjator Q α rozpoczyna detekcję w chwili, gdy jego proces aplikacyjny P α jest zakleszczony, to Q α stwierdzi zakleszczenie procesu P α w skończonym czasie (algorytm detekcji zakończy się). Twierdzenie 5.2 Jeżeli inicjator Q α deklaruje, że jego proces aplikacyjny P α jest zakleszczony, to P α należy do pewnego zbioru procesów zakleszczonych w chwili zakończenia algorytmu. Detekcja zakleszczenia 1 (31) Detekcja zakleszczenia 1 (32)
Alg. Chandy, Misra, Hass dla modelu OR (1) Alg. Chandy, Misra, Hass dla modelu OR (2) type CONTROL extends FRAME is record of initindex : INTEGER queryno : INTEGER end record type QUERY extends CONTROL type REPLY extends CONTROL queryout : QUERY replyout : REPLY D i : set of PROCESS_ID maxqueryno i : array [1..n] of INTEGER := 0 engager i : array [1..n] of INTEGER := 0 QRBalance i : array [1..n] of INTEGER := 0 contpassive i : array [1..n] of BOOLEAN := False queryno i : INTEGER α i : INTEGER deadlockdetected i : BOOLEAN := False Detekcja zakleszczenia 1 (33) Detekcja zakleszczenia 1 (34) Alg. Chandy, Misra, Hass dla modelu OR (3) Alg. Chandy, Misra, Hass dla modelu OR (4) 1. when e_start(q α, DeadlockDetection) do 2. if passive α 3. then 4. maxqueryno α [α] := maxqueryno α [α] + 1 5. contpassive α [α] := True 6. queryout.queryno := maxqueryno α [α] 7. queryout.initindex := α 8. for all Q k :: P k D α do 9. send(q α, Q k, queryout) 10. end for 11. QRBalance α [α] := D α 12. end if 13. end when 14. when e_receive(q j, Q i, queryin : QUERY) do 15. if passive i 16. then 17. queryno i := queryin.queryno 18. α i := queryin.initindex 19. if queryno i > maxqueryno i [α i ] 20. then 21. maxqueryno i [α i ] := queryno i 22. engager i [α i ] := j 23. contpassive i [α i ] := True 24. queryout.queryno := queryno i 25. queryout.initindex := α i 26. for all Q k :: P k D i do 27. send(q i, Q k, queryout) 28. end for 29. QRBalance i [α i ] := D i Detekcja zakleszczenia 1 (35) Detekcja zakleszczenia 1 (36)
Alg. Chandy, Misra, Hass dla modelu OR (5) Alg. Chandy, Misra, Hass dla modelu OR (6) 30. else 31. if contpassive i [α i ] queryno i = maxqueryno i [α i ] 32. then 33. replyout.queryno := queryno i 34. replyout.initindex := α i 35. send(q i, Q j, replyout) 36. end if 37. end if 38. end if 39. end when 40. when e_receive(q j, Q i, replyin : REPLY) do 41. if passive i 42. then 43. queryno i := queryin.queryno 44. α i := queryin.initindex 45. if maxqueryno i [α i ]=queryno i contpassive i [α i ] 46. then 47. QRBalance i [α i ]:= QRBalance i [α i ] - 1 48. if QRBalance i [α i ] = 0 49. then 50. if α i =i 51. then 52. deadlockdetected i := True 53. decide(deadlockdetected i ) Detekcja zakleszczenia 1 (37) Detekcja zakleszczenia 1 (38) Alg. Chandy, Misra, Hass dla modelu OR (7) Alg. Chandy, Misra, Hass dla modelu OR (8) 54. else 55. k:= engager i [α i ] 56. replyout.queryno:= queryno i 57. replyout.initindex:= α i 58. send(q i, Q k, replyout) 59. end if 60. end if 61. end if 62. end if 63. end when 64. when e_activate(p i ) do 65. for all k {1, 2,..., n} do 66. contpassive i [k] := False 67. end for 68. end when Detekcja zakleszczenia 1 (39) Detekcja zakleszczenia 1 (40)
Alg. Bracha, Toueg a (1) Alg. Bracha, Toueg a (2) type NOTIFY extends SIGNAL type DONE extends SIGNAL type CONFIRM extends SIGNAL type ACK extends SIGNAL notifyout doneout, donein confirmout ackout, ackin A : NOTIFY : DONE : CONFIRM : ACK : set of record of predid : PROCESS_ID succid : PROCESS_ID end record := { P i,p j : P j D i } OUT i : set of PROCESS_ID := {P j : P i,p j A} JN i : set of PROCESS_ID := {P j : P i,p j A} confirmno i : INTEGER := 0 notified i : BOOLEAN := False confirmed i : BOOLEAN := False expectno i : INTEGER deadlockdetected i : BOOLEAN := False Detekcja zakleszczenia 1 (41) Detekcja zakleszczenia 1 (42) Alg. Bracha, Toueg a (3) Alg. Bracha, Toueg a (4) 1. procedure NOTIFYPROC() do 2. notified i := True 3. for all Q k OUT i do 4. send( Q i, Q k, notifyout) 5. end for 6. if expectno i = 0 7. then 8. CONFIRMPROC() 9. end if 10. for all Q k OUT i do 11. receive(q k, Q i, donein) 12. end for 13. end procedure 14. procedure CONFIRMPROC() do 15. confirmed i := True 16. for all Q k IN i do 17. send(q i, Q k, confirmout) 18. end for 19. for all Q k IN i do 20. receive(q k, Q i, ackin) 21. end for 22. end procedure Detekcja zakleszczenia 1 (43) Detekcja zakleszczenia 1 (44)
Alg. Bracha, Toueg a (5) Alg. Bracha, Toueg a (6) 23. when e_start(q α, DeadlockDetection) do 24. NOTIFYPROC() 25. if confirmno α < expectno α 26. then 27. deadlockdetected α := True 28. decide(deadlockdetected α ) 29. end if 30. end when 31. when e_receive(q j, Q i, confirmin: CONFIRM) do 32. confirmno i := confirmno i + 1 33. if confirmed i (confirmno i expectno i ) 34. then 35. CONFIRMPROC() 36. end if 37. send(q i, Q j, ackout) 38. end when Detekcja zakleszczenia 1 (45) Detekcja zakleszczenia 1 (46) Alg. Bracha, Toueg a (7) Przykład działania algorytmu (1) wiadomość typu NOTIFY wiadomość typu DONE 39. when e_receive(q j, Q i, notifyin: NOTIFY) do 40. if notified i 41. then 42. NOTIFYPROC() 43. end if 44. send(q i,q j,doneout) 45. end when,1,0 P 4 2,0 1,0 2,0 1,0 P 3,1,0 1,0 2,0,0,3 2,0 1,0,2,0 P 1 - inicjator P 2 Detekcja zakleszczenia 1 (47) Detekcja zakleszczenia 1 (48)
P 4 2,2 1,1 Przykład działania algorytmu (2) 0,3,0,0 0,2,0 wiadomość typu NOTIFY wiadomość typu DONE wiadomość typu CONFIRM wiadomość typu ACK Złożoność czasowa algorytmu detekcji zakleszczenia w środowisku synchronicznym dla modelu k spośród r (1) Graf niezorientowany odpowiadający grafowi WFG scharakteryzowany jest przez: średnicę grafu d, najdłuższą ścieżkę w grafie l. 3,0,2,0 1, 2, 3,0,3 1,2 1,0 2,2 2,2 1,0 1,1 2,1 P 3 1,2,1,0 1, 1,0,1 1,1,1 2,1,2,0 1, 2,0,2 2,2 1,0 2,1 P 1 - inicjator P 2 Złożoność całego algorytmu to: złożoność fazy potwierdzania złożoność powiadomienia inicjatora fazy potwierdzania, złożoność odpowiadającą przesłaniu wiadomości typu DONE od inicjatora fazy potwierdzania do inicjatora detekcji. Detekcja zakleszczenia 1 (49) Detekcja zakleszczenia 1 (50) Złożoność czasowa algorytmu detekcji zakleszczenia w środowisku synchronicznym dla modelu k spośród r (2) przesłanie wiadomości typu CONFIRM może zabrać l jednostek czasu transmisja wiadomości typu ACK również zabiera w najgorszym wypadku l jednostek czasu przesłanie wiadomości typu NOTIFY (równolegle do monitorów wszystkich procesów tworzących zbiór OUT i ) wymaga co najwyżej d kroków. przesłanie wiadomości typu DONE po zakończeniu fazy potwierdzania wymaga co najwyżej d kroków. W efekcie złożoność czasowa algorytmu wynosi 2d + 2l. Detekcja zakleszczenia 1 (51)