Pr-1st-1.1-m06-Slajd32

Z Studia Informatyczne
Wersja z dnia 10:47, 5 wrz 2023 autorstwa Luki (dyskusja | edycje) (Zastępowanie tekstu – „ </math>” na „</math>”)
Przejdź do nawigacjiPrzejdź do wyszukiwania

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 >>