Pr-1st-1.1-m06-Slajd32: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Szopen (dyskusja | edycje)
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}^{*})).</math>
: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)

Alg. detekcja zakleszczenia dla modelu predykatowego (7)

Wysłanie wiadomości aplikacyjnej powoduje każdorazowo zwiększenie zmiennej notAcki informującej o niepotwierdzonych wiadomościach wysłanych przez proces Pi.

Odebranie wiadomości aplikacyjnej przez monitor Qi powoduje dostarczenie tej wiadomości do procesu Pi 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 notAcki.

W sytuacji w której proces staje się procesem aktywnym, zmiennej contPassivei 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 τik moment czasu globalnego zakończenia cyklu k - tego w monitorze Qi, a więc moment wysłania znacznika z Qi do Qi+1 w k - tym cyklu. Analogicznie, ταk oznaczać będzie moment zakończenia cyklu k - tego w monitorze inicjatora Qα, to znaczy moment zakończenia całego cyklu k. Ponadto, dla każdego elementu X (zmiennej, predykatu), X[τ] oznaczać będzie wartości elementu X w chwili τ. W szczególności, 𝒫𝒟[τik] oznacza wartość zbioru 𝒫𝒟 zawartego w znaczniku, w momencie wysłania znacznika przez monitor Qi w ramach k - tego cyklu detekcji. Przyjmiemy jeszcze następującą definicję:

contPassivei*(τ,τ)(ττ)τ::τττ::passivei[τ]

Jeżeli algorytm detekcji zakleszczenia zostanie zainicjowany w chwili tb, to zakończy się w skończonym czasie, w pewnej chwili te, te>tb.

Dowód:

Zauważmy, że znacznik przebywający i przetwarzany w monitorze Qi jest natychmiast przesyłany dalej, gdy Pi∉𝒫𝒟. W przeciwnym razie, znacznik jest zatrzymywany i przechowywany w monitorze Qi aż do momentu τ spełnienia następującego warunku:

(¬contPassivei[τ])(activatei(𝒜𝒱i(𝒫𝒫𝒟)[τ])(notAcki=0)[τ]

Oczywiście warunek (contPassivei[τ])(notAcki0)[τ]) 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 |𝒫𝒟[ταk]|>|𝒫𝒟[tαk+1]|. Wówczas funkcja: k|𝒫𝒟[ταk]| jest monotonicznie malejąca, z początkową wartością |𝒫|=n. Stąd liczba cykli jest skończona, a więc w skończonym czasie algorytm detekcji zakończy się.

Niech τb oraz τe 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 deadlock() miał wartość False w chwili τb.

b) Jeżeli algorytm kończy się i zbiór 𝒫𝒟 nie jest zbiorem pustym (𝒫𝒟), to predykat deadlock(𝒫𝒟) ma wartość True w chwili τe. Ponadto dla każdego zbioru

, takiego, że deadlock() miał wartość True w chwili τb, jest podzbiorem zbioru 𝒫𝒟 (𝒫𝒟).

Dowód implikacji a)

W celu udowodnienia implikacji a), wykażemy następującą implikację równoważną:

(::P::deadlock()[τb])(𝒫𝒟[τe])

Zgodnie z założeniem, w chwili τb zachodzi predykat deadlock(\mathcal{B}) i \mathcal{B}\ne \emptyset. 𝒫𝒟 początkowo jest równe 𝒫 i stąd oczywiście w chwili τb, \mathcal{B} Í \mathcal{PD}. Ponieważ deadlock(\mathcal{B}) jest predykatem stabilnym, prawdą jest, że:

τ::ττb::deadlock()[τ] (W1)

Stąd, korzystając z definicji zakleszczenia dla modelu predykatowego, otrzymujemy:

τ::ττb::(Pi::Pi::passivei[τ]¬activatei(𝒯i[τ]𝒜𝒱i[τ]𝒫))

Wszystkie procesy Pi należące do \mathcal{B} są stale pasywne począwszy od chwili τb, 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 τ>τb, tuż przed możliwym usunięciem z 𝒫𝒟 pewnego procesu Pi, zachodzi relacja 𝒫𝒟. Stale pasywny proces Pi może być usunięty z 𝒫𝒟, pod warunkiem, że spełniona jest w chwili τ relacja:

activatei(𝒜𝒱i[τ]𝒫𝒫𝒟[τ])=True

Zauważmy jednak, że 𝒜𝒱i[τ]=𝒜𝒱i[τb]{Pk: wiadomości wysłane z Pk do Pi stały sie dostepne dla Pi w przedziale τb,τ}.

Rozważmy teraz wiadomość, która stała się dostępna dla Pi w przedziale czasu τb,τ. Jej nadawca Pj albo należał do 𝒫, albo jest procesem należącym do , którego kanał wyjściowy Cj,i nie był pusty w chwili τb. Tak więc:

𝒜𝒱i[τ](𝒜𝒱i[τb]𝒯i[τb]𝒫)


Z postawionej hipotezy wiemy, że activatei(𝒜𝒱i[τ]𝒫𝒫𝒟[τ])=True, a stąd otrzymujemy:

activatei(𝒜𝒱i[τb]𝒯i[τb]𝒫𝒫𝒫𝒟[τ])=True.

Ponieważ 𝒟𝒫[τ], powyższa relacja redukuje się do:

activatei(𝒜𝒱i[τb]𝒯i[τb]𝒫)=True.

Zauważmy, że ostatnia równość jest w sprzeczności z przyjętym założeniem: deadlock()[τb]=True. 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:

𝒫𝒟 (W2)

Dowód implikacji b)

Zgodnie z konstrukcją, algorytm kończy się w chwili τe=ταk+1 z wynikiem 𝒫𝒟 wtedy i tylko wtedy, gdy

𝒫𝒟[ταk+1]|=|𝒫𝒟[ταk]| i 𝒫𝒟[ταk+1]

Niech τk, spełnia relację max(τik)τkmin(τik+1), Chwila taka istnieje, gdyż przykładowo τk może być równe τik. W szczególności zachodzi:

Pi::Pi𝒫::τikταkτkτik+1ταk+1

Ponieważ zbiór 𝒫𝒟 może jedynie ulegać redukcji, otrzymujemy:

Pi::Pi𝒫::𝒫𝒟[τik]𝒫𝒟[ταk]𝒫𝒟[τk]𝒫𝒟[τik+1]𝒫𝒟[ταk+1]

Tak więc, jeżeli algorytm zakończy się w chwili τ=ταk+1i𝒫𝒟[τ], to

Pi::Pi𝒫::𝒫𝒟[ταk]=𝒫𝒟[τk]=𝒫𝒟[τik+1]=𝒫𝒟[ταk+1]

Niech𝒫𝒟* będzie oznaczać zbiór spełniający powyższą zależność. Udowodnimy, że deadlock(𝒫𝒟*) zachodzi w chwili τ=τk, to znaczy, spełnione są w chwili τk następujące warunki:

C1. 𝒫𝒟*i
C2. (Pi::Pi𝒫𝒟*::passivei[τx]) i
C3. (Pi::Pi𝒫𝒟*::¬activatei(𝒯i[τx]𝒜𝒱i[τx]𝒫𝒫𝒟*)).

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 τk. Niech teraz Pi𝒫𝒟*. Z konstrukcji algorytmu wynika, że tylko proces stale pasywny począwszy od zakończenia pierwszego cyklu w chwili τi1, może należeć do 𝒫𝒟*. Stąd mamy:

contPassivei*(τi1,τik+1), a więc passivei[τx]

Tym samym warunek C2 zajścia zakleszczenia został zweryfikowany. Ponieważ Pi𝒫𝒟*, wnioskujemy z konstrukcji algorytmu , że:

¬activatei(𝒜𝒱i[τik]𝒫𝒫𝒟*)=True.


W przeciwnym bowiem razie, Pi zostałby usunięty ze zbioru 𝒫𝒟*. Ale, skoro 𝒜𝒱i może tylko zmienić się przez dołączanie nowych elementów, a 𝒫𝒫𝒟* nie zmienia się w przedziale ταk,ταk+1, otrzymujemy:

(𝒜𝒱i[τx]𝒫𝒫𝒟*)𝒜𝒱i[τik+1]𝒫𝒫𝒟*)

Z konstrukcji algorytmu wnioskujemy dalej, że wszystkie kanały wyjściowe procesów należących do 𝒫𝒟* są puste w chwili ταk, 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 (notAcki=0).

Ponieważ procesy te są przy tym stale pasywne od pierwszej wizyty znacznika, ich kanały wyjściowe są puste w chwili τx. Stąd:

(𝒯i[τx]𝒫𝒟*)=0 i dlatego 𝒯i[τx]𝒫𝒫𝒟*.

W konsekwencji:

(𝒯i[τx]𝒜𝒱i[τx]𝒫𝒫𝒟*)=(𝒜𝒱i[τx]𝒫𝒫𝒟*)

Z zależności i) otrzymujemy:

(𝒯i[τx]𝒜𝒱i[τx]𝒫𝒫𝒟*)(𝒜𝒱i[τik+1]𝒫𝒫𝒟*)

Z kolei z monotoniczności predykatu activatei oraz z powyższego równania wnioskujemy, że jeżeli zachodzi:

¬activatei(𝒜𝒱i[τik+1]𝒫𝒫𝒟*)

to zachodzi również

¬activatei(𝒯i[τx]𝒜𝒱i[τx]𝒫𝒫𝒟*)

Z konstrukcji wnosimy dalej, że predykat jest spełniony dla wszystkich Pi𝒫𝒟*. Tym samym warunek C3 został wykazany.

Powyższe punkty dowodzą, że predykat deadlock(𝒫𝒟*) zachodzi w chwili τx. Ponieważ jak wiadomo, predykat ten jest stabilny i τxτe , deadlock(𝒫𝒟*) zachodzi również w chwili τ.

Dowodzi to pierwszego stwierdzenia implikacji b). Zauważmy na koniec, że jeżeli istnieje zbiór , dla którego deadlock()[τb]=True, 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 >>