dr inż. Arkadiusz Danilecki
W oparciu o wykłady prof. J. Brzezińskiego
Proces poprawny działa zgodnie ze specyfikacją
Wysyła wiadomości wtedy i tylko wtedy, gdy tego oczekujemy, wykonuje kroki algorytmu, ostatecznie osiąga wyznaczone cele...
$$correct(P_i) = \mbox{ true }$$
Proces poprawny działa zgodnie ze specyfikacją
Wysyła wiadomości wtedy i tylko wtedy, gdy tego oczekujemy, wykonuje kroki algorytmu, ostatecznie osiąga wyznaczone cele...
$$correct(P_i) = \mbox{ true }$$
Proces niepoprawny działa niezgodnie ze specyfikacją (w szczególności, nie działa)
... albo prościej - nie jest poprawny
$$\neg correct(P_i) = \mbox{ true }$$
ISO/IEC 2382-14:1997(en):
Failure The termination of the ability of a functional unit to perform a required function.
Error A discrepancy between a computed, observed or measured value or condition and the true, specified or theoretically correct value or condition
Fault An abnormal condition that may cause a reduction in, or loss of, the capability of a functional unit to perform a required function.
ISO 10303-226
Failure The lack of ability of a component, equipment, sub system, or system to perform its intended function as designed. A failure may be the result of one or many faults
Error ??
Fault an abnormal condition or defect at the component, equipment, or sub-system level which may lead to a failure
Federal Standard 1037C
Failure The temporary or permanent termination of the ability of an entity to perform its required function.
Error
Awaria (ang. failure) - działanie procesu niezgodne z algorytmem czy specyfikacją.
Błąd (ang. error) - część stanu procesu odpowiedzialna za będącą jego następstwem awarię
Wada (ang. fault) - stwierdzona lub hipotetyczna przyczyna wystąpienia błędu
rzetelne dostarczanie (ang. fair loss delivery) - jeżeli wiadomość $M$ wysyłana jest nieskończoną liczbę razy przez proces $P_{i}$ do procesu $P_{j}$ i żaden z tych procesów nie ulega awarii (oba są poprawne), to wiadomość $M$ jest dostarczona nieskończoną liczbę razy do $P_{j}$. Należy zauważyć, że własność ta dopuszcza zagubienia wiadomości $M$ nawet nieskończoną liczbę razy.
ograniczone powielanie (ang. finite duplication ) - jeżeli wiadomość $M$ wysyłana jest skończoną liczbę razy przez proces $P_{i}$ do procesu $P_{j}$, to wiadomość ta nie może być dostarczona nieskończoną liczbę razy do procesu $P_{j}$.
brak samogeneracji (ang. no creation ) - jeżeli wiadomość $M$ została dostarczona do procesu $P_{j}$, to została ona wcześniej wysłana do tego procesu przez jakiś inny proces $P_{i}$. Innymi słowy, kanał nie tworzy samorzutnie wiadomości.
Zwykle będziemy tylko mówić w założeniach, że operacje send oraz receive używają kanałów rzetelnych. Jeżeli jednak zajdzie potrzeba, używane operacje do wysyłania i odbioru zapisywać będziemy jako:
send $m$ using fair-loss channel
albo:
when message $m$ arrives at $P_i$ via fair-loss channel
wytrwałe dostarczanie (ang. stubborn delivery) - jeżeli wiadomość $M$ wysyłana jest przez proces $P_{i}$ do procesu $P_{j}$ i żaden z tych procesów nie ulega awarii (oba są poprawne), to wiadomość $M$ jest dostarczona nieskończoną liczbę razy do $P_{j}$.
brak samogeneracji (ang. no creation ) - jeżeli wiadomość $M$ została dostarczona do procesu $P_{j}$, to została ona wcześniej wysłana do tego procesu przez jakiś inny proces $P_{i}$. Innymi słowy, kanał nie tworzy samorzutnie wiadomości.
when process ~~P_i~~ wants to sent a message ~~m~~ to ~~{P}_{j}~~ do
while true
send ~~m~~ to ~~P_j~~ using fair-loss channel
end while
end when
when a message $m$ arrives at ~~P_i~~ from ~~{P}_{j}~~ via fair-loss channel do
deliver $m$
end when
niezawodne dostarczanie (ang. fair loss delivery) - jeżeli wiadomość $M$ wysłana jest przez proces $P_{i}$ do procesu $P_{j}$ i żaden z tych procesów nie ulega awarii (oba są poprawne), to wiadomość $M$ jest dostarczona do $P_{j}$.
brak powielania (ang. no duplication ) - żadna wiadomość $M$ nie jest dostarczona więcej niż raz.
brak samogeneracji (ang. no creation ) - jeżeli wiadomość $M$ została dostarczona do procesu $P_{j}$, to została ona wcześniej wysłana do tego procesu przez jakiś inny proces $P_{i}$. Innymi słowy, kanał nie tworzy samorzutnie wiadomości.
local set of messages ~~delivered_i~~ := ~~\emptyset~~
when process ~~P_i~~ wants to sent a message ~~m~~ to ~~{P}_{j}~~ do
while true
send ~~m~~ to ~~P_j~~ using stubborn channel
end while
end when
when a message $m$ arrives at ~~P_i~~ from ~~{P}_{j}~~ via stubborn channel do
if ~~\neg(m \in delivered_i)~~ then
~~delivered_i := delivered_i \cup m~~
deliver $m$
end if
end when
Problemy, które musimy rozważyć:
$2^5 = 32$ kombinacje
Jeżeli proces działa i kanał jest niezawodny, to w końcu się doczekamy na odpowiedź...
... a więc do rozważań o samej poprawności, wystarczy wiedzieć, które procesy uległy awarii!
Rozproszona oraz zawodna "wyrocznia" odpowiadająca na pytania o to, czy dany inny proces działa, czy też nie;
rozproszona - każdy proces może otrzymywać inne odpowiedzi. W praktyce wynika to z tego, że każdy proces będzie miał dostęp de facto do własnej instancji detektora.
zawodna - "wyrocznia" może się mylić, a więc detektor może twierdzić, że poprawny proces jest niepoprawny i na odwrót, detektor może też zmieniać zdanie.
Cel - ujęcie w formalne zapisy faktu, że w systemie podczas wykonania zdarzają się w pewnych chwilach awarie.
Cel - ujęcie w formalne zapisy faktu, że w systemie podczas wykonania zdarzają się w pewnych chwilach awarie.
Niech wzorzec awarii $F$ będzie funkcją $F:{\mathcal {Y}}\rightarrow 2^{\mathcal {P}}$, gdzie $F(\tau )$ oznacza zbiór procesów, które uległy awarii do momentu $\tau$. Po awarii proces nie powraca do pracy, czyli prawdziwe jest wyrażenie: $$\forall \tau :F(\tau )\subseteq F(\tau +1)$$
Wzorzec awarii opisuje więc faktyczny stan wszystkich procesów w różnych odcinkach czasu. Ponadto zbiór procesów podejrzanych oraz poprawnych jest opisany odpowiednio przez równości: $$crashed(F)=\bigcup \tau \in {\mathcal {T}},F(\tau )$$ $$correct(F)={\mathcal {P}}\setminus crashed(F)$$
Cel - ujęcie w formalne zapisy tego, że procesy mają lokalne "wyrocznie", z których każda w różnych chwilach może uznawać inne procesy za niepoprawne (podejrzewa je o awarie).
Cel - ujęcie w formalne zapisy tego, że procesy mają lokalne "wyrocznie", z których każda w różnych chwilach może uznawać inne procesy za niepoprawne (podejrzewa je o awarie).
Rozważamy tylko wzorce uszkodzeń $\displaystyle F$, w których co najmniej jeden proces jest poprawny, czyli $correct(F)\neq \emptyset$.
Każdy detektor utrzymuje listę (zbiór) procesów, które podejrzewa.
Cel - ujęcie w formalne zapisy tego, że procesy mają lokalne "wyrocznie", z których każda w różnych chwilach może uznawać inne procesy za niepoprawne (podejrzewa je o awarie).
Rozważamy tylko wzorce uszkodzeń $\displaystyle F$, w których co najmniej jeden proces jest poprawny, czyli $correct(F)\neq \emptyset$.
Każdy detektor utrzymuje listę (zbiór) procesów, które podejrzewa.
Historia detektora awarii to funkcja odwzorowująca iloczyn kartezjański zbioru procesów i pewnego okresu czasu w rodzinę wszystkich podzbiorów zbioru ${\mathcal {P}}$.
Wartość $H^{FD}(P_{i},\tau )$ oznacza zbiór procesów podejrzewanych przez $P_{i}$ w chwili $\tau$.
Niech ${\mathcal {D}}(F)$ oznacza zbiór możliwych historii detektora awarii i jest sumę mnogościową wszystkich możliwych historii detektora awarii, które mogły się przydarzyć z wzorcem awarii $F$ i detektorem awarii $FD$.
$$FD: F(\tau) \rightarrow D(F)$$
Detektor awarii $FD$ jest to funkcja odwzorowująca wzorzec awarii $F$ w zbiór możliwych historii detektora ${\mathcal {D}}(F)$.
NIEFORMALNIE
W formalnych definicjach $FD$ odwzorowywał "wzorzec awariii" w zbiór "możliwych historii", tj. rzeczywistemu zachowaniu systemu (gdzie procesy były poprawne lub ulegały awariom) przypisywał "historie detektora" tj. odpowiedzi "ten czy ów proces jest teraz poprawny".
Detektor, który by po prostu losował odpowiedzi, byłby zgodny z tą definicją.
NIEFORMALNIE
Jak dobrze możliwe historie naszego detektora odwzorowują faktyczne awarie?
Kompletność (ang. completeness) - zdolność do podejrzewania wszystkich procesów niepoprawnych.
Czy możemy liczyć na to, że nasz (dla przypomnienia - rozproszony!) detektor wykryje awarię?
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych.
Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Kompletność (ang. completeness) - zdolność do podejrzewania wszystkich procesów niepoprawnych.
Silna Kompletność (ang. strong completeness):
$$\forall F \forall H^{FD} \in D(F), \exists \tau \in \mathcal{Y}: \forall P_i \in crashed(F), \forall P_j \in correct(F) : \forall \tau ^i \geq \tau, P_i \in H^{FD}(P_j,\tau ^i ) $$
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Kompletność (ang. completeness) - zdolność do podejrzewania wszystkich procesów niepoprawnych.
Silna Kompletność (ang. strong completeness):
$$ \forall P_i: crashed(P_i) \Rightarrow \forall P_j : correct(P_j), \Diamond \Box suspects( P_j, P_i ) $$
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Kompletność (ang. completeness) - zdolność do podejrzewania wszystkich procesów niepoprawnych.
Słaba Kompletność (ang. weak completeness):
$$\forall F \forall H^{FD} \in D(F), \exists \tau \in \mathcal{Y}: \forall P_i \in crashed(F), \exists P_j \in correct(F) : \forall \tau ^i \geq \tau, P_i \in H^{FD}(P_j,\tau ^i ) $$
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Kompletność (ang. completeness) - zdolność do podejrzewania wszystkich procesów niepoprawnych.
Słaba Kompletność (ang. weak completeness):
$$ \forall P_i: crashed(P_i) \Rightarrow \exists P_j : correct(P_j), \Diamond \Box suspects( P_j, P_i ) $$
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Silna dokładność (ang. strong accuracy):
$$\forall F \forall H^{FD} \in D(F), \forall \tau \in \mathcal{Y}, \forall P_i,P_j \not\in F(\tau): P_i \not\in H^{FD}(P_j,\tau ^i ) $$
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Silna dokładność (ang. strong accuracy):
$$ \forall P_i: correct(P_i) \Rightarrow \forall P_j: \Box \neg suspects( P_j, P_i ) $$
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Słaba dokładność (ang. weak accuracy):
$$\forall F \forall H^{FD} \in D(F), \forall \tau \in \mathcal{Y}, \exists P_i \in correct(F), \forall P_j \not\in F(\tau) : P_i \not\in H^{FD}(P_j,\tau ^i ) $$
Dokładność (ang. accuracy) - zdolność do nie podejrzewania wszystkich procesów poprawnych. Czy możemy ufać naszemu detektorowi, że wykrywa rzeczywiste awarie?
Słaba dokładność (ang. weak accuracy):
$$ \exists P_i: correct(P_i) \Rightarrow \forall P_j: \Box \neg suspects( P_j, P_i ) $$
Detektor pewnej klasy może "udawać" detektor innej klasy, w sensie, że wyjście detektora klasy X można z łatwością tak przerobić, by spełniało własności klasy Y.
Gdy relacja ta zachodzi w obie strony, mówimy, że detektory są równoważne
Algorytm z użyciem mechanizmu pulsu.
Zakładamy istnienie niezawodnych kanałów komunikacyjnych łączących procesy. Ponadto znany jest maksymalny czas transmisji komunikatu. W porównaniu do tej wartości czasy przetwarzania lokalnego i ewentualne różnice w szybkościach zegarów lokalnych są pomijalnie małe.
message $hearbeat$
local set of channels ~~suspected_i~~ := ~~\emptyset~~
local set of channels ~~correct_i~~ := ~~\mathcal{P}~~
local const int ~~period_i^{to}~~
local const int ~~period_i^{p}~~
at each ~~period_i^{to}~~ tick at ~~P_i~~ do
for all ~~P_k \in \mathcal{P}~~
if ~~P_k \not\in correct_i \land P_k \not\in suspected_i~~ then
~~suspected_i~~ := ~~suspected_i \cup P_k~~
end if
end for
~~correct_i~~ := ~~\emptyset~~
end at each
at each ~~period_i^{p}~~ tick at ~~P_i~~ do
for all ~~P_k \in \mathcal{P}~~
send ~~hearbeat~~ to ~~P_k~~
end for
end at each
when message ~~heartbeat~~ arrives at ~~P_i~~ from ~~P_j~~ do
~~correct_i~~ := ~~correct_i \cup P_j~~
end when
Algorytm z użyciem mechanizmu pulsu.
Zakładamy istnienie niezawodnych kanałów komunikacyjnych łączących procesy. Ponadto istnieje maksymalny czas transmisji komunikatu, chociaż nie jest on znany. W porównaniu do tej wartości czasy przetwarzania lokalnego i ewentualne różnice w szybkościach zegarów lokalnych są pomijalnie małe.
message $hearbeat$
local set of channels ~~suspected_i~~ := ~~\emptyset~~
local set of channels ~~correct_i~~ := ~~\mathcal{P}~~
local int ~~period_i^{to}~~ := ~~t^1~~
local const ~~period_i^{p}~~
at each ~~period_i^{p}~~ tick at ~~P_i~~ do
for all ~~P_k \in \mathcal{P}~~
send ~~hearbeat~~ to ~~P_k~~
end for
end at each
when message ~~heartbeat~~ arrives at ~~P_i~~ from ~~P_j~~ do
~~correct_i~~ := ~~correct_i \cup P_j~~
end when
at each ~~period_i^{to}~~ tick at ~~P_i~~ do
for all ~~P_k \in \mathcal{P}~~
if ~~P_k \not\in correct_i \land P_k \not\in suspected_i~~ then
~~suspected_i~~ := ~~suspected_i \cup P_k~~
else if ~~P_k \in correct_i \land P_k \in suspected_i~~ then
~~suspected_i~~ := ~~suspected_i \setminus P_k~~
~~period_i^{to}~~ := ~~period_i^{to} + \Delta~~
end if
end for
~~correct_i~~ := ~~\emptyset~~
end at each
Dowód poprawności.
Silna kompletność - ostatecznie wszystkie błędne procesy będą podejrzewane.
Ostatecznie silna dokładność - ostatecznie żaden poprawny proces nie będzie podejrzewany.
Dowód poprawności.
Postęp
Silna kompletność - ostatecznie wszystkie błędne procesy będą podejrzewane.
Bezpieczeństwo
Ostatecznie silna dokładność - ostatecznie żaden poprawny proces nie będzie podejrzewany.
Dowód poprawności.
Postęp
Błędne procesy przestaną wysyłać nowe wiadomości, a wcześniej wysłane wiadomości ostatecznie wszystkie dotrą. Ostatecznie więc przestaną przychodzić nowe wiadomości od tych procesów, i gdy minie czas $period_i^{to}$, zostaną dodane do zbioru $suspected_i$
Dowód poprawności.
Bezpieczeństwo
Zakładamy pomijalnie małe różnice w zegarach, oraz że istnieje ograniczenie na maksymalny czas przesyłania wiadomości (częściowo synchroniczny model systemu).
Załóżmy, że pewien poprawny proces $P_j$ został niesłusznie dodany do zbioru ~~suspected_i~~ w procesie $P_i$. Poprawne procesy zawsze wysyłają ~~heartbeat~~, a więc $P_j$ już wysłał albo ostatecznie wyśle ~~heartbeat~~ do $P_i$.
Dowód poprawności.
Bezpieczeństwo
Kanały są niezawodne, więc wiadomości ~~hearbeat~~ od ~~P_j~~ w końcu dotrą do ~~P_i~~, co spowoduje usunięcie ~~P_j~~ ze zbioru ~~suspected_i~~ i zwiększenie stałej ~~period_i^{to}~~. Skoro istnieje ograniczenie na czas transmisji, to ostatecznie stała ta zostanie zwiększona tak, że będzie większa od tego czasu i wiadomości ~~heartbeat~~ będą przychodzić do $P_i$ na czas, i ostatecznie ~~P_j~~ przestanie być dodawany do ~~suspected_i~~.
Dowód poprawności.
Bezpieczeństwo
Kanały są niezawodne, więc wiadomości ~~hearbeat~~ od ~~P_j~~ w końcu dotrą do ~~P_i~~, co spowoduje usunięcie ~~P_j~~ ze zbioru ~~suspected_i~~ i zwiększenie stałej ~~period_i^{to}~~. Skoro istnieje ograniczenie na czas transmisji, to ostatecznie stała ta zostanie zwiększona tak, że będzie większa od tego czasu i wiadomości ~~heartbeat~~ będą przychodzić do $P_i$ na czas, i ostatecznie ~~P_j~~ przestanie być dodawany do ~~suspected_i~~.
Rozumowanie to można powtórzyć dla każdego niesłusznie podejrzewanego $P_j$, a więc każdy poprawny proces ostatecznie nie będzie już podejrzewany.