Pr-1st-1.1-m06-Slajd32: Różnice pomiędzy wersjami
Nie podano opisu zmian |
m Zastępowanie tekstu – „<math> ” na „<math>” |
||
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 22: | Linia 22: | ||
===Dowód:=== | ===Dowód:=== | ||
Zauważmy, że znacznik przebywający i przetwarzany w monitorze <math>Q_i</math> jest natychmiast przesyłany dalej, gdy <math>P_i \not\in \mathcal{PD}</math>. W przeciwnym razie, znacznik jest zatrzymywany i przechowywany w monitorze <math>Q_i</math> aż do momentu <math>\tau </math> spełnienia następującego warunku: | Zauważmy, że znacznik przebywający i przetwarzany w monitorze <math>Q_i</math> jest natychmiast przesyłany dalej, gdy <math>P_i \not\in \mathcal{PD}</math>. W przeciwnym razie, znacznik jest zatrzymywany i przechowywany w monitorze <math>Q_i</math> aż do momentu <math>\tau</math> spełnienia następującego warunku: | ||
:<math>(\neg contPassive_i[\tau]) \lor (activate_i(\mathcal{AV}_i \cup (\mathcal{P} \setminus \mathcal{PD})[\tau]) \lor (notAck_i = 0)[\tau]</math> | :<math>(\neg contPassive_i[\tau]) \lor (activate_i(\mathcal{AV}_i \cup (\mathcal{P} \setminus \mathcal{PD})[\tau]) \lor (notAck_i = 0)[\tau]</math> | ||
Linia 35: | Linia 35: | ||
predykat <math>deadlock(\mathcal{B})</math> miał wartość <math>False</math> w chwili <math>\tau _b</math>. | predykat <math>deadlock(\mathcal{B})</math> miał wartość <math>False</math> w chwili <math>\tau _b</math>. | ||
:b) Jeżeli algorytm kończy się i zbiór <math>\mathcal{PD}</math> nie jest zbiorem pustym (<math>\mathcal{PD} \ne \emptyset </math>), to predykat <math>deadlock(\mathcal{PD})</math> ma wartość <math>True</math> w chwili <math>\tau _e</math>. Ponadto dla każdego zbioru | :b) Jeżeli algorytm kończy się i zbiór <math>\mathcal{PD}</math> nie jest zbiorem pustym (<math>\mathcal{PD} \ne \emptyset</math>), to predykat <math>deadlock(\mathcal{PD})</math> ma wartość <math>True</math> w chwili <math>\tau _e</math>. Ponadto dla każdego zbioru | ||
<math>\mathcal{B}</math>, takiego, że <math>deadlock(\mathcal{B})</math> miał wartość <math>True</math> w chwili | <math>\mathcal{B}</math>, takiego, że <math>deadlock(\mathcal{B})</math> miał wartość <math>True</math> w chwili | ||
<math>\tau _b</math>, <math>\mathcal{B}</math> jest podzbiorem zbioru <math>\mathcal{PD}</math> | <math>\tau _b</math>, <math>\mathcal{B}</math> jest podzbiorem zbioru <math>\mathcal{PD}</math> | ||
Linia 55: | Linia 55: | ||
Zauważmy jednak, że <math>\mathcal{AV}_i[\tau] = \mathcal{AV}_i[\tau _b] \cup \{P_k : \mbox{ wiadomości wysłane z } P_k \mbox{ do } P_i \mbox{ stały sie dostepne dla } P_i \mbox{ w przedziale } \left \langle \tau _b, \tau \right \rangle \}</math>. | Zauważmy jednak, że <math>\mathcal{AV}_i[\tau] = \mathcal{AV}_i[\tau _b] \cup \{P_k : \mbox{ wiadomości wysłane z } P_k \mbox{ do } P_i \mbox{ stały sie dostepne dla } P_i \mbox{ w przedziale } \left \langle \tau _b, \tau \right \rangle \}</math>. | ||
Rozważmy teraz wiadomość, która stała się dostępna dla <math>P_i</math> w przedziale czasu <math>\left \langle \tau _b, \tau \right \rangle </math>. Jej nadawca <math>P_j</math> albo należał do <math>\mathcal{P} \setminus \mathcal{B}</math>, albo jest procesem należącym do <math>\mathcal{B}</math>, którego kanał wyjściowy <math>C_{j,i}</math> nie był pusty w chwili <math>\tau _b</math>. Tak więc: | Rozważmy teraz wiadomość, która stała się dostępna dla <math>P_i</math> w przedziale czasu <math>\left \langle \tau _b, \tau \right \rangle</math>. Jej nadawca <math>P_j</math> albo należał do <math>\mathcal{P} \setminus \mathcal{B}</math>, albo jest procesem należącym do <math>\mathcal{B}</math>, którego kanał wyjściowy <math>C_{j,i}</math> nie był pusty w chwili <math>\tau _b</math>. Tak więc: | ||
:<math>\mathcal{AV}_i[\tau] \subseteq (\mathcal{AV}_i[\tau _b] \cup \mathcal{IT}_i[\tau _b] \cup \mathcal{P} \setminus \mathcal{B})</math> | :<math>\mathcal{AV}_i[\tau] \subseteq (\mathcal{AV}_i[\tau _b] \cup \mathcal{IT}_i[\tau _b] \cup \mathcal{P} \setminus \mathcal{B})</math> | ||
Linia 65: | Linia 65: | ||
:<math>activate_i(\mathcal{AV}_i[\tau _b] \cup \mathcal{IT}_i[\tau _b] \cup \mathcal{P} \setminus \mathcal{B}) = True</math>. | :<math>activate_i(\mathcal{AV}_i[\tau _b] \cup \mathcal{IT}_i[\tau _b] \cup \mathcal{P} \setminus \mathcal{B}) = True</math>. | ||
Zauważmy, że ostatnia równość jest w sprzeczności z przyjętym założeniem: <math>deadlock(\mathcal{B})[\tau _b] = True</math>. Tak więc, żaden proces należący do <math>\mathcal{B} </math> nie może być usunięty z <math> \mathcal{PD}</math>, co kończy dowód implikacji a). | Zauważmy, że ostatnia równość jest w sprzeczności z przyjętym założeniem: <math>deadlock(\mathcal{B})[\tau _b] = True</math>. Tak więc, żaden proces należący do <math>\mathcal{B}</math> nie może być usunięty z <math>\mathcal{PD}</math>, co kończy dowód implikacji a). | ||
Zauważmy jednak jeszcze, że gdy algorytm kończy się i <math>\mathcal{PD} \ne \emptyset</math> to otrzymujemy: | Zauważmy jednak jeszcze, że gdy algorytm kończy się i <math>\mathcal{PD} \ne \emptyset</math> to otrzymujemy: | ||
:<math>\mathcal{B} \ne \emptyset \land \mathcal{B} \subseteq \mathcal{PD} </math> <math>{ }^{(W2)}</math> | :<math>\mathcal{B} \ne \emptyset \land \mathcal{B} \subseteq \mathcal{PD}</math> <math>{ }^{(W2)}</math> | ||
===Dowód implikacji b)=== | ===Dowód implikacji b)=== | ||
Zgodnie z konstrukcją, algorytm kończy się w chwili <math>\tau _e = \tau _{\alpha}^k+1</math> z wynikiem <math>\mathcal{PD} \ne \emptyset</math> wtedy i tylko wtedy, gdy | Zgodnie z konstrukcją, algorytm kończy się w chwili <math>\tau _e = \tau _{\alpha}^k+1</math> z wynikiem <math>\mathcal{PD} \ne \emptyset</math> wtedy i tylko wtedy, gdy | ||
:<math>\mathcal{PD} [\tau _{\alpha}^k+1]| = | \mathcal{PD} [\tau _{\alpha}^k] |</math> i <math>\mathcal{PD} [\tau _{\alpha}^k +1] \ne \emptyset </math> | :<math>\mathcal{PD} [\tau _{\alpha}^k+1]| = | \mathcal{PD} [\tau _{\alpha}^k] |</math> i <math>\mathcal{PD} [\tau _{\alpha}^k +1] \ne \emptyset</math> | ||
Niech <math> \tau _k</math>, spełnia relację <math>max(\tau _i^k) \le \tau _k \le min(\tau _i^k + 1)</math>, Chwila taka istnieje, gdyż przykładowo <math>\tau _k</math> może być równe <math>\tau _i^k</math>. W szczególności zachodzi: | Niech <math>\tau _k</math>, spełnia relację <math>max(\tau _i^k) \le \tau _k \le min(\tau _i^k + 1)</math>, Chwila taka istnieje, gdyż przykładowo <math>\tau _k</math> może być równe <math>\tau _i^k</math>. W szczególności zachodzi: | ||
:<math>\forall P_i :: P_i \in \mathcal{P} :: \tau _i^k \le \tau _{\alpha}^k \le \tau _k \le \tau _i^k +1 \le \tau _{\alpha}^k+1</math> | :<math>\forall P_i :: P_i \in \mathcal{P} :: \tau _i^k \le \tau _{\alpha}^k \le \tau _k \le \tau _i^k +1 \le \tau _{\alpha}^k+1</math> | ||
Ponieważ zbiór <math>\mathcal{PD} </math> może jedynie ulegać redukcji, otrzymujemy: | Ponieważ zbiór <math>\mathcal{PD}</math> może jedynie ulegać redukcji, otrzymujemy: | ||
:<math>\forall P_i :: P_i \in \mathcal{P} :: \mathcal{PD} [\tau _i^k ] \supseteq \mathcal{PD} [\tau _{\alpha}^k ] \supseteq \mathcal{PD} [\tau _k ] \supseteq \mathcal{PD} [\tau _i^k+1] \supseteq \mathcal{PD} [\tau _{\alpha}^k+1]</math> | :<math>\forall P_i :: P_i \in \mathcal{P} :: \mathcal{PD} [\tau _i^k ] \supseteq \mathcal{PD} [\tau _{\alpha}^k ] \supseteq \mathcal{PD} [\tau _k ] \supseteq \mathcal{PD} [\tau _i^k+1] \supseteq \mathcal{PD} [\tau _{\alpha}^k+1]</math> | ||
Tak więc, jeżeli algorytm zakończy się w chwili <math>\tau = \tau _{\alpha}^k+1 i \mathcal{PD} [\tau] \ne \emptyset </math>, to | Tak więc, jeżeli algorytm zakończy się w chwili <math>\tau = \tau _{\alpha}^k+1 i \mathcal{PD} [\tau] \ne \emptyset</math>, to | ||
:<math>\forall P_i :: P_i \in \mathcal{P} :: \mathcal{PD} [\tau _{\alpha}^k ] = \mathcal{PD} [\tau _k] = \mathcal{PD} [\tau _i^k +1] = \mathcal{PD} [\tau _{\alpha}^k+1]</math> | :<math>\forall P_i :: P_i \in \mathcal{P} :: \mathcal{PD} [\tau _{\alpha}^k ] = \mathcal{PD} [\tau _k] = \mathcal{PD} [\tau _i^k +1] = \mathcal{PD} [\tau _{\alpha}^k+1]</math> | ||
Niech<math> \mathcal{PD}^{*}</math> będzie oznaczać zbiór spełniający powyższą zależność. Udowodnimy, że <math>deadlock(\mathcal{PD}^{*})</math> zachodzi w chwili | Niech<math>\mathcal{PD}^{*}</math> będzie oznaczać zbiór spełniający powyższą zależność. Udowodnimy, że <math>deadlock(\mathcal{PD}^{*})</math> zachodzi w chwili | ||
<math>\tau =\tau _k</math>, to znaczy, spełnione są w chwili <math>\tau _k</math> następujące warunki: | <math>\tau =\tau _k</math>, to znaczy, spełnione są w chwili <math>\tau _k</math> następujące warunki: | ||
:C1. <math> \mathcal{PD}^{*} \ne \emptyset</math>i | :C1. <math>\mathcal{PD}^{*} \ne \emptyset</math>i | ||
:C2. <math>( \forall P_i :: P_i \in \mathcal{PD}^{*} :: passive_i[\tau _x] )</math> i | :C2. <math>( \forall P_i :: P_i \in \mathcal{PD}^{*} :: passive_i[\tau _x] )</math> i | ||
:C3. <math>( \forall P_i :: P_i \in \mathcal{PD}^{*} :: \neg activate_i (\mathcal{IT}_i[\tau _x] \cup \mathcal{AV}_i[\tau _x] \cup \mathcal{P} \setminus \mathcal{PD}^{*})) | :C3. <math>( \forall P_i :: P_i \in \mathcal{PD}^{*} :: \neg activate_i (\mathcal{IT}_i[\tau _x] \cup \mathcal{AV}_i[\tau _x] \cup \mathcal{P} \setminus \mathcal{PD}^{*}))</math>. | ||
Pokażemy teraz, że powyższe warunki są spełnione, jeżeli algorytm zakończy się z | Pokażemy teraz, że powyższe warunki są spełnione, jeżeli algorytm zakończy się z | ||
Linia 106: | Linia 106: | ||
W przeciwnym bowiem razie, <math>P_i</math> zostałby usunięty ze zbioru <math>\mathcal{PD}^{*}</math>. Ale, skoro <math>\mathcal{AV}_i</math> może tylko zmienić się przez dołączanie nowych elementów, a <math>\mathcal{P} \setminus \mathcal{PD}^{*}</math> nie zmienia się w przedziale | W przeciwnym bowiem razie, <math>P_i</math> zostałby usunięty ze zbioru <math>\mathcal{PD}^{*}</math>. Ale, skoro <math>\mathcal{AV}_i</math> może tylko zmienić się przez dołączanie nowych elementów, a <math>\mathcal{P} \setminus \mathcal{PD}^{*}</math> nie zmienia się w przedziale | ||
<math>\left \langle \tau _{\alpha}^k ,\tau _{\alpha}^k+1 \right \rangle </math>, otrzymujemy: | <math>\left \langle \tau _{\alpha}^k ,\tau _{\alpha}^k+1 \right \rangle</math>, otrzymujemy: | ||
:<math>(\mathcal{AV}_i[\tau _x] \cup \mathcal{P} \setminus \mathcal{PD}^{*}) \subseteq \mathcal{AV}_i[\tau _i^k +1] \cup \mathcal{P} \setminus \mathcal{PD}^{*})</math> | :<math>(\mathcal{AV}_i[\tau _x] \cup \mathcal{P} \setminus \mathcal{PD}^{*}) \subseteq \mathcal{AV}_i[\tau _i^k +1] \cup \mathcal{P} \setminus \mathcal{PD}^{*})</math> | ||
Z konstrukcji algorytmu wnioskujemy dalej, że wszystkie kanały wyjściowe procesów należących do <math>\mathcal{PD}^{*}</math> są puste w chwili <math> \tau _{\alpha}^k</math>, gdyż znacznik jest zatrzymywany przez monitor skojarzony z pasywnym procesem należącym do <math>\mathcal{PD}^{*}</math> do momentu uzyskania potwierdzeń dla wszystkich wysłanych wcześniej wiadomości (<math>notAck_i = 0</math>). | Z konstrukcji algorytmu wnioskujemy dalej, że wszystkie kanały wyjściowe procesów należących do <math>\mathcal{PD}^{*}</math> są puste w chwili <math>\tau _{\alpha}^k</math>, gdyż znacznik jest zatrzymywany przez monitor skojarzony z pasywnym procesem należącym do <math>\mathcal{PD}^{*}</math> do momentu uzyskania potwierdzeń dla wszystkich wysłanych wcześniej wiadomości (<math>notAck_i = 0</math>). | ||
Ponieważ procesy te są przy tym stale pasywne od pierwszej wizyty znacznika, ich kanały wyjściowe są puste w chwili <math>\tau _x</math>. Stąd: | Ponieważ procesy te są przy tym stale pasywne od pierwszej wizyty znacznika, ich kanały wyjściowe są puste w chwili <math>\tau _x</math>. Stąd: | ||
Linia 119: | Linia 119: | ||
Z kolei z monotoniczności predykatu <math>activate_i</math> oraz z powyższego równania wnioskujemy, że jeżeli zachodzi: | Z kolei z monotoniczności predykatu <math>activate_i</math> oraz z powyższego równania wnioskujemy, że jeżeli zachodzi: | ||
:<math> \neg activate_i(\mathcal{AV}_i[\tau _i^k +1] \cup \mathcal{P} \setminus \mathcal{PD}^{*})</math> | :<math>\neg activate_i(\mathcal{AV}_i[\tau _i^k +1] \cup \mathcal{P} \setminus \mathcal{PD}^{*})</math> | ||
to zachodzi również | to zachodzi również | ||
:<math>\neg activate_i(\mathcal{IT}_i[\tau _x] \cup \mathcal{AV}_i[\tau _x] \cup \mathcal{P} \setminus \mathcal{PD}^{*})</math> | :<math>\neg activate_i(\mathcal{IT}_i[\tau _x] \cup \mathcal{AV}_i[\tau _x] \cup \mathcal{P} \setminus \mathcal{PD}^{*})</math> |
Aktualna wersja na dzień 22:15, 11 wrz 2023
Algorytm detekcji zakleszczenia dla modelu predykatowego (7)
Wysłanie wiadomości aplikacyjnej powoduje każdorazowo zwiększenie zmiennej informującej o niepotwierdzonych wiadomościach wysłanych przez proces .
Odebranie wiadomości aplikacyjnej przez monitor powoduje dostarczenie tej wiadomości do procesu i wysłanie potwierdzenia typu ACK do monitora skojarzonego z procesem nadawcy. Odebranie takiego potwierdzenia przez monitor umożliwia zmniejszenie o 1 wartości zmiennej .
W sytuacji w której proces staje się procesem aktywnym, zmiennej jest nadawana wartość False.
Jak wiadomo w celu wykazania poprawności algorytmu należy udowodnić twierdzenia mówiące o jego żywotności i bezpieczeństwie. Rozważając ciąg cykli wykonania algorytmu, oznaczymy przez moment czasu globalnego zakończenia cyklu k - tego w monitorze , a więc moment wysłania znacznika z do w k - tym cyklu. Analogicznie, oznaczać będzie moment zakończenia cyklu k - tego w monitorze inicjatora , to znaczy moment zakończenia całego cyklu k. Ponadto, dla każdego elementu (zmiennej, predykatu), oznaczać będzie wartości elementu w chwili . W szczególności, oznacza wartość zbioru zawartego w znaczniku, w momencie wysłania znacznika przez monitor w ramach k - tego cyklu detekcji. Przyjmiemy jeszcze następującą definicję:
Jeżeli algorytm detekcji zakleszczenia zostanie zainicjowany w chwili , to zakończy się w skończonym czasie, w pewnej chwili , .
Dowód:
Zauważmy, że znacznik przebywający i przetwarzany w monitorze jest natychmiast przesyłany dalej, gdy . W przeciwnym razie, znacznik jest zatrzymywany i przechowywany w monitorze aż do momentu spełnienia następującego warunku:
Oczywiście warunek nie może zachodzić przez czas nieograniczony, gdyż procesy pasywne nie wysyłają nowych wiadomości i, z drugiej strony, wszystkie wiadomości zostają potwierdzone w skończonym czasie. Tak więc w końcu warunek wysłania znacznika zostanie spełniony, a w konsekwencji cały cykl również zakończy się w skończonym czasie. Następny cykl, k + 2 jest inicjowany, gdy . Wówczas funkcja: jest monotonicznie malejąca, z początkową wartością . Stąd liczba cykli jest skończona, a więc w skończonym czasie algorytm detekcji zakończy się.
Niech oraz oznaczają odpowiednio moment rozpoczęcia i zakończenia algorytmu detekcji zakleszczenia:
- a) Jeżeli algorytm kończy się i zbiór jest zbiorem pustym (), to dla każdego zbioru , i ,
predykat miał wartość w chwili .
- b) Jeżeli algorytm kończy się i zbiór nie jest zbiorem pustym (), to predykat ma wartość w chwili . Ponadto dla każdego zbioru
, takiego, że miał wartość w chwili , jest podzbiorem zbioru (.
Dowód implikacji a)
W celu udowodnienia implikacji a), wykażemy następującą implikację równoważną:
Zgodnie z założeniem, w chwili zachodzi predykat deadlock(\mathcal{B}) i \mathcal{B}\ne \emptyset. początkowo jest równe i stąd oczywiście w chwili , \mathcal{B} Í \mathcal{PD}. Ponieważ deadlock(\mathcal{B}) jest predykatem stabilnym, prawdą jest, że:
Stąd, korzystając z definicji zakleszczenia dla modelu predykatowego, otrzymujemy:
Wszystkie procesy należące do \mathcal{B} są stale pasywne począwszy od chwili , a więc od pierwszej wizyty znacznika. Pokażemy teraz nie wprost, że żaden proces należący do nie może być usunięty z . Postawmy zatem hipotezę, że w chwili , tuż przed możliwym usunięciem z pewnego procesu , zachodzi relacja . Stale pasywny proces może być usunięty z , pod warunkiem, że spełniona jest w chwili relacja:
Zauważmy jednak, że .
Rozważmy teraz wiadomość, która stała się dostępna dla w przedziale czasu . Jej nadawca albo należał do , albo jest procesem należącym do , którego kanał wyjściowy nie był pusty w chwili . Tak więc:
Z postawionej hipotezy wiemy, że , a stąd otrzymujemy:
- .
Ponieważ , powyższa relacja redukuje się do:
- .
Zauważmy, że ostatnia równość jest w sprzeczności z przyjętym założeniem: . Tak więc, żaden proces należący do nie może być usunięty z , co kończy dowód implikacji a).
Zauważmy jednak jeszcze, że gdy algorytm kończy się i to otrzymujemy:
Dowód implikacji b)
Zgodnie z konstrukcją, algorytm kończy się w chwili z wynikiem wtedy i tylko wtedy, gdy
- i
Niech , spełnia relację , Chwila taka istnieje, gdyż przykładowo może być równe . W szczególności zachodzi:
Ponieważ zbiór może jedynie ulegać redukcji, otrzymujemy:
Tak więc, jeżeli algorytm zakończy się w chwili , to
Niech będzie oznaczać zbiór spełniający powyższą zależność. Udowodnimy, że zachodzi w chwili , to znaczy, spełnione są w chwili następujące warunki:
- C1. i
- C2. i
- C3. .
Pokażemy teraz, że powyższe warunki są spełnione, jeżeli algorytm zakończy się z . Z definicji warunku zakończenia wynika wprost, że jeżeli algorytm kończy się z , to warunek C1 jest spełniony w chwili . Niech teraz . Z konstrukcji algorytmu wynika, że tylko proces stale pasywny począwszy od zakończenia pierwszego cyklu w chwili , może należeć do . Stąd mamy:
- , a więc
Tym samym warunek C2 zajścia zakleszczenia został zweryfikowany. Ponieważ , wnioskujemy z konstrukcji algorytmu , że:
- .
W przeciwnym bowiem razie, zostałby usunięty ze zbioru . Ale, skoro może tylko zmienić się przez dołączanie nowych elementów, a nie zmienia się w przedziale
, otrzymujemy:
Z konstrukcji algorytmu wnioskujemy dalej, że wszystkie kanały wyjściowe procesów należących do są puste w chwili , gdyż znacznik jest zatrzymywany przez monitor skojarzony z pasywnym procesem należącym do do momentu uzyskania potwierdzeń dla wszystkich wysłanych wcześniej wiadomości ().
Ponieważ procesy te są przy tym stale pasywne od pierwszej wizyty znacznika, ich kanały wyjściowe są puste w chwili . Stąd:
- i dlatego .
W konsekwencji:
Z zależności i) otrzymujemy:
Z kolei z monotoniczności predykatu oraz z powyższego równania wnioskujemy, że jeżeli zachodzi:
to zachodzi również
Z konstrukcji wnosimy dalej, że predykat jest spełniony dla wszystkich . Tym samym warunek C3 został wykazany.
Powyższe punkty dowodzą, że predykat zachodzi w chwili . Ponieważ jak wiadomo, predykat ten jest stabilny i , zachodzi również w chwili .
Dowodzi to pierwszego stwierdzenia implikacji b). Zauważmy na koniec, że jeżeli istnieje zbiór , dla którego , to z własności (W1) oraz (W2) wnioskujemy, że . Tym samym drugie stwierdzenie implikacji b) zostało udowodnione.
<< Poprzedni slajd | Spis treści | Następny slajd >>