Przetwarzanie rozproszone
Transkrypt
Przetwarzanie rozproszone
Spis treści Wykład #1: Wprowadzenie ..................................................................................................................... 8 Cechy systemów rozproszonych ......................................................................................................... 8 Problemy związane z konstrukcją systemów rozproszonych .............................................................. 9 Motywy.............................................................................................................................................. 10 Rozproszony system informatyczny .................................................................................................. 10 Środowisko przetwarzania rozproszonego ................................................................................... 10 Zbiór procesów rozproszonych ..................................................................................................... 11 Skala przetwarzania ....................................................................................................................... 12 Klasy zastosowao ........................................................................................................................... 12 TOP 500 ......................................................................................................................................... 12 Przykłady środowisk .......................................................................................................................... 13 Internet .......................................................................................................................................... 13 GRID ............................................................................................................................................... 13 Cloud computing ........................................................................................................................... 14 Przykład: Sortowanie rozproszone .................................................................................................... 15 Problem zakooczenia..................................................................................................................... 16 Definicje............................................................................................................................................. 16 Awaria............................................................................................................................................ 16 Błąd ................................................................................................................................................ 16 Wada ............................................................................................................................................. 16 Detektory awarii ................................................................................................................................ 16 Rozproszony konsensus..................................................................................................................... 16 Wykład #2: Przetwarzanie rozproszone ................................................................................................ 20 Procesy rozproszone i sekwencyjne .................................................................................................. 20 Proces rozproszony- definicja........................................................................................................ 20 Proces sekwencyjny....................................................................................................................... 20 Klasy operacji ..................................................................................................................................... 20 Komunikat- definicja ......................................................................................................................... 20 Kanał- definicja .................................................................................................................................. 21 Kanały incydentny, wejściowe i wyjściowe ................................................................................... 21 Stan kanału .................................................................................................................................... 21 Rodzaje komunikacji .......................................................................................................................... 23 Komunikacja synchroniczna .......................................................................................................... 23 Komunikacja asynchroniczna ........................................................................................................ 23 Model formalny procesu sekwencyjnego ......................................................................................... 23 Stan procesu .................................................................................................................................. 23 Zdarzenia ....................................................................................................................................... 23 Funkcja tranzycji ............................................................................................................................ 24 Procesy zakooczone, wstrzymane ................................................................................................. 25 Procesy aktywne, pasywne ........................................................................................................... 25 Modele żądao .................................................................................................................................... 26 Model jednostkowy ....................................................................................................................... 26 Model AND .................................................................................................................................... 26 Model OR ....................................................................................................................................... 26 Podstawowy model spośród ................................................................................................... 27 Model OR-AND .............................................................................................................................. 27 Dysjunkcyjny model spośród .................................................................................................. 28 Model predykatowy ...................................................................................................................... 28 Wykład #3: Proces rozproszony ............................................................................................................ 29 Proces rozproszony ........................................................................................................................... 29 Zbiór stanów globalnych ............................................................................................................... 29 Zbiór stanów globalnych początkowych ....................................................................................... 29 Zbiór zdarzeo globalnych............................................................................................................... 29 Globalna funkcja tranzycji ............................................................................................................. 30 Częściowe wykonanie procesu ...................................................................................................... 30 Stan osiągalny ................................................................................................................................ 30 Historia wykonania ........................................................................................................................ 30 Proces rozproszony jako graf ........................................................................................................ 30 Relacja poprzedzania zdarzeo ....................................................................................................... 31 Diagramy przestrzenno-czasowe................................................................................................... 31 Graf stanów osiągalnych ............................................................................................................... 32 Diagramy równoważne.................................................................................................................. 33 Monitor.............................................................................................................................................. 34 Cechy monitora ............................................................................................................................. 34 Konwencja zapisu algorytmów .......................................................................................................... 34 Typ FRAME..................................................................................................................................... 34 Typ MESSAGE ................................................................................................................................ 34 Typ CONTROL ................................................................................................................................ 35 Typ SIGNAL .................................................................................................................................... 35 Typ PACKET .................................................................................................................................... 35 Wykład #4: Czas wirtualny, złożonośd algorytmów .............................................................................. 36 Czas wirtualny ................................................................................................................................... 36 Zegar logiczny- definicja ................................................................................................................ 36 Zegar skalarny- definicja ................................................................................................................ 37 Algorytm Lamporta........................................................................................................................ 37 Zegar wektorowy- definicja ........................................................................................................... 38 Algorytm Matterna ........................................................................................................................ 39 Kanały ................................................................................................................................................ 40 Kanały FIFO .................................................................................................................................... 40 Kanały typu FC ............................................................................................................................... 41 Funkcje kosztu ................................................................................................................................... 49 Oznaczenia..................................................................................................................................... 49 Definicja ......................................................................................................................................... 49 Rząd funkcji ................................................................................................................................... 49 Złożonośd czasowa ........................................................................................................................ 50 Złożonośd komunikacyjna.............................................................................................................. 50 Warunki poprawności ....................................................................................................................... 50 Wykład #5, 6: Detekcja zakleszczenia ................................................................................................... 52 Wprowadzenie .................................................................................................................................. 52 Nieformalna definicja problemu zakleszczenia ............................................................................. 52 Procesy aktywne i pasywne............................................................................................................... 52 Warunek uaktywnienia ................................................................................................................. 53 Zakleszczenie ..................................................................................................................................... 53 Zakleszczenie- definicja ................................................................................................................. 53 Przykłady zakleszczeo .................................................................................................................... 54 Klasyfikacja problemów detekcji zakleszczenia............................................................................. 55 Model aplikacyjnego przetwarzania rozproszonego ..................................................................... 56 Algorytm Chandy, Misra, Hass dla modelu AND ........................................................................... 57 Algorytmy detekcji zakleszczenia dla modelu OR ......................................................................... 58 Złożonośd czasowa algorytmu detekcji zakleszczenia w środowisku synchronicznym dla modelu spośród .................................................................................................................................... 66 Algorytm detekcji zakleszczenia w środowisku asynchronicznym ................................................ 66 Dwufazowy algorytm detekcji zakleszczenia................................................................................. 68 Detekcja zakleszczenia dla modelu predykatowego ..................................................................... 73 Wykład #7, 8: Konstrukcja spójnego obrazu stanu globalnego............................................................. 76 Konfiguracja....................................................................................................................................... 76 Konfiguracja spójna ....................................................................................................................... 76 Linia odcięcia, odcięcie spójne .......................................................................................................... 77 Predykaty globalne i ich własności .................................................................................................... 79 Stan globalny systemu ....................................................................................................................... 79 Modele stanów globalnych ........................................................................................................... 80 Metoda wyznaczania stanu globalnego ........................................................................................ 83 Algorytmy konstrukcji spójnego obrazu stanu globalnego ........................................................... 85 Niedeterminizm przetwarzania rozproszonego .............................................................................. 104 Wykład #9, 10: Problem detekcji zakooczenia .................................................................................... 105 Przykład ilustrujący potrzebę poprawnej detekcji zakooczenia ...................................................... 105 Definicja zakooczenia ...................................................................................................................... 105 Definicja nieformalna zakooczenia.............................................................................................. 105 Definicja formalna zakooczenia................................................................................................... 105 Zakooczenie dynamiczne ............................................................................................................. 106 Zakooczenie statyczne ................................................................................................................. 106 Klasyczna definicja zakooczenia .................................................................................................. 107 Problem detekcji zakooczenia ......................................................................................................... 107 Model przetwarzania synchronicznego........................................................................................... 107 Detekcja zakooczenia dla modelu synchronicznego ................................................................... 107 Model przetwarzania dyfuzyjnego .................................................................................................. 110 Algorytm Dijkstry-Scholten’a ....................................................................................................... 111 Model przetwarzania asynchronicznego ......................................................................................... 114 Algorytm detekcji zakooczenia dla systemów asynchronicznych ............................................... 114 Cechy algorytmu Misra................................................................................................................ 116 Model atomowy przetwarzania ...................................................................................................... 116 Algorytm z licznikami wiadomości Matterna .............................................................................. 117 Jednofazowy algorytm detekcji zakooczenia .............................................................................. 120 Wektorowy algorytm detekcji zakooczenia ................................................................................ 122 Detekcja zakooczenia statycznego .................................................................................................. 125 Koncepcja algorytmu ................................................................................................................... 125 Algorytm detekcji zakooczenia statycznego................................................................................ 125 Dowód poprawności algorytmu .................................................................................................. 127 Złożonośd algorytmu ................................................................................................................... 129 Detekcja zakooczenia dynamicznego .............................................................................................. 129 Koncepcja algorytmu ................................................................................................................... 129 Algorytm detekcji zakooczenia dynamicznego............................................................................ 129 Złożonośd algorytmu i jego cechy................................................................................................ 133 Wykład #11: Niezawodnośd przetwarzania......................................................................................... 135 Poprawnośd procesu ....................................................................................................................... 135 Pojęcia podstawowe ....................................................................................................................... 135 Klasy awarii procesów ..................................................................................................................... 135 Modele kanałów komunikacyjnych ................................................................................................. 136 Kanały rzetelne ............................................................................................................................ 136 Kanały wytrwałe .......................................................................................................................... 137 Kanały niezawodne...................................................................................................................... 138 Modele systemów rozproszonych w kontekście niezawodności .................................................... 140 Systemy asynchroniczne.............................................................................................................. 140 Systemy synchroniczne ............................................................................................................... 140 Systemy częściowo synchroniczne .............................................................................................. 140 Detektory awarii .............................................................................................................................. 141 Wzorzec awarii ............................................................................................................................ 142 Historia detektora awarii ............................................................................................................. 143 Formalna definicja detektora awarii ........................................................................................... 143 Własności detektorów................................................................................................................. 143 Klasyfikacja detektorów .............................................................................................................. 144 Jakośd detekcji- metryki .............................................................................................................. 146 Implementacja detektora awarii ..................................................................................................... 150 Mechanizm pulsu ........................................................................................................................ 150 Mechanizm odpytywania ............................................................................................................ 150 Implementacja detektora P: mechanizm pulsu........................................................................... 151 Implementacja detektora P: mechanizm pulsu......................................................................... 153 Problem wyboru lidera .................................................................................................................... 154 Algorytm wyboru ostatecznego lidera ........................................................................................ 155 Modele przetwarzania..................................................................................................................... 158 Wykład #12: Mechanizmy rozgłaszania niezawodnego ...................................................................... 160 Rozgłaszanie niezawodne ................................................................................................................ 160 Definicja nieformalna .................................................................................................................. 160 Klasy mechanizmów rozgłaszania niezawodnego ....................................................................... 160 Podstawowe rozgłaszanie niezawodne ........................................................................................... 161 Specyfikacja ................................................................................................................................. 161 Operacje komunikacyjne ............................................................................................................. 162 Algorytm ...................................................................................................................................... 162 Zgodne rozgłaszanie niezawodne.................................................................................................... 163 Specyfikacja ................................................................................................................................. 163 Operacje komunikacyjne ............................................................................................................. 164 Algorytm pasywny ....................................................................................................................... 164 Algorytm aktywny ....................................................................................................................... 166 Jednolite rozgłaszanie niezawodne ................................................................................................. 168 Specyfikacja ................................................................................................................................. 168 Operacje komunikacyjne ............................................................................................................. 169 Algorytm z potwierdzeniami od wszystkich ................................................................................ 169 Algorytm z potwierdzeniami od większości ................................................................................ 171 Probabilistyczny algorytm rozgłaszania niezawodnego .................................................................. 172 Problem implozji potwierdzeo .................................................................................................... 172 Specyfikacja ................................................................................................................................. 173 Operacje komunikacyjne ............................................................................................................. 173 Idea algorytmu plotkowania ....................................................................................................... 174 Algorytm aktywny ....................................................................................................................... 175 Algorytm pasywny ....................................................................................................................... 177 Zgodne rozgłaszanie niezawodne z przyczynowym uporządkowaniem wiadomości ..................... 181 Specyfikacja ................................................................................................................................. 181 Operacje komunikacyjne ............................................................................................................. 182 Algorytm ...................................................................................................................................... 182 Zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości ............................ 184 Specyfikacja ................................................................................................................................. 184 Operacje komunikacyjne ............................................................................................................. 184 Algorytm ...................................................................................................................................... 184 Wykład #13: Problem konsensusu ...................................................................................................... 190 Konsensus- wprowadzenie .............................................................................................................. 190 Konsensus a zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości.... 191 Konsensus w systemach w pełni asynchronicznych .................................................................... 191 Konsensus w systemach częściowo synchronicznych ................................................................. 192 Detektory awarii a konsensus ..................................................................................................... 192 Konsensus podstawowy .................................................................................................................. 192 Specyfikacja ................................................................................................................................. 192 Operacja propose ........................................................................................................................ 193 Operacja decide ........................................................................................................................... 193 Algorytm rozgłoszeniowy ............................................................................................................ 194 Algorytm hierarchiczny................................................................................................................ 200 Konsensus jednolity......................................................................................................................... 206 Specyfikacja ................................................................................................................................. 206 Operacja propose ........................................................................................................................ 207 Operacja decide ........................................................................................................................... 207 Algorytm rozgłoszeniowy ............................................................................................................ 207 Algorytm hierarchiczny................................................................................................................ 209 Konsensus probabilistyczny............................................................................................................. 211 Specyfikacja ................................................................................................................................. 211 Operacja propose ........................................................................................................................ 212 Operacja decide ........................................................................................................................... 212 Algorytm ...................................................................................................................................... 212 Algorytm zgodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości ..... 217 Złożonośd ..................................................................................................................................... 219 Wykład #1: Wprowadzenie Plan wykładu a) b) c) d) Wprowadzenie Podstawowe definicje Charakterystyka środowiska przetwarzania rozproszonego Przykłady środowisk: Internet GRID Przetwarzanie rozproszone… @Home Google Cechy systemów rozproszonych a) Duża wydajnośd (duża moc obliczeniowa i maksymalna przepustowośd, krótki czas odpowiedzi) wynikająca z możliwości jednoczesnego udziału wielu jednostek i systemów w realizacji wspólnego celu przetwarzania. Jeśli pewne obliczenia da się rozłożyd na zbiór obliczeo cząstkowych, które można wykonywad współbieżnie, to system rozproszony umożliwia przydzielenie tych obliczeo do poszczególnych stanowisk i współbieżne ich wykonanie. Ponadto, jeżeli pewne stanowisko jest w danej chwili przeciążone zadaniami, to częśd z nich można przenieśd do innego, mniej obciążonego stanowiska. Takie przemieszczanie zadad nazywa się dzieleniem obciążeo (ang. load sharing). b) Duża efektywnośd inwestowania (względnie niskie koszy niezbędne do uzyskania wymaganej wydajności systemu) wynikająca z korzystnego stosunku ceny do wydajności; c) Wysoka sprawnośd wykorzystania zasobów (wysoki stopieo wykorzystania zasobów i współczynnik jednoczesności) wynikająca z możliwości współdzielenia stanowisk usługowych, specyficznych urządzeo, programów i danych przez wszystkich użytkowników systemu, niezależnie od fizycznej lokalizacji użytkowników i zasobów. Po połączeniu ze sobą różnych stanowisk (o różnych możliwościach) użytkownik jednego stanowiska może korzystad z zasobów dostępnych na innym (np. użytkownik węzła A może korzystad z drukarki laserowej zainstalowanej w węźle B, natomiast użytkownik węzła B może w tym samym momencie mied dostęp do pliku znajdującego się w A); d) Skalowalnośd (możliwośd ciągłego i praktycznie nieograniczonego rozwoju systemu bez negatywnego wpływy na jego wydajnośd i sprawnośd) wynikająca z modularności systemu i otwartości sieci komunikacyjnej. Moc i możliwości przetwarzania może wzrastad w miarę dodawania do systemu nowych zasobów, w szczególności komputerów. W praktyce skalowalnośd jest często ograniczona poprzez przepustowośd sieci oraz, niekiedy, poprzez np. specyficzne protokoły wymiany informacji. Niemniej skalowalnośd systemu rozproszonego jest nieporównywalnie lepsza w stosunku do systemu scentralizowanego; e) Wysoka niezawodnośd (odpornośd na błędy) wynikająca z możliwości użycia zasobów alternatywnych. W przypadku awarii jednego stanowiska w systemie rozproszonym pozostałe mogą kontynuowad pracę. Jeżeli system składa się z dużych, autonomicznych instalacji (tzn. komputerów ogólnego przeznaczenia), to awaria jednego z nich nie wpływa na działanie pozostałych. Natomiast, gdy system składa się z małych maszyn, z których każda odpowiada za jakąś istotną funkcję (np. za wykonywania operacji wejścia- wyjścia z koocówek konwersacyjnych lub za system plików), wówczas z powodu jednego błędu może zostad wstrzymane działanie całego systemu. Ogólnie można powiedzied, że istnienie w systemie wystarczającego zapasu (zarówno sprzętu, jak i danych) sprawia, że system może pracowad nawet po uszkodzeniu pewnej liczby jego węzłów. f) Otwartośd funkcjonalna (łatwośd realizacji nowych, atrakcyjnych usług komunikacyjnych, informatycznych i informacyjnych) wynikająca z integracji otwartej sieci komunikacyjnej i efektywnych, uniwersalnych jednostek przetwarzających; g) Współdzielenie zasobów (ang. resource sparing) wiąże się z tym, że wielu użytkowników systemu może korzystad z danego zasobu (np. drukarek, plików, usług, itp.); h) Transparentnośd (ang. transparency) oznacza ukrycie przed użytkownikiem szczegółów rozproszenia, np. gdzie ulokowane są zasoby lub jak są one fizycznie zaimplementowane, pod jakim systemem pracują itd. Przezroczystośd ma zasadnicze znaczenie dla komfortu działania użytkownika oraz dla niezawodności budowanego oprogramowania. Niekiedy, np. dla celów optymalizacyjnych, użytkownik może zrezygnowad z pełnej przezroczystości. Przykładem przezroczystości jest Internet- klikając w aktywne pole na stronie WWW nie interesujemy się, gdzie znajduje się odpowiadająca mu strona oraz jak i na czym jest zaimplementowane. Problemy związane z konstrukcją systemów rozproszonych Pełne wykorzystanie wymienionych cech systemów rozproszonych wymaga jednak efektywnego rozwiązania wielu problemów. Problemy, które wiążą się z konstrukcją systemów rozproszonych to: a) b) c) d) Optymalne zrównoleglenie algorytmów przetwarzania Ocena poprawności i efektywności algorytmów rozproszonych Alokacja zasobów rozproszonych Synchronizacja procesów- charakterystyczny dla systemów rozproszonych asynchronizm komunikacji i działania procesów implikuje niedeterminizm przetwarzania. Dodatkowo brak wspólnej pamięci ogranicza dostępne wprost mechanizmy komunikacji i synchronizacji. e) Ocena globalnego stanu przetwarzania f) Realizacja zaawansowanych modeli przetwarzania g) Niezawodnośd h) Nieprzewidywalnośd- system rozproszony jest nieprzewidywalny w swoim działaniu, ponieważ zakłócenia mogą byd powodowane przez wiele przyczyn: małą przepustowośd i awarię łączy lub komputerów, zbyt duże obciążenie danego serwera, lokalne decyzji administracyjne serwera, itd. i) Bezpieczeostwo- dla systemu scentralizowanego wystarcza w zasadzie strażnik z karabinem. System rozproszony nie może byd chroniony w ten sposób, przez co może byd narażony na różnorodne ataki (włamania, wirusy, sabotaż, odmowa płatności, itd.) z wielu stron, które trudno zidentyfikowad. Konieczne jest zatem wprowadzenie dodatkowych mechanizmów ochronnych. j) Złożonośd- systemy rozproszone są trudniejsze do zaprogramowania i do administrowania niż systemy scentralizowane. Zależą od własności sieci, np. jej przepustowości i czasu transmisji, co utrudnia zaprojektowania i zrealizowanie wielu algorytmów i procesów przetwarzania. Utrudnione zarządzanie systemem rozproszonym jest spowodowane tym, że konsekwencje różnych działao administracyjnych są trudniejsze do zidentyfikowania- podobnie z przyczynami sytuacji anormalnych, w szczególności awarii. Motywy a) Ogromne rzeczywiste zapotrzebowanie na systemy rozproszone b) Dostępnośd środków technicznych i praktyczne możliwości realizacji systemów rozproszonych c) Różnorodnośd otwartych problemów związanych z konstrukcją i zarządzaniem systemami rozproszonymi Rozproszony system informatyczny Rozproszony system informatyczny obejmuje: Środowisko przetwarzania rozproszonego Węzły (autonomiczne jednostki przetwarzające) Łącza (zintegrowana sied komunikacyjna pomiędzy łączami) Środowisko przetwarzania rozproszonego jest zbiorem autonomicznych jednostek przetwarzających (węzłów, zbioru niezależnych komputerów i zasobów komputerowych zdolnych do kooperacji postrzeganych przez użytkownika jako całościowo spójny system), zintegrowanych siecią komunikacyjną (środowiskiem komunikacyjnym, łączami komunikacyjnymi, łączami transmisyjnymi). Ogólnym celem projektowym systemów rozproszonych jest stworzenie przezroczystego, otwartego, elastycznego, wydajnego i skalowalnego mechanizmy współdzielenia zasobów. Komunikacja Komunikacja między węzłami możliwa jest tylko przez transmisję pakietów informacji (wiadomości, komunikatów) łączami komunikacyjnymi. Zegary Jednostki przetwarzające realizują przetwarzanie z prędkością narzucaną przez lokalne zegary. Jeżeli zegary te są niezależne dla węzłów, to mówimy o ich asynchronicznym działaniu, natomiast jeżeli zegary lokalne są zsynchronizowane lub istnieje wspólny zegar globalny dla wszystkich węzłów, to mówimy, że działają one synchronicznie. Węzeł Jednostka przetwarzająca obejmującym: a) b) c) d) (węzeł) jest elementem środowiska przetwarzania rozproszonego Procesor Lokalną pamięd operacyjną Interfejs komunikacyjny Oprogramowanie zarządzające Łącze komunikacyjne Łącze komunikacyjne jest elementem umożliwiającym transmisję informacji między interfejsami odległych węzłów. Wyróżnia się łącza jedno- i dwu-kierunkowe. Bufory łącza Łącza wyposażone są w bufory o określonej pojemności (ang. links capacity). Jeżeli łącze nie posiada buforów (innymi słowy, posiada bufory o zerowej pojemności), to mówimy o łączu niebuforowanym, w przeciwnym razie- o łączu buforowanym. Kolejność odbierania komunikatów a) Łącza FIFO- kolejnośd odbierania komunikatów wysyłanych z danego węzła jest zgodna z kolejnością ich wysyłania b) Łącza nonFIFO- w przeciwnym wypadku Łącza mogą gwarantowad również, w sposób niewidoczny dla użytkownika, że żadna wiadomośd nie jest tracona, duplikowana lub zmieniana- są to tzw. łącza niezawodne (ang. reliable, lossless, duplicate free, error free, uncorrupted, no spurious). Czas transmisji w takim łączu niezawodnym (ang. transmission delay, in-transit time) może byd ograniczony lub jedynie określony jako skooczony lub nieprzewidywalny (dla nieprzewidywalnego czasu transmisji wiemy, że wiadomośd dotrze, ale nie wiemy, kiedy). Zbiór procesów rozproszonych Zbiór procesów sekwencyjnych realizujących wspólne cele przetwarzania Struktura środowiska przetwarzania równoległego często przedstawiana jest jako graf: w którym: Wierzchołki grafu reprezentują jednostki przetwarzające , Krawędzie grafu niezorientowanego lub łuki grafu zorientowanego, reprezentują odpowiednio łącza dwu- lub jedno-kierunkowe Przykłady topologii połączeo między węzłami: Skala przetwarzania a) Systemy koocowe (ang. end systems)- stosunkowo mała liczba komponentów dobrze zintegrowanych ze sobą, zaprojektowanych z myślą o wydajnej współpracy b) Klastry- zwiększona skala przetwarzania, koniecznośd zastosowania nowych algorytmów, zredukowana integracja pomiędzy elementami c) Sieci intranetowe- różnorodnośd, wiele centrów zarządzania, brak wiedzy o stanie globalnym, d) Internet- brak scentralizowanego zarządzania, rozproszenie geograficzne, międzynarodowy charakter sieci Klasy zastosowań a) Aplikacje wykorzystujące przetwarzanie rozproszone na wielu jednostkach obliczeniowych (ang. distributed supercomputing) b) Aplikacje wymagające dużej przepustowości (ang. high throughput) c) Aplikacje „na żądanie” (ang. on demand) d) Aplikacje intensywnie przetwarzające dane (ang. data intensive) e) Aplikacje umożliwiające współpracę (ang. collaborative) TOP 500 Stan na lipiec 2010r. Wartości Rmax oraz Rpeak są wyrażone w TFlops’ach. Rank Site 1 Oak ridge National Laboratory 2 National Supercomputing Centre in Shenzhen (NSCS) China 3 DOE/NNSA/LANL United States 4 National Institute for Computational Computer/Year Vendor Jaguar - Cray XT5-HE Opteron Six Core 2.6 GHz / 2009 Cray Inc. Nebulae - Dawning TC3600 Blade, Intel X5650, NVidia Tesla C2050 GPU / 2010 Dawning Roadrunner BladeCenter QS22/LS21 Cluster, PowerXCell 8i 3.2 Ghz / Opteron DC 1.8 GHz, Voltaire Infiniband / 2009 IBM Kraken XT5 - Cray XT5-HE Opteron Six Core 2.6 GHz Cores Rmax Rpeak Power 224162 1759.00 2331.00 6950.60 120640 1271.00 2984.30 122400 1042.00 1375.78 2345.50 98928 831.70 1028.85 Sciences/University of / 2009 Tennessee Cray Inc. United States Forschungszentrum JUGENE - Blue Gene/P Juelich (FZJ) Solution / 2009 294912 825.50 5 Germany IBM Prawo Moore’a na temat szybkości komputerów jest nadal prawdziwe! 1002.70 2268.00 Przykłady środowisk Internet 1995 45 Liczba użytkowników sieci Internet *mln+ 2002 2005 445,9 1080 (?)2015 2000 Dostęp do sieci Internet wg krajów *mln osób+ USA 197,8 Chiny 119,5 Japonia 86,3 Indie 50,6 Niemcy 46,3 Polska 10,6 GRID „Grid obliczeniowy to infrastruktura sprzętu i oprogramowania, która umożliwia niezawodny, wiarygodny, spójny, wszechobecny i niedrogi dostęp do olbrzymich możliwości obliczeniowych” /Ian Foster/ Grid tworzą maszyny połączone w sied i oprogramowane w taki sposób, by możliwe było współdzielenie zasobów (obliczeniowych, dyskowych) pomiędzy użytkowników gridu. Oprogramowanie gridu umożliwia kierowanie zadao obliczeniowych do wolnych zasobów, koordynowanie równoległej pracy wszystkich maszyn gridu i zapisywanie wyników obliczeo na uwspólnionych zasobach pamięci masowych. Mocną stroną gridów jest możliwośd wykorzystania ich do spożytkowania wolnych mocy obliczeniowych maszyn (np. stacji roboczych niewykorzystywanych w nocy). Cechy: o Usługa wiarygodna Użytkownicy żądają pewności, że otrzymają przewidywalny, nieprzerwany poziom wydajności dzięki różnym elementom tworzącym GRID. o o o Usługa wszechobecna (powszechnie dostępna) Usługa zawsze powinna byd dostępna, niezależnie od tego, gdzie znajduje się użytkownik tej usługi. Usługa spójna Potrzebny jest standardowy serwis, dostępny poprzez standardowe interfejsy, pracujący ze standardowymi parametrami. Usługa relatywnie tania Dostęp do usługi powinien byd relatywnie tani tak, by korzystanie z takiej usługi było atrakcyjne także z ekonomicznego punktu widzenia. Trzy spojrzenia na GRID: o Użytkownik- wirtualny komputer, który minimalizuje czas wykonania obliczeo oraz zapewnia dostęp do zasobów. o Programista- zestaw narzędzi i interfejsów zapewniających przezroczysty dostęp do danych. o Administrator- środowisko umożliwiające monitorowanie, administrowanie i bezpieczne używanie rozproszonych zasobów obliczeniowych, dyskowych oraz sieciowych. Czego GRID nie może: o Naruszad bezpieczeostwa i autonomii poszczególnych jednostek wchodzących w jego skład o Powodowad konfliktów w działaniu z istniejącym już oprogramowaniem o Narzucad użytkownikom języków programowania, narzędzi, bibliotek do programowania równoległego, itp. Co GRID powinien: o Umożliwiad rozproszenie geograficzne zasobów o Obsługiwad heterogenicznośd sprzętową i programową o Byd połączony poprzez heterogeniczną sied o Korzystad z ogólnie dostępnych, standardowych protokołów i interfejsów o Byd odporny na zawodny sprzęt o Pozwalad na dynamikę dostępu do sprzętu o Zrzeszad różne organizacje (wirtualne) z ich własnymi politykami bezpieczeostwa i dostępu do zasobów Cloud computing Chmura obliczeniowa (ang. cloud) to zbiór zasobów wraz z oprogramowaniem, zarządzanych i udostępnianych z użyciem usług przez dostawcę. Typowa charakterystyka Skalowalne, dostępne na żądanie Napędzane ekonomią, nie standardami; pay-as-you-go Łatwe w użyciu Dostępne dla wielu użytkowników z pomocą wirtualizacji Możliwości i ryzyka „płacisz za tyle, ile używasz” Eliminacja kosztów inwestycyjnych- infrastruktury… ryzyka Automatyzacja zarządzania przez dostawcę, automatyzacja użycia przez użytkownika (skalowalnośd na żądanie itp.) Iluzja dostępu do nieskooczonej puli zasobów dostępnych na żądanie; dowolne zastosowanie Gdzie są moje dane? Nad czym mam kontrolę? Co jeśli jeden dostawca nie działa?... Przykład: Sortowanie rozproszone Rozważmy problem sortowanie rozproszonego zbioru składającego się z naturalnych, w środowisku rozproszonym o węzłach (procesorach), gdzie . Zadaniem każdego procesu jest uporządkowanie przypisanej mu części zbioru liczb naturalnych i wyznaczenie elementu minimalnego. Element minimalny jest później wysyłany do lewych sąsiadów każdego procesora. Po otrzymaniu wiadomości z wartością minimalną, proces wyznacza element maksymalny i wysyła go do prawego sąsiada. Kroki powyższe są powtarzane dopóki zbiór nie zostanie uporządkowany. Zbiór wstępnie podzielony na podzbiory oraz : różnych liczb w taki sposób, że dla każdego mamy , - liczba elementów zbioru minimalny element zbioru maksymalny element zbioru procesy tworzące przetwarzanie rozproszone o topologii łaocucha, skojarzone ze zbiorami . Pary procesów składowych , połączone są kanałami dwukierunkowymi. Każdy z procesów ma za zadanie uporządkowad przypisany mu na wstępie zbiór i wyznaczyd element . Następnie procesy wysyłają elementy do swoich lewych sąsiadów (procesów ) i oczekują na odpowiedź zawierającą . Po otrzymaniu wiadomości z wartością , a przed wysłaniem odpowiedzi, proces wyznacza nowy element . W ogólności, nowowyznaczony może byd równy otrzymanego ostatnio . Następnie każdy z procesów wysyła odpowiedź ze swoim elementem maksymalnym do prawego sąsiada. Po otrzymaniu odpowiedzi, procesy znów sortują zbioru i jeśli w wyniku tego sortowania wartośd różnid się będzie od poprzednio wysłanego elementu minimalnego, to proces wysyła ten nowy element do lewego sąsiada. Cel sortowania rozproszonego zostaje osiągnięty, gdy uporządkowany zostanie każdy zbiór ponadto dla każdego : , , a Problem zakończenia Problem jednak w tym, że każdy proces ma tylko wiedzę lokalną, dotyczącą jego lokalnego zbioru i częściowo zbiorów bezpośrednich sąsiadów. Na tej podstawie nie mogą jednak wnioskowad o zakooczeniu całego przetwarzania. Potrzebny jest zatem dodatkowy mechanizm pozwalający stwierdzid, że globalne warunki zakooczenia sortowania rozproszonego zostały spełnione. Definicje Awaria Awaria (ang. failure)Błąd Błąd (ang. error)- Wada Wada (ang. fault)- działanie (zachowanie) procesu niezgodnie ze specyfikacją składnik stanu procesu odpowiedzialny za będącą jego następstwem awarię. Może on byd symptomem awarii, która ujawni się natychmiast lub dopiero w przyszłości. stwierdzona lub hipotetyczna przyczyna wystąpienia błędu Detektory awarii Detektor awarii to mechanizm rozproszony udostępniający procesom przetwarzania rozproszonego informacje o awariach procesów. W ogólności, detektory nie są doskonałe: mogą się mylid. Istnieją klasy detektorów o różnej jakości detekcji. (patrz: Wykład #11: Detektory awarii) Rozproszony konsensus Problemem konsensusu nazywamy sytuację, w której potrzebne jest ustalenie „kompromisu” przez wszystkie procesy biorące udział w przetwarzaniu i wybraniu przez wszystkie procesy jednej opcji zaproponowanej przez jeden z nich. Przykładowym problemem konsensusu jest wybranie pewnej liczby przez wszystkie procesy. Każdy z nich wybiera pewną wartośd i proponuje ją jako jedna z możliwości, wysyłając tę wartośd do pozostałych jednostek przetwarzających. Po zebraniu informacji od pozostałych procesów, każdy z nich ustala, która z zaproponowanych wartości jest najlepsza i tę wartośd wybiera (ostatecznie każdy z procesów musi wybrad tę samą liczbę). Wybrana liczba musi pochodzid ze zbioru początkowo zaproponowanego przez jeden z procesów uczestniczących w przetwarzaniu rozproszonym. Problem: jak dokonad wyboru? Pierwsza otrzymana wartośd (błąd- kanały komunikacyjne mogą dostarczad wiadomości w innej kolejności różnym procesom) Od predefiniowanego nadawcy (błąd- niektóre procesy mogą ulec awarii) Najmniejsza/największa otrzymana wartośd (?) Większe wartości (?) Ponadto, należy zastanowid się, jak długo czekad na zebranie propozycji. Problem dwóch armii Problem wygląda następująco: na wzgórzu znajduje się armia generała C, licząca 5000 żołnierzy, natomiast po dwóch stronach wzgórza znajdują się wrogie jemu jednostki generałów A i B o liczności po 3000 żołnierzy każda. Kryterium zwycięstwa jest licznośd armii w momencie rozpoczęcia walki, zatem, aby zwyciężyd generałowie A i B muszą zaatakowad w tym samym momencie. W tym celu generał A wysyła do generała B posłaoca z wiadomością: „Atakujemy o świcie”. Generał B, po odebraniu informacji decyduje się odesład gooca z informacją, że otrzymał wiadomośd. Gdy generał A, otrzymuje odpowiedź od generała B, że ten zna moment ataku, musi upewnid generała B o tym, że jego posłaniec dotarł do niego z potwierdzeniem. Generał A przesyła zatem informację, że wiadomośd generała B do niego dotarła. Generał B jednak, po otrzymaniu kolejnej wiadomości, zastanawia się jednak, skąd generał A będzie wiedział, że jego posłaniec dotarł na drugą stronę wzgórza przez wrogie tereny. Myśli zatem o ponownym wysłaniu posłaoca z powrotem do generała A… Łatwo zauważyd, że armie generała A i B tak naprawdę mogą nigdy nie zaatakowad, bo wciąż będą „potwierdzad potwierdzenia”. Uzgadnianie bizantyjskie Innym znanym problemem dotyczącym przetwarzania rozproszonego jest uzgadnianie bizantyjskie, które również łatwo można zobrazowad przez ukazanie kilku armii i dowodzących nimi generałów. Załóżmy, że mamy 5 armii, z jedną wyróżnioną, gdzie znajduje się dowódca. Z uwagi na znaczne siły wroga, tylko równoczesny atak wszystkich armii może doprowadzid wojska czerwone do zwycięstwa nad wojskiem żółtym. Dowódca w pewnym momencie wydaje rozkaz do ataku i przesyła go do armii A i B. Armia B po otrzymaniu komunikatu ma za zadanie przesład go dalej do armii C i D. Wszystko działa bardzo dobrze, o ile nie założymy, że armia B zdradzi i prześle do armii C i D rozkaz o odwrocie (symulacja awarii procesu). Wówczas wojsku naszego dowódcy grozi zagłada. Czy awaria jednego z procesów zawsze będzie w stanie zaszkodzid ogólnemu celowi przetwarzania rozproszonego? Jeśli spośród jest , to: procesów poprawnych jest co najmniej dwukrotnie więcej niż uszkodzonych, a tych Można rozwiązad uzgadnianie bizantyjskie w rundach rozgłaszania decyzji (duża złożonośd komunikacyjna) Można rozwiązad szybciej, pod warunkiem, że wykorzystamy do podpisywania przekazywanych rozkazów kryptograficzną pieczęd nadawcy. Załóżmy, że każdy z procesów-generałów posiada tablicę , której elementy wskazują na ilośd żołnierzy generała -tego. I tak, początkowo, każdy z generałów posiada jedną wartośd w tej tablicy, a mianowicie, ilośd żołnierzy własnej armii. Następnie każdy z procesów wysyła do wszystkich pozostałych procesów ilośd żołnierzy w jego armii. Generał C, który symuluje zdrajcę przesyła do innych armii różne wartości (co się stanie jeśli ?). Następnie, gdy każdy z procesów dostanie wszystkie komunikaty, następuje wymiana całych tablic pomiędzy każdą parą procesów. Proces z awarią (tzn. proces C) prześle natomiast zupełnie różne tablice do pozostałych. Zakładając, że mamy procesów, ostatecznie każdy z nich będzie posiadał tablic z różnymi wartościami. Jeżeli jest więcej niż procesów poprawnych, to dany proces -ty będzie posiadał na pozycji -tej wartości w tablicach, z których większośd będzie wskazywała na wartośd rzeczywistą. Dodatkowo, każdy z poprawnych procesów będzie wiedział, który z pozostałych jest błędny, ponieważ każda z wartości w otrzymanych tablicach na pozycji C będzie inna. Wykład #2: Przetwarzanie rozproszone Plan wykładu: a) b) c) d) e) f) g) h) Proces sekwencyjny Komunikaty, kanały komunikacyjne Stan kanału Operacje komunikacyjne Model formalny procesu sekwencyjnego Zdarzenia Warunek uaktywnienia Modele żądao Procesy rozproszone i sekwencyjne Proces rozproszony- definicja Procesem rozproszonym nazywamy współbieżne i skoordynowane (ang. concurrent and coordinated) wykonanie w środowisku przetwarzania rozproszonego zbioru procesów sekwencyjnych współdziałających w realizacji wspólnego celu przetwarzania. Proces sekwencyjny Nieformalnie, każdy proces sekwencyjny jest działaniem wynikającym z wykonywania w pewnym środowisku (kontekście) programu sekwencyjnego (algorytmu sekwencyjnego), który składa się z ciągu operacji (instrukcji, wyrażeo) atomowych (nieprzerywalnych). Klasy operacji Wyróżnia się dwie podstawowe klasy operacji: a) Wewnętrzne (ang. internal)- odnoszą się tylko do zmiennych lokalnych programu b) Komunikacyjne (ang. communication)- odnoszą się do środowiska i dotyczą komunikatów (ang. messages) oraz kanałów (ang. channels) Komunikat- definicja Komunikat (wiadomośd) jest dynamiczną strukturą danych: w której: oznacza identyfikator typu wiadomości oznacza identyfikator wiadomości oznacza identyfikator procesu nadawcy (ang. sender) oznacza identyfikator procesu odbiorcy (ang. receiver) oznacza dane do przesłania Kanał- definicja Kanał jest obiektem (zmienną) skojarzonym z uporządkowaną parą procesów , modelującym jednokierunkowe łączę transmisyjne. Typem tego obiektu jest zbiór wiadomości, którego rozmiar nazywany jest pojemnością kanału. Kanały incydentny, wejściowe i wyjściowe Kanał skojarzony z parą procesów , oznaczamy przez oraz nazywamy kanałem incydentnym z procesem i z procesem . Ponadto, kanał nazywamy kanałem wyjściowym procesu oraz kanałem wejściowym procesu . Zbiór kanałów wejściowych i wyjściowych danego procesu oznaczamy odpowiednio przez . Zbiór wszystkich kanałów incydentnych procesu oznaczymy przez (oczywiście ) Zbiór sąsiednich procesów wejściowych procesu : Zbiór sąsiednich procesów wyjściowych procesu : oraz Stan kanału Przez stan kanału rozumied będziemy zbiór, lub uporządkowany zbiór, wiadomości wysłanych przez proces , lecz jeszcze nieodebranych przez proces . Modelowanie opóźnienia w kanale W celu modelowania w kanale opóźnieo komunikacyjnych, w zbiorze wiadomości dwa rozłączne podzbiory: zbiór wiadomości transmitowanych zbiór wiadomości dostępnych Oczywiście, w każdej chwili (ang. in-transit) (ang. available, arrived, ready) . wyróżnia się Predykaty opisujące stan kanału Brak wiadomości gotowych do odebrania i brak wiadomości aktualnie wysyłanych kanałem . Istnieją wiadomości aktualnie wysyłane kanałem . Istnieją wiadomości gotowe do odebrania z kanału . Operacje komunikacyjne Operacje komunikacyjne indywidualne Efektem wykonania tej operacji jest umieszczenie wiadomości wykonanie podstawienia w kanale , a więc Jeżeli kanał nie jest pusty (predykat ma wartośd wiadomośd jest bezpośrednio dostępna ( efektem wykonania tej operacji jest pobranie wiadomości wykonanie podstawienia ma wartośd z kanału ) i pewna ), to , a więc Operacje komunikacyjne grupowe Efektem wykonania tej operacji jest umieszczenie wiadomości we wszystkich kanałach takich, że , a więc wykonanie podstawienia dla wszystkich tych kanałów Efektem wykonania tej operacji jest atomowe pobranie wiadomości od procesów i umieszczenie ich w . Tym samym, dla każdego procesu , wykonywane jest kolejno podstawienie oraz Rodzaje komunikacji Kanały o niezerowej pojemności umożliwiają realizację operacji następujących typów komunikacji: Nieblokowanej Blokowanej Komunikacja synchroniczna W komunikacji synchronicznej, nadawca i odbiorca są blokowani aż odpowiedni odbiorca odczyta przesłaną do niego wiadomośd (ang. rendez-vous). Komunikacja asynchroniczna W przypadku komunikacji asynchronicznej, nadawca lub odbiorca komunikuje się w sposób nieblokowany. Model formalny procesu sekwencyjnego Formalnie, proces sekwencyjny może byd opisany (modelowany) przez uporządkowaną czwórkę: gdzie jest zbiorem stanów procesu jest zbiorem stanów początkowych, jest zbiorem zdarzeo procesu jest funkcją tranzycji taką, że: Jeżeli zajście zdarzenia ,a w stanie jest możliwe i prowadzi do zmiany stanu na . Stan procesu Stan procesu w chwili czasu lokalnego jest w ogólności zbiorem wartości wszystkich zmiennych lokalnych skojarzonych z procesem w chwili oraz ciągów wiadomości wysłanych (wpisanych) do incydentnych kanałów wyjściowych i ciągów wiadomości odebranych z incydentnych kanałów wejściowych do chwili . Dla każdego , . W celu uproszczenia notacji, zależnośd stanu od czasu można przyjąd za domyślną i jeśli nie prowadzi to do niejednoznaczności, oznaczad będziemy stan w pewnej chwili przez . Zbiór jest zbiorem stanów początkowych, których wartości są zadawane wstępnie, bądź są wynikiem zajścia wyróżnionego zdarzenia inicjującego . Zdarzenia Zdarzenie odpowiada unikalnemu wykonaniu operacji atomowej, zmieniającemu stan ewentualnie stan incydentnych z procesem kanałów lub . procesu i Jeżeli operacja odpowiadająca zdarzeniu została wykonana, to powiemy, że zdarzenie zaszło. Klasy zdarzeń Zachodzi w procesie , w wyniku wykonania przez ten proces operacji Zachodzi w procesie , w wyniku wykonania przez ten proces operacji Zachodzi w procesie , gdy wykonał operację zmiennej lokalnej wiadomośd pochodziła od procesu , a odczytana do Zachodzi w procesie , a odczytane do zmiennej lokalnej , gdy wykonał operację wiadomości pochodzą od procesów ( ) Zachodzi, gdy proces wykonał operację, która nie zmienia stanu jego kanałów incydentnych. Do zdarzeo lokalnych zalicza się m.in. zdarzenia: o Nadanie procesowi stan (w szczególności stan początkowy) o Zakooczenie wykonywania procesu Dostępnośd wiadomości utożsamiad można z zajściem zdarzeo w środowisku komunikacyjnym: Zdarzenie dostarczenia wiadomości Zdarzenie nadejścia wiadomości Przez oznaczad będziemy zbiór procesów, których wiadomości dotarły i są dostępne dla Funkcja tranzycji Funkcja tranzycji opisuje reguły zmiany stanu na . w wyniku zajścia zdarzenia . Elementy nazwiemy tranzycjami lub krokami. W zależności od zachodzącego zdarzenia , tranzycję nazwiemy odpowiednio tranzycją wejścia, wyjścia lub lokalną. Zdarzenia dopuszczalne Funkcja tranzycji dopuszcza możliwośd zajścia zdarzenia tylko w tych stanach , dla których . Dlatego też, w wypadku gdy , powiemy, że zdarzenie jest dopuszczalne (ang. allowed) w stanie . Wprowadzimy też predykat dopuszczalne. oznaczający, że w danej chwili zdarzenie jest Zdarzenia gotowe Oprócz czynnika wewnętrznego (stanu procesu), zajście zdarzenia może byd dodatkowo uwarunkowane stanem kanałów wejściowych (środowiska). Jeśli zdarzenie może zajśd ze względu na warunki zewnętrzne (stan kanałów), to powiemy, że zdarzenie jest przygotowane lub gotowe (ang. ready). Fakt gotowości zdarzenia Predykat w danej chwili wyrażad będzie predykat . oznacza, że zdarzenie jest aktywne, czyli jednocześnie gotowe i dopuszczalne. Procesy zakończone, wstrzymane Powiemy, że proces jest w stanie koocowym jest pusty. , jeżeli zbiór zdarzeo dopuszczalnych w tym stanie Jeżeli natomiast niepusty zbiór zdarzeo dopuszczalnych zawiera wyłącznie zdarzenia odbioru i żadne z tych zdarzeo nie jest aktywne (gotowe), to powiemy, że proces jest blokowany (zablokowany). Procesy aktywne, pasywne Proces wstrzymany lub zakooczony nazwiemy pasywnym. Przez proces aktywny będziemy natomiast rozumied proces, który nie jest pasywny. Przyjmujemy, że w każdej chwili przyjmująca wartośd stan procesu reprezentuje zmienna logiczna , , gdy proces jest pasywny , gdy proces jest aktywny Proces aktywny ( ) może wysyład i odbierad wiadomości, wykonywad tranzycje lokalne, a więc potencjalnie może również spontanicznie (w dowolnej chwili) zmienid swój stan na pasywny. W stanie pasywnym procesu ( ) dopuszczalne są natomiast co najwyżej zdarzenia odbioru. Zmiana stanu procesu z pasywnego na aktywny uwarunkowana jest osiągnięciem gotowości przez chodby jedno z dopuszczalnych zdarzeo odbioru, czyli spełnieniem tak zwanego warunku uaktywnienia (ang. activation condition). Warunek ten procesu związany jest ze zbiorem warunkującym , zbiorem oraz predykatem . Zbiór warunkujący (ang. dependent set) jest sumą mnogościową zbiorów odbioru dopuszczalnych w danej chwili. Predykat activate Predykat 1. Jeżeli 2. Jeżeli 3. Jeżeli wszystkich zdarzeo zdefiniowany jest w sposób następujący: , to , to i , to: Gdzie oznacza, że pasywny proces skooczony, chod nieprzewidywalnym czasie. Predykat ready Warunek uaktywnienia procesu formalnie wyraża predykat zmieni swój stan na aktywny w Gdy proces jest uaktywniany, to wiadomości, których dostarczanie doprowadziło do spełnienia warunku uaktywnienia, są atomowo pobierane z buforów wejściowych i dalej przetwarzane. Modele żądań 1. 2. 3. 4. 5. 6. 7. Model jednostkowy Model AND Model OR Podstawowy model spośród Model OR-AND Dysjunkcyjny model spośród Model predykatowy Model jednostkowy W modelu jednostkowym warunkiem uaktywnienia pasywnego procesu jest przybycie wiadomości od jednego, ściśle określonego nadawcy. W tym przypadku , dla każdego naturalnego , . Model ten odpowiada szerokiej klasie systemów, w których procesy żądają kolejno po jednym tylko zasobie. Model AND W modelu AND proces pasywny staje się aktywnym, jeżeli dotarły wiadomości od wszystkich procesów tworzących zbiór warunkujący. Model ten nazywany jest również modelem zasobowym. Model OR W modelu OR do uaktywnienia procesu wystarczy jedna wiadomośd od któregokolwiek z procesów ze zbioru warunkującego. Model ten nazywany jest również modelem komunikacyjnym. Podstawowy model spośród W podstawowym modelu spośród z pasywnym procesem , liczba naturalna , , oraz liczba . skojarzony jest zbiór warunkujący W modelu tym proces staje się aktywny tylko wówczas, gdy uzyska wiadomości od co najmniej różnych procesów ze zbioru warunkującego . Model OR-AND W modelu OR-AND zbiór warunkujący pasywnego procesu , gdzie dla każdego naturalnego , , . jest zdefiniowany jako Proces staje się aktywny po otrzymaniu wiadomości od każdego z procesów tworzących zbiór od każdego z procesów tworzących zbiór lub … lub od każdego z procesów tworzących zbiór lub . Dysjunkcyjny model spośród W modelu dysjunkcyjnym spośród z każdym pasywnym procesem skojarzony jest zbiór warunkujący , liczby naturalne , , …, oraz liczby naturalne , , …, , gdzie dla każdego naturalnego , , , Proces staje się aktywny po otrzymaniu wiadomości od wiadomości od różnych procesów ze zbioru lub … lub zbioru . różnych procesów ze zbioru lub wiadomości od różnych procesów ze . Model dysjunkcyjny spośród redukuje się do: Modelu OR-AND, gdy dla każdego Modelu podstawowego spośród , gdy Modelu AND, gdy i Modelu OR, gdy i Model predykatowy W modelu predykatowy, dla każdego pasywnego procesu jest predykat , gdzie . Jak łatwo zauważyd, stosownie definiując predykat wszystkie wcześniej omówione modele żądao. ze zbiorem warunkującym określony można oczywiście uzyskad Wykład #3: Proces rozproszony Plan wykładu: a) b) c) d) e) f) g) h) i) Proces rozproszony Wykonanie procesu, historia procesu Stan osiągalny Relacja poprzedzania zdarzeo Diagramy przestrzenno-czasowe Niedeterminizm przetwarzania Graf stanów osiągalnych Monitory Konwencja zapisu algorytmów Proces rozproszony Proces rozproszony będący współbieżnym wykonaniem zbioru sekwencyjnych , opisuje uporządkowana czwórka procesów gdzie - jest zbiorem stanów globalnych procesu rozproszonego, - jest zbiorem stanów początkowych, - jest zbiorem zdarzeo, - jest funkcją tranzycji taką, że Zbiór stanów globalnych Zbiór stanów globalnych jest podzbiorem iloczynu kartezjaoskiego stanów lokalnych procesów składowych przetwarzania rozproszonego. zbiorów Stan globalny procesu rozproszonego w chwili czasu globalnego1 oznaczony przez , jest więc uporządkowanym zbiorem stanów lokalnych wszystkich procesów składowych w chwili : Zbiór stanów globalnych początkowych Zbiór globalnych stanów początkowych jest podzbiorem iloczynu kartezjaoskiego zbiorów stanów początkowych procesów składowych. Zbiór zdarzeń globalnych Zbiór zdarzeo globalnych jest sumą mnogościową składowych 1 Czas postrzegany przez teoretycznego zewnętrznego obserwatora zbiorów zdarzeo procesów Globalna funkcja tranzycji Globalna funkcja tranzycji jest złożeniem funkcji tranzycji procesów składowych, a więc jest zbiorem trójek , dla których istnieje takie , , że Częściowe wykonanie procesu Częściowe wykonanie procesu rozproszonego utożsamia się z ciągiem , , , zdarzeo takim, że dla każdego , , …, , procesu , składającym się naprzemiennie ze stanów i , Przez wykonanie (realizację) procesu rozpoczynające się stanem początkowym Stan osiągalny Powiemy, że stan , rozumied będziemy natomiast częściowe wykonanie jest osiągalny ze stanu , co oznaczymy przez jeżeli istnieje częściowe wykonanie . , , , , …, , , procesu takie, że ,a Globalny stan osiągalny Oznaczmy przez zbiór wszystkich możliwych wykonao (realizacji) procesu . Jeżeli istnieje wykonanie procesu takie, że jest stanem koocowym, to stan ten nazwiemy globalnym stanem osiągalnym (spójnym) procesu rozproszonego (ang. reachable, consistent). Historia wykonania Każdemu wykonaniu procesu , odpowiada pewien ciąg stanów , , …, , nazywany śladem wykonania (realizacji) procesu , a także ciąg zdarzeo , , …, , nazywany historią wykonania (realizacji) procesu. Historię , , …, oznaczamy przez , a zbiór historii- przez . Proces rozproszony jako graf Proces rozproszony jest często przedstawiany jako graf w którym: Wierzchołki grafu rozproszonego reprezentują procesy składowe przetwarzania Krawędzie grafu , , grafu niezorientowanego lub łuki grafu zorientowanego, reprezentują kanały odpowiednio dwu- lub jednokierunkowe. Graf nazywany jest grafem procesu rozproszonego lub topologią przetwarzania (topologią procesu rozproszonego). Relacja poprzedzania zdarzeń Oznaczmy przez relację poprzedzania (ang. happen before, causal precedence, happened before) zdefiniowaną na zbiorze w następujący sposób: Relacja poprzedzania lokalnego Przez oznaczamy relację poprzedzania lokalnego zdarzeo procesu taką, że wtedy i tylko wtedy, gdy oraz (lub gdy oraz ) Zdarzenia przyczynowo-zależne Zdarzenia i nazywamy przyczynowo-zależnymi, jeżeli W przeciwnym razie zdarzenia te nazwiemy przyczynowo-niezależnymi lub współbieżnymi (ang. concurrent, causally independent), co będziemy oznaczad przez . Diagramy przestrzenno-czasowe Realizację przetwarzania rozproszonego można przedstawid graficznie w postaci diagramu przestrzenno-czasowego (ang. space-time diagram), w którym osie reprezentują upływ czasu globalnego, a punkty na osiach- zdarzenia. Przez analogię do relacji na zbiorze zdarzeo, można zdefiniowad częściowy porządek na zbiorze stanów wszystkich procesów w sposób następujący: Relacja powyższa oznacza, że stan jednego procesu poprzedza przyczynowo stan innego, wtedy i tylko wtedy, gdy zdarzenie rozpoczynające drugi stan zależy przyczynowo bądź jest tożsame ze zdarzeniem kooczącym pierwszy stan. Stany lokalne, dla których nie zachodzi ani relacja ani też relacja , nazywamy współbieżnymi. Graf stanów osiągalnych Zbiór częściowo uporządkowany może byd przedstawiony w postaci grafu zorientowanego, w którym wierzchołki odpowiadają stanom , a łuki oznaczają istnienie zdarzenia dopuszczalnego takiego, że Graf taki, będziemy nazywad grafem stanów osiągalnych przetwarzania rozproszonego lub siatką obliczeo rozproszonych. Przykład: Niedeterminizm przetwarzania W kontekście grafu stanów osiągalnych przetwarzania rozproszonego, każda realizacja przetwarzania rozproszonego jest pewną ścieżką w tym grafie. Istnienie wielu różnych ścieżek ilustruje niedeterminizm przetwarzania rozproszonego, oznaczający, że dla danego stanu może istnied wiele stanów następnych. Lokalne zdarzenie procesu jest niedeterministyczne, gdy jego zajście może byd zastąpione przez zajście innego zdarzenia i wybór ten nie jest przewidywalny. Jeżeli przykładowo sekwencyjne wykonanie procesu może byd w każdej chwili zmienione w wyniku zajścia przerwania zewnętrznego, to wszystkie zdarzenia tego procesu są niezdeterminowane. Przetwarzanie nazywamy zdeterminowanym jeżeli wszystkie zdarzenia są zdeterminowane. W przeciwnym wypadku, przetwarzanie nazywamy niedeterministycznym. Przetwarzanie quasi-deterministyczne W ramach niedeterministycznego przetwarzania rozproszonego wyróżnia się podklasę przetwarzania quasi-deterministycznego (ang. quasi-deterministic, piece-wice deterministic, event-driven), w której niedeterminizm jest wyłącznie konsekwencją niedeterminizm operacji odbioru. Diagramy równoważne Należy zauważyd, że w ogólności istnieje wiele różnych diagramów przestrzenno-czasowych, którym odpowiada taki sam zbiór częściowo uporządkowany . Diagramy takie nazywamy diagramami równoważnymi. Przykład diagramów równoważnych: Monitor Ocena wartości predykatów globalnych wymaga w pierwszej kolejności obserwacji (monitorowania) stanów lokalnych procesów składowych. W tym celu przyjmiemy, że z każdym procesem skojarzony jest proces monitora . Cechy monitora Monitor może odczytywad (obserwowad) zmienne lokalne procesu Monitor może obserwowad i kontrolowad zdarzenia komunikacyjne Monitor nie ma natomiast możliwości zmiany stanu procesu przez przypisanie jego zmiennym lokalnym nowych wartości Konwencja zapisu algorytmów Typy komunikatów: Aplikacyjne Kontrolne Sygnały Pakiety Wspólne atrybuty: Identyfikator typu komunikatu Identyfikator komunikatu Identyfikator nadawcy Identyfikator odbiorcy Typ FRAME Typ MESSAGE Struktura komunikatów aplikacyjnych, nazwana MESSAGE, jest wywiedziona ze struktury FRAME, a jej precyzyjna definicja zawarta jest w programie aplikacji rozproszonej i nie jest istotna z punktu widzenia prezentowanych dalej algorytmów. Przyjmiemy zatem tylko, że szkielet definicji struktury MESSAGE ma poniższą postad: Typ CONTROL Typ SIGNAL Typ PACKET Wykład #4: Czas wirtualny, złożoność algorytmów Plan wykładu: a) Zegary logiczne: Skalarne Wektorowe b) Kanały: FIFO Typu FC c) Rząd funkcji, funkcja kosztu d) Złożonośd komunikacyjna i czasowa algorytmu e) Warunki poprawności algorytmu Czas wirtualny Zegary realizowane w systemach asynchronicznych mają stanowid aproksymację czasu rzeczywistego. Aproksymacja taka uwzględnia jedynie zachodzące w systemie zdarzenia i dlatego czas ten nazywany jest czasem wirtualnym (logicznym). W odróżnieniu od czasu rzeczywistego upływ czasu wirtualnego nie jest więc autonomiczny, a zależy od występujących w systemie zdarzeo i stąd określone wartości czasu wirtualnego mogą nigdy nie wystąpid. Czas wirtualny wyznacza się za pomocą zegarów logicznych (ang. logical clocks). Zegar logiczny- definicja Zegar logiczny systemu rozproszonego jest funkcją zbiór uporządkowany taką, że: gdzie jest relacją porządku na zbiorze , odwzorowującą zbiór zdarzeo w . Należy zauważyd, że w ogólności relacja odwrotna nie musi byd spełniona, tzn. . Ogólnie mówiąc, zegarem logicznym systemu rozproszonego nazywamy pewien abstrakcyjny mechanizm, który każdemu zdarzeniu przyporządkowuje pewną wartośd określaną czasem wirtualnym. Zegary logiczne- właściwości a) Jeśli zdarzenie zachodzi przed w tym samym procesie, to wówczas wartośd zegara logicznego odpowiadającego zdarzeniu jest mniejsza od wartości zegara logicznego odpowiadającego zdarzeniu . b) W przypadku przesyłania wiadomości , czas logiczny przyporządkowany zdarzeniu nadania wiadomości jest zawsze mniejszy niż czas logiczny przyporządkowany zdarzeniu odbioru tej wiadomości. Zegar skalarny- definicja Jeżeli przeciwdziedzina funkcji zegara logicznego jest zbiorem liczb naturalnych rzeczywistych , to zegar ten nazywany jest zegarem skalarnym. Realizacja zegarów skalarnych Funkcja implementowana jest przez zmienne naturalne procesami (monitorami ). Wartośd zmiennej reprezentuje w każdej chwili wartośd funkcji ostatniego zdarzenia , jakie zaszło w procesie logicznego w tym procesie. , lub , skojarzone z , odnoszącą się do , a tym samym reprezentuje upływ czasu Algorytm Lamporta Algorytm umożliwia synchronizację zegarów systemowych w sieci rozproszonej. Lamport wykazał, że synchronizacja zegarów nie musi byd absolutna, tzn. do poprawnego działania algorytm nie wymaga zegarów odmierzających czas fizyczny (wystarczające są zegary logiczne, mierzące czas wirtualny). Idea algorytmu Lamporta polega na dokonywaniu korekty czasu procesu odbierającego komunikat zgodnie z relacją poprzedzania zdarzeo (patrz: Wykład 3: Relacja poprzedzania zdarzeo). Proces, odbierający komunikat, sprawdza czas nadania tego komunikatu i porównuje ze swoim czasem odbioru. Jeśli czas odbioru jest późniejszy, dokonywana jest korekta, jeśli natomiast czas odbioru jest wcześniejszy od czasu nadania, to proces odbierający koryguje swój czas tak, żeby czas odbioru był o jeden impuls późniejszy względem czasu nadania (poprzez dodanie odpowiedniej ilości impulsów). Głównym założeniem tego algorytmu jest fakt, że nie jest ważny czas absolutny, a jedynie następstwo zdarzeo poszczególnych procesów. Zatem nie jest ważnym z punktu widzenia pojedynczego procesu czas systemowy. type PACKET extends FRAME is record of : INTEGER : MESSAGE end record : MESSAGE : PACKET : INTEGER : INTEGER 1 2 3 4 5 6 7 8 9 10 when do end when when do 11 12 13 14 15 16 end when when do end when Przykład synchronizacji zegarów logicznych Relacja między zbiorem zdarzeo i zbiorem wartości zegara skalarnego: Zegar wektorowy- definicja Zegarem wektorowym jest zegar logiczny, dla którego przeciwdziedzina funkcji (w przypadku zegarów wektorowych dla odróżnienia funkcję oznacza się przez ) jest zbiorem -elementowych wektorów liczb naturalnych lub rzeczywistych. Realizacja zegarów wektorowych Funkcja implementowana jest przez zmienne tablicowe , , skojarzone z poszczególnymi procesami. Zmienna jest tablicą liczb naturalnych, odpowiadającą pewnej aproksymacji czasu globalnego z perspektywy procesu . W efekcie aktualna wartośd tablicy odpowiada w każdej chwili wartości funkcji odnoszącej się do ostatniego zdarzenia, jakie zaszło w procesie . Algorytm Matterna type PACKET extends FRAME is record of : array of INTEGER : MESSAGE end record : MESSAGE : PACKET : array : INTEGER : INTEGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 of INTEGER when do end when when for all do do end for end when when end when do Twierdzenie 1 W każdej chwili czasu rzeczywistego gdzie zmienna reprezentuje skalarny czas lokalny procesu , a zmienna , aktualne wyobrażenie procesu o bieżącym skalarnym czasie lokalnym procesu , . Relacje na etykietach wektorowych Twierdzenie 2 Niech oraz będą wartościami zegarów wektorowych zdarzeo i . Wówczas Kanały Kanały FIFO Kanały gwarantujące porządek odbioru wiadomości zgodny z kolejnością wysyłania będziemy nazywad kanałami FIFO (ang. First-In-First-Out). Algorytm Müllender’a type PACKET extends FRAME is record of : INTEGER : MESSAGE end record : MESSAGE : PACKET : array of set of PACKET : array : array : BOOLEAN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 of INTEGER of INTEGER when do end when when if then do else end if while for all if do do then end if end for end while end when Cechy kanałów FIFO są pewnym mechanizmem synchronizacji wymaganym przez wiele aplikacji ułatwiają znalezienie rozwiązania i konstrukcję algorytmów rozproszonych dla wielu problemów ograniczają, w porównaniu z kanałami nonFIFO, współbieżnośd komunikacji, a tym samym efektywnośd przetwarzania Kanały typu FC Kanały typu FC (ang. Flush Channels) łączą zalety kanałów FIFO i nonFIFO (pewien stopieo synchronizacji i współbieżnej komunikacji). Mechanizmy (operacje) komunikacji zdarzenia Wiadomości (ang. two-way-flush send) (ang. forward-flush send) (ang. backward-flush send) (ang. ordinary send) Wyprzedzanie wiadomości Powiemy, że wiadomośd wyprzedza wiadomośd w kanale , jeżeli wiadomośd wysłana przez wcześniej niż , lecz proces najpierw odebrał wiadomośd . została Wiadomośd typu TF (ang. two-way-flush send); operacja Wiadomośd typu FF (ang. forward-flush send); operacja Wiadomośd typu BF (ang. backward-flush send); operacja Wiadomośd operacja typu OF (ang. ordinary send); Łatwo zauważyd, że najmniejszą swobodę w komunikacji i w efekcie najmniejszy poziom współbieżności, oferuje operacja , a największą swobodę- operacja . Pierwsza z nich modeluje w istocie kanały FIFO, a ostatnia- kanały nonFIFO. Implementacja kanałów FC Kanały typu FC mogą byd implementowane z użyciem różnych mechanizmów: selektywnego rozgłaszania liczników potwierdzeo … Relacja binarna poprzedzania - stan kanału - binarna relacja poprzedzania typu F, zdefiniowana na zbiorze Jeżeli zachodzi predykat: : to mówimy, że bezpośrednio poprzedza i fakt ten oznaczamy przez , czyli Konstrukcja relacji poprzedzania W celu implementacji kanałów FC należy rozwiązad problem efektywnego wyznaczenia relacji przekazywania istotnych jej elementów do monitora odbiorcy. Mechanizm sukcesywnej konstrukcji relacji wysyłaniu kolejnych wiadomości. Niech poprzez stosowne uaktualnienie relacji przy oznacza ostatnią wiadomośd typu TF lub BF wysłaną kanałem Jeżeli jest typu OF i , to Jeżeli jest typu BF i , to Następnie i : . Jeżeli jest typu FF, to dla wszystkich takich, że nie ma następnika w , Jeżeli jest typu TF, to dla wszystkich takich, że nie ma następnika w , Następnie Przekazywanie informacji o relacji poprzedzania W tym celu można zaproponowad przesyłanie wiadomości aplikacyjnych w pakietach, zawierających dodatkowo: Typ wiadomości (OF, BF, FF, TF) Numer sekwencyjny wiadomości ( ) Numer sekwencyjny wiadomości bezpośrednio poprzedzającej Algorytm Kearnsa, Campa i Ahuja type PACKET extends FRAME is record of : enum(OF, BF, FF, TF) : INTEGER : INTEGER : MESSAGE end record : MESSAGE : PACKET : array : array : array : array : BOOLEAN : INTEGER 1 2 3 procedure do if 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 of set of PACKET of INTEGER of INTEGER of set of INTEGER then if then end if else /* if */ then end if end if end procedure when do end when when do end when when do 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 end when when do end when when do if then else end if while do for all if end if end for end while end when do then Środowisko zachowujące uporządkowanie przyczynowe Algorytm Birmana, Schipera i Stephensona type PACKET extends FRAME is record of : array of INTEGER : MESSAGE end record : MESSAGE : PACKET : array : INTEGER 1 2 3 4 5 6 7 8 when of INTEGER do end when when do 9 wait until 10 11 12 13 14 15 16 17 if then end if for all do end for end when Algorytm Schipera, Egli, Sandoza type PACKET extends FRAME is record of : array of INTEGER : set of record of : PROCESS_ID : array of INTEGER end record : MESSAGE end record 1 2 3 4 5 6 7 8 9 10 11 : MESSAGE : PACKET : array of INTEGER : set of record of : PROCESS_ID : array of INTEGER end record : BOOLEAN : set of PACKET : set of PACKET : array of INTEGER procedure TryToDeliver( : PACKET) do if then else end if if for all if then do then 12 13 else 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 for do for all do end for end for end if end for for all do end for end if end procedure when do for do end for end when when do while for all end for end while end when do do Funkcje kosztu Oznaczenia zbiór wszystkich poprawnych danych wejściowych koszt wykonywania algorytmu rozmiar danych wejściowych , jest zadaną funkcją. W praktyce, zamiast kosztu . algorytmu dla danych , gdzie i (rozmiar zadania) taki, że , gdzie stosuje się zwykle jego oszacowanie w funkcji rozmiaru zadania Definicja Funkcją kosztu wykonania algorytmu nazywad będziemy odwzorowanie gdzie jest zbiorem wszystkich poprawnych danych wejściowych o rozmiarze algorytmu . Najczęściej stosowane jest odwzorowanie pesymistyczne (najgorszego przypadku), zdefiniowane w następujący sposób: Rząd funkcji Niech i będą dowolnymi funkcjami odwzorowującymi w . Mówimy, że funkcja jest co najwyżej rzędu funkcji , co zapisujemy: istnieje stała rzeczywista oraz takie, że dla każdej wartości zachodzi: Mówimy, że funkcja jest dokładnie rzędu funkcji , co zapisujemy: Mówimy, że funkcja jest co najmniej rzędu funkcji , co zapisujemy: jeżeli , jeżeli jeżeli Złożoność czasowa W wypadku algorytmów rozproszonych, złożonośd czasowa jest funkcją kosztu wykonania, wyrażoną przez liczbę kroków algorytmu do jego zakooczenia przy założeniu, że: Czas wykonywania każdego kroku (operacji) jest stały Kroki wykonywane są synchronicznie Czas transmisji wiadomości jest stały W analizie złożoności czasowej algorytmów rozproszonych przyjmuje się też na ogół, że: Czas przetwarzania lokalnego (wykonania każdego kroku) jest pomijalny (zerowy) Czas transmisji jest jednostkowy Złożoność komunikacyjna Złożonośd komunikacyjna jest funkcją kosztu wykonania algorytmu wyrażaną przez: Liczbę pakietów (wiadomości) przesyłanych w trakcie wykonywania algorytmu do jego zakooczenia Sumaryczną długośd (w bitach) wszystkich wiadomości przesłanych w trakcie wykonywania algorytmu W konsekwencji wyróżniamy złożonośd pakietową i bitową. Przykład #1- Bariera a) b) c) d) Topologia połączeo- graf w pełni połączony Koordynator rozgłasza komunikat początku bariery ( komunikatów) Wszyscy uczestnicy odbierają komunikat i odsyłają potwierdzenia ( komunikatów) Po otrzymaniu potwierdzeo od wszystkich procesów, koordynator rozsyła komunikat kooca bariery ( komunikatów). Razem mamy komunikatów. Przykład #2- Bariera a) Topologia połączeo- pierścieo logiczny b) Koordynator wysyła komunikat początku bariery c) Wszyscy uczestnicy odbierają komunikat i przesyłają go dalej (komunikaty płyną wzdłuż pierścienia przez wszystkie procesy, aż komunikat początku bariery wróci do koordynatora, zatem mamy komunikatów) d) Po otrzymaniu komunikatu rozpoczynającego operację bariery, koordynator przesyła komunikat kooca bariery (sytuacja podobna co przy przesłaniu komunikatu o rozpoczęciu bariery, zatem również komunikatów). Razem mamy komunikatów. Warunki poprawności Analizę poprawności algorytmu rozproszonego (procesu rozproszonego) dekomponuje się zwykle na analizę jego bezpieczeostwa i żywotności. Właściwośd bezpieczeostwa (ang. safety, consistency) Własnośd ta wyraża, jakie operacje proces rozproszony może wykonad, a jakie są mu zabronione. Przykładami są tutaj: Wzajemne wykluczanie (ang. mutual exclusion)- nie więcej niż jeden proces może korzystad w danym momencie z sekcji krytycznej Brak zakleszczenia- żaden proces nie jest kiedykolwiek opóźniany przez oczekiwanie na zdarzenie, które nigdy nie nastąpi Częściowa poprawnośd (ang. partial correctness)- jeśli algorytm zakooczy się, rezultat jego działania jest taki, jaki był wymagany Własnośd bezpieczeostwa jest przedstawiana jako niezmiennik przetwarzania, czyli warunek, który jest spełniony w każdym możliwym punkcie wykonania programu. Jest ona dowodzona przez wykorzystanie indukcji, co oznacza, że dowodzi się prawdziwości wyznacznika dla początkowego stanu procesu rozproszonego i dla każdej tranzycji pomiędzy kolejnymi stanami przetwarzania. Właściwośd żywotności (postępu) (ang. liveness, progress) Własnośd ta wyraża, co program musi zrobid, a także co się wydarzy w procesie rozproszonym, pod wpływem pewnego zdarzenia. Do przykładów należą: Zaufana komunikacja- wiadomośd, która została wysłana przez pewien proces, musi zostad odebrana Globalna poprawnośd- algorytm zakooczy się, a rezultat jego działania jest taki, jaki był wymagany Własnośd żywotności jest przedstawiana jako zbiór aksjomatów żywotności, a jej poprawnośd dowodzi się przez weryfikację tychże aksjomatów. Dowody własności bezpieczeostwa są często odseparowane od ich odpowiedników dla własności żywotności, natomiast dowody własności żywotności często opierają się na dowodach warunku bezpieczeostwa. Wykład #5, 6: Detekcja zakleszczenia Plan wykładu: a) b) c) d) e) f) 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 spośród . Wprowadzenie 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ą ewentualne komunikaty potwierdzające przydział żądanych zasobów. Nieformalna definicja problemu zakleszczenia W przetwarzaniu rozproszonym może w ogólności wystąpid 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 nazywamy zakleszczeniem rozproszonym (ang. distributed deadlock). Mówimy też, że proces jest w stanie zakleszczenia, jeżeli oczekuje on na zdarzenie, które nigdy nie nastąpi. Zakleszczenie może mied miejsce w czasie komunikacji między procesami, ale również- przede wszystkim- jest związane z zarządzaniem zasobami. W tym kontekście istnieją cztery warunki dla powstania zakleszczenia: Procesy muszą żądad wyłącznego dostępu do pewnego zasobu Procesy muszą przetrzymywad pewne zasoby w czasie czekania na inne (zdobywanie zasobów jeden po drugim) Zasoby nie mogą byd usuwane z oczekujących procesów Istnieje pierścieo procesów, w którym każdy z nich przetrzymuje jeden lub więcej zasobów wymaganych przez następny proces w łaocuchu Techniki, umożliwiające unikanie lub odtwarzanie stanu sprzed zakleszczenia, polegają na uniemożliwieniu zaistnienia chodby jednego z powyższych warunków. Jedną z najlepiej udokumentowanych technik, służących powyższemu celowi, chod wielce niepraktyczna, jest algorytm bankiera autorstwa Dijkstry. Procesy aktywne i pasywne W każdej chwili proces może byd w jednym z dwóch stanów: aktywnym lub pasywnym. Proces aktywny może realizowad przetwarzanie, wykonując operacje odpowiadające zajściu zdarzeo wewnętrznych i komunikacyjnych. Aby stad się aktywnym, proces pasywny musi spełnid warunek uaktywnienia. Warunek uaktywnienia Warunek uaktywnienia jest wyrażony przez predykat Zakleszczenie Zakleszczenie- definicja Przez oznaczamy predykat stwierdzający, że w danej chwili , niepusty zbiór procesów jest zbiorem procesów zakleszczonych. Zakleszczenie w modelu jednostkowym Zakleszczenie w modelu AND Zakleszczenie w modelu OR Zakleszczenie w podstawowym modelu spośród Zakleszczenie w modelu OR-AND Zakleszczenie w modelu dysjunkcyjnym spośród Zakleszczenie w modelu predykatowym Przykłady zakleszczeń 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 Przykład- model jednostkowy Przykład- model AND Przykład- model OR Przykład- model spośród Klasyfikacja problemów detekcji zakleszczenia a) Problem detekcji wystąpienia zakleszczenia Czy istnieje w pewnej chwili zbiór , dla którego predykat jest prawdziwy? Odpowiedź na to pytanie określa wartośd predykatu: b) Problem detekcji zakleszczenia procesu Detekcja zakleszczenia procesu sprowadza się do sprawdzenia, czy prawdziwy jest predykat: c) Problem detekcji zakleszczenia zbioru procesów Detekcja zakleszczenia zbioru procesów polega na znalezieniu zbioru prawdziwy jest następujący predykat: , dla którego d) Problem detekcji maksymalnego zbioru procesów zakleszczonych Detekcja maksymalnego zbioru zakleszczonego sprowadza się do znalezienia takiego zbioru , dla którego spełniony jest poniższy warunek: gdzie Model aplikacyjnego przetwarzania rozproszonego Algorytm Chandy, Misra, Hass dla modelu AND type PROBE extends FRAME is record of : INTEGER end record 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 : PROBE : array of BOOLEAN : set of PROCESS_ID : array of BOOLEAN : INTEGER : INTEGER : BOOLEAN do when if then for all do end for end if end when when for all do do end for end when when do if then if then 21 22 23 24 25 26 27 28 29 30 else for all do end for end if end if end when Algorytmy detekcji zakleszczenia dla modelu OR Algorytm Chandy, Misra, Hass dla modelu OR Algorytm detekcji zakleszczenia dla modelu OR opiera się na przetwarzaniu dyfuzyjnym (ang. query computation). Twierdzenie 3 Jeżeli inicjator rozpoczyna detekcję w chwili, gdy jego proces aplikacyjny jest zakleszczony, to stwierdzi zakleszczenie procesu w skooczonym czasie (algorytm detekcji zakooczy się). Twierdzenie 4 Jeżeli inicjator deklaruje, że jego proces aplikacyjny jest zakleszczony, to pewnego zbioru procesów zakleszczonych w chwili zakooczenia algorytmu. Algorytm: type CONTROL extends FRAME is record of : INTEGER : INTEGER end record type QUERY extends CONTROL type REPLY extends CONTROL : QUERY : REPLY : set of PROCESS_ID : array of INTEGER : array of INTEGER : array of INTEGER : array of BOOLEAN : INTEGER należy do : INTEGER : BOOLEAN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 when if do then for all do end for end if end when when if do then if then for all do end for else if then end if end if end if end when when if do then if then 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 if then if then else end if end if end if end if end when when for all do do end for end when W przypadku odebrania przez monitor wiadomości QUERY od monitora , monitor ten sprawdza, czy monitorowany przez niego proces jest pasywny. Jeśli warunek ten jest spełniony, to sprawdzany jest numer sekwencyjny zapytania QUERY. Jeśli jest on większy od największego otrzymanego dotychczas, to aktualizowane są odpowiednio zmienne , oraz . Następnie przygotowywany jest pakiet, zawierający informację o tym numerze sekwencyjnym i inicjatorze detekcji, który zostanie wysłany do wszystkich monitorów, których monitorowane procesy należą do zbioru warunkującego procesu. Po wysłaniu tej wiadomości zmiennej na pozycji odpowiadającej identyfikatorowi przypisywana jest wartośd równa liczbie procesów tworzących zbiór warunkujący. Jeśli natomiast wartośd odebranego w pakiecie numeru sekwencyjnego jest równa wartości zapamiętanej w tablicy i proces był cały czas pasywny od czasu zapisanie tej ostatniej wartości do tablicy, to przygotowuje on odpowiedź typu REPLY i wysyła ją do procesu (monitora związanego z procesem) . Zdarzenie odbioru wiadomości typu REPLY powoduje w przypadku, gdy proces jest pasywny porównanie numerów sekwencyjnych zapisanych w odebranej wiadomości i odpowiedniej tablicy . Jeśli okaże się, że wartości te są sobie równe, a ponadto proces aplikacyjny jest procesem pasywnym od czasu ostatniej aktualizacji porównywanego elementu tablicy , to dekrementowana jest wartośd na odpowiedniej pozycji zmiennej . Jeśli po zmniejszeniu wartośd tej zmiennej wynosi i monitor odbierający komunikat jest inicjatorem detekcji, to stwierdza on, że proces aplikacyjny, który monitoruje jest zakleszczony. Jeśli natomiast wartośd zmiennej po aktualizacji jest równa , czyli proces otrzymał już wszystkie odpowiedzi na zapytanie związanie z ostatnim procesem detekcji zainicjowanym przez proces (ale ), to wysyła on wiadomośd typu REPLY do procesu, od którego otrzymał wiadomośd typu QUERY, która to spowodowała aktualizację tablicy na pozycji odpowiadającej procesowi . Uaktywnienie procesu powoduje ustawienie elementów tablicy procesowi na . Algorytm Bracha, Toueg’a type NOTIFY extends SIGNAL type DONE extends SIGNAL type CONFIRM extends SIGNAL type ACK extends SIGNAL : DONE : NOTIFY : CONFIRM : ACK : set of record of : PROCESS_ID : PROCESS_ID end record : set of PROCESS_ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 procedure : set of PROCESS_ID : INTEGER : BOOLEAN : BOOLEAN : INTEGER : BOOLEAN do for all do end for if then end if for all do end for end procedure procedure for all end for do do odpowiadających 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 for all do end for end procedure when NOTIFY_PROC() if do then end if end when when do if then end if end when when if do then end if end when Dla ilustracji działania algorytmu rozważmy przykładowy stan globalny reprezentowany przez graf oczekiwanych potwierdzeo przedstawiony poniżej. Procesy należące do zbioru są pasywne i oczekują na wiadomości od innych procesów ze zbioru , zgodnie z grafem WFG. Dla prostoty prezentacji skojarzymy z każdym wierzchołkiem grafu WFG (procesem) dwa wektory reprezentujące stan algorytmu w danym wierzchołku. Pierwszy wektor, oznaczony przez (ang. process state), jest zmienną reprezentowaną przez tablicę dwóch liczb naturalnych. Wartośd zależy od wartości zmiennej i od liczby odebranych wiadomości typu DONE. Początkowo wartośd . Po nadaniu zmiennej wartości przez monitor , przyjmuje wartośd 1. Następnie, gdy zakooczy się zainicjowana ewentualnie faza potwierdzania i odebrana zostanie ostatnia wiadomośd DONE, wartośd . Podobnie wartośd zależy od zmiennej , a także od liczby odebranych wiadomości typu ACK. Początkowo . Po nadaniu zmiennej wartości przez monitor , przyjmuje wartośd 1. Następnie, po odebraniu ostatniej wiadomości typu ACK, wartośd elementu jest zmieniana na 2. Drugi wektor skojarzony z każdym monitorem , oznaczony przez (ang. communication state), jest zmienną reprezentowaną przez tablicę trzech liczb, której elementy odpowiadają licznikom odebranych wiadomości odpowiednio typu CONFIRM, ACK i DONE. Początkowo, wszystkie te liczniki mają wartośd 0. Są one stosownie zwiększane w wyniku odebrania wiadomości typu CONFIRM, ACK i DONE. Na rysunkach poniżej wektor jest umieszczony wewnątrz wierzchołków, natomiast obok niego. Przykład #1: W rozważanym poniżej przykładzie przyjęto, że jest jedynym inicjatorem procesu detekcji zakleszczenia. Monitor wywołuje procedurę i w konsekwencji jego stan zmienia się, wiadomości typu NOTIFY zostają wysłane, co zaznaczono białym kółkiem i strzałką) do monitorów wszystkich procesów tworzących zbiór warunkujący , a monitor oczekuje na wiadomości typu DONE, potwierdzające wszystkie wiadomości typu NOTIFY. Następnie, monitory odbierają współbieżnie wiadomości typu NOTIFY i w konsekwencji wywołują procedurę , zmieniając tym samym odpowiednio i wysyłając wiadomości NOTIFY do monitorów wszystkich procesów tworzących ich zbioru warunkujące. W następnym kroku, wiadomości typu NOTIFY docierają do monitorów, których flagi są już zapalone ( ). Dlatego, monitory te wysyłają w odpowiedzi wiadomości typu DONE (zaznaczone czarnym kółkiem). W rezultacie, wektory stanów monitorów przyjmują wartośd . Umożliwia to dalej, wysłanie wiadomości typu DONE do inicjatora . Gdy inicjator otrzyma wszystkie oczekiwane wiadomości typu DONE, algorytm kooczy się stwierdzając zakleszczenie procesu . Przykład #2 Złożoność czasowa algorytmu detekcji zakleszczenia w środowisku synchronicznym dla modelu spośród Graf niezorientowany, odpowiadający grafowi WFG, scharakteryzowany jest przez: średnicę grafu , najdłuższą ścieżkę w grafie . Złożonośd całego algorytmu to: złożonośd fazy potwierdzania złożonośd powiadomienia inicjatora fazy potwierdzania złożonośd odpowiadająca przesłaniu wiadomości typu DONE od inicjatora fazy potwierdzania do inicjatora detekcji przesłanie wiadomości typu CONFIRM może zabrad jednostek czasu transmisja wiadomości typu ACK również zabiera w najgorszym wypadku jednostek czasu przesłanie wiadomości typu NOTIFY (równolegle do monitorów wszystkich procesów tworzących zbiór wymaga co najwyżej kroków przesłanie wiadomości typu DONE po zakooczeniu fazy potwierdzania wymaga co najwyżej kroków W efekcie złożonośd czasowa algorytmu wynosi . Algorytm detekcji zakleszczenia w środowisku asynchronicznym Zakładamy, że w rozważanym środowisku rozproszonym czas transmisji w niezawodnych kanałach FIFO jest skooczony, ale nieznany. Wyznaczenie stanu globalnego takiego systemu musi zatem uwzględnid stany kanałów. Wyróżnia się cztery kolory łuków: a) Grey- jeżeli proces wysłał do wiadomośd typu REQUEST, a jeszcze tej wiadomości nie odebrał, ani też nie wysłał jeszcze wiadomości typu CANCEL. b) Black- jeżeli odebrał już wiadomośd typu REQUEST od , ale jeszcze nie wysłał w odpowiedzi wiadomości typu GRANT do , ani też nie wysłał jeszcze wiadomości typu CANCEL do . c) White- jeżeli wysłał już wiadomośd typu GRANT do , ale jeszcze jej nie odebrał, ani też nie wysłał jeszcze do wiadomości typu CANCEL. d) Translucent- jeżeli wysłał wiadomośd typu CANCEL do , lecz jeszcze jej nie odebrał. Załóżmy teraz, że każdy monitor zna odpowiadające mu zbiory oraz oraz kolory wszystkich krawędzi incydentnych grafu . W tym wypadku, w przeciwieostwie do środowiska synchronicznego, nie jest prawdziwa relacja: Algorytm Bracha, Toueg’a dla środowiska asynchronicznego type NOTIFY extends SIGNAL type DONE extends SIGNAL type CONFIRM extends SIGNAL type ACK extends SIGNAL : DONE : NOTIFY : CONFIRM : ACK : set of record of : PROCESS_ID : PROCESS_ID end record : set of PROCESS_ID : set of PROCESS_ID : INTEGER : BOOLEAN : BOOLEAN : INTEGER : array of enum : array of enum : INTEGER 1 2 3 4 5 6 7 8 procedure for all end for if end if : BOOLEAN do do then 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 for all do end for end procedure procedure do for all do end for for all do end for end procedure when NOTIFY_PROC() if do then end if end when when do if then end if end when when if do then end if end when Dwufazowy algorytm detekcji zakleszczenia Algorytm detekcji zakleszczenia rozproszonego w środowisku z niezawodnymi kanałami FIFO dla modelu spośród składa się z dwóch faz wymiany wiadomości: fazy inicjacji (ang. outward sweep) fazy detekcji (ang. inward sweep) Realizacja obu powyższych faz może nakładad się w czasie. Dwufazowy algorytm detekcji zakleszczenia dla modelu type CONTROL extends FRAME is record of : INTEGER : INTEGER : REAL end record spośród type FLOOD extends SIGNAL /* odpowiednik żądao zasobu. Za jego pomocą konstruowany jest w fazie inicjacji graf WFG */ type ECHO extends SIGNAL żądania zasobu */ /* odpowiedź na komunikat typu FLOOD; zgoda na realizację type SHORT extends SIGNAL /* służy do stwierdzenia momentu zakooczenia algorytmu detekcji */ : FLOOD : ECHO : SHORT : array of set of PROCESS_ID : array of set of PROCESS_ID : INTEGER : array of INTEGER : INTEGER : INTEGER : REAL : INTEGER : INTEGER : set of PROCESS_ID : set of PROCESS_ID : BOOLEAN 1 2 3 4 5 6 7 8 9 procedure do end procedure /* Kiedy proces staje się pasywny, jego monitor zapamiętuje stan lokalny procesu oraz skalarny czas logiczny odpowiadający momentowi przyjęcia po raz ostatni przez stanu pasywnego. Następnie, może zainicjowad detekcję zakleszczenia (wówczas oznaczamy przez ), wysyłając wiadomośd typu FLOOD do monitorów wszystkich procesów należących do w chwili */ when do 10 11 12 13 14 15 16 17 18 end when when do if then 19 20 21 22 23 24 25 26 27 28 29 30 31 end if end if 32 if 33 34 35 end if 36 if 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 if then end if if then then then if then end if if then end if end if if then /* zignoruj przetwarzaną wiadomośd typu FLOOD */ end if end when when do 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 if then if then end if if then if then if then end if else end if end if end if end when when if do then /* zignoruj nieaktualną wiadomośd SHORT */ end if if then /* zignoruj wiadomośd */ end if if then /* aktualizacja wagi procesu inicjatora */ if then /* jeśli warunek spełniony, to detekcja jest zakooczona */ end if end if end when Przykład działania dwufazowego algorytmu detekcji zakleszczenia rozproszonego: Analiza złożoności czasowej dwufazowego algorytu detekcji zakleszczenia Parametry grafu niezorientowanego, odpowiadającego WFG: - średnica grafu, - najdłuższa ścieżka w grafie a) Przesłanie wiadomości typu ECHO przez wszystkie krawędzie musi byd poprzedzone wysłaniem wiadomości FLOOD w przeciwnym kierunku. Przejście wiadomości typu FLOOD przez wszystkie krawędzie wymaga kroków. b) Najdłuższa ścieżka w grafie determinuje czas wymagany na propagację wiadomości typu ECHO od monitora procesu aktywnego do inicjatora. Złożonośd czasowa algorytmu wynosi . Detekcja zakleszczenia dla modelu predykatowego W algorytmie detekcji zakleszczenia dla modelu predykatowego wykorzystana jest koncepcj ciągu (łaocucha, sekwencji) cykli detekcyjnych (ang. wave sequence), polegająca na wielokrotnym w ogólności komunikowaniu się inicjatora procesu detekcji z pozostałymi monitorami w celu wyznaczenia stanu globalnego lub wartości predykatu globalnego. W celu uproszczenia prezentacji algorytmu detekcji zakleszczenia dla modelu predykatowego przyjmiemy, że monitory procesów aplikacyjnych tworzą strukturę pierścienia: Algorytm: type PACKET extends FRAME is record of : MESSAGE end record type TOKEN extends FRAME is record of : set of PROCESS_ID : BOOLEAN end record type ACK extends SIGNAL 1 2 3 procedure if : MESSAGE : PACKET : TOKEN : ACK : BOOLEAN : BOOLEAN : INTEGER : set of PROCESS_ID : set of PROCESS_ID : INTEGER : BOOLEAN : BOOLEAN do then 4 end if 5 wait until 6 if 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 then end if end procedure when do end when when if do then end if end when when do if then else end if end when when end when do 47 48 49 50 51 52 53 54 55 56 57 58 59 60 when do end when when do end when when end when do Wykład #7, 8: Konstrukcja spójnego obrazu stanu globalnego Plan wykładu: a) b) c) d) e) f) Stan globalny Konfiguracja i konfiguracja spójna Odcięcie oraz linia odcięcia Predykaty globalne Modele stanów globalnych Koncepcja konstrukcji spójnego obrazu stanu globalnego Przypomnij sobie definicje procesu rozproszonego, wykonania procesu oraz częściowego wykonania procesu, stanu osiągalnego, a także globalnego stanu osiągalnego oraz historii wykonania przed rozpoczęciem tego wykładu (patrz: Wykład #3). Konfiguracja Zbiór konfiguracji (obrazów stanu globalnego) składowych procesu rozproszonego Konfiguracja - wektor stanów lokalnych wszystkich składowych procesów sekwencyjnych procesu rozproszonego taki, że dla każdego , Łatwo zauważyd, że jest iloczynem kartezjaoskim stanów procesów , zawiera zbiór stanów osiągalnych procesu rozproszonego . Konfiguracja spójna Konfigurację nazwiemy konfiguracją spójną lub obrazem spójnym jeżeli: (patrz: relacja poprzedzania zdarzeo). Warunek powyższy oznacza, że jeśli jakieś zdarzenie jest elementem konfiguracji spójnej , to również wszystkie zdarzenia , od których jest przyczynowo-zależny (czyli ) również są elementami tej konfiguracji spójnej. Twierdzenie 5 Konfiguracja , reprezentująca stan osiągalny przetwarzania rozproszonego jest konfiguracją spójną. Powyższe twierdzenie wynika wprost z definicji stanu osiągalnego. Wszystkie zdarzenia wchodzące w skład stanu osiągalnego procesu rozproszonego pojawiły się w wyniku pewnego wykonania. Oznacza to, że jeżeli jakieś zdarzenie wchodzi w skład stanu osiągalnego, to także muszą się w nim znaleźd wszystkie zdarzenia, od których jest przyczynowo-zależne. Twierdzenie 6 Jeżeli jest konfiguracją spójną, w której lokalne stany składowe są osiągalne w pewnej realizacji przetwarzania rozproszonego , to istnieje stan osiągalny taki, że dla każdego , , Dowód powyższego twierdzenia wynika wprost z definicji konfiguracji spójnej i stanu osiągalnego. Linia odcięcia, odcięcie spójne Oznaczmy przez odpowiadających stanom ciąg wybranych punktów (zdarzeo pozornych) odcinków czasu, poszczególnych procesów zaznaczonych na pewnym diagramie przestrzenno-czasowym. Linię łamaną łączącą punkty nazywamy linią odcięcia, która dzieli zbiór zdarzeo na przeszłośd (te zdarzenia, które zaszły przed linią odcięcia) i przyszłośd (te zdarzenia, które zaszły po linii odcięcia). Odcięciem zbioru zdarzeo nazwiemy skooczony zbiór taki, że: Definicja powyższa mówi, ze jeżeli jakieś zdarzenie należy do odcięcia, to także wszystkie zdarzenia , które są lokalnie poprzedzane przez należą do tego odcięcia. Odcięcie zbioru zdarzeo nazwiemy odcięciem spójnym, gdy: Powyższa definicja mówi, że jeśli jakieś zdarzenie należy do odcięcia, to także wszystkie zdarzenie , od których jest zależne przyczynowo, należą do tego odcięcia. Odcięcie jest późniejsze od , jeżeli . Oznacza to, że odcięcie nie zawiera żadnego takiego zdarzenia nienależącego do , który by lokalnie poprzedzało jakiekolwiek zdarzenie znajdującego się w odcięciu . Przykład #1: Na rysunku widzimy dwa odcięcia spójnei . Pierwsze z nich obejmuje dwa zdarzenia oraz . Reprezentuje ono konfigurację, w której wiadomośd jest w kanale. Drugie jest późniejsze od ( - wszystkie zdarzenia należące do należą także do ) i obejmuje dodatkowo zdarzenia oraz . Odcięcie to reprezentuje sytuację, w której wszystkie kanały są puste. Gdyby odcięcie obejmowało dodatkowo zdarzenie , nie byłoby odcięciem spójnym, gdyż istniałoby takie zdarzenie ( ), od którego byłoby przyczynowo-zależne, które równocześnie nie należałoby do odcięcia . Natomiast rozszerzenie o zdarzenie również byłoby odcięciem spójnym. Przykład #2: Odcięcia przedstawione powyżej nie są odcięciami spójnymi, co łatwo wykazad. Odcięcie zawiera , które jest zdarzeniem odbioru wiadomości wysłanej w wyniku zdarzenia . Zachodzi zatem przyczynowa zależnośd między tymi dwoma zdarzeniami ( ), podczas gdy nie należy do odcięcia . Zgodnie z twierdzeniem 9 odcięcie to nie reprezentuje więc żadnej spójnej konfiguracji. Analogiczna sytuacji zachodzi w przypadku odcięcia . W tym przypadku, zawiera ono zdarzenie odbioru wiadomości wysłanej w wyniku zdarzenia . Zachodzi więc, podobnie jak poprzednio, przyczynowa zależnośd między oraz ( ), podczas gdy zdarzenie nie należy do odcięcia . Aby te odcięcia stały się odcięciami spójnymi, należy albo je poszerzyd o dodatkowe zdarzenia, albo pewne zdarzenia z nich usunąd. W przypadku odcięcia należałoby albo usunąd zdarzenie , albo dodad zdarzenie . W przypadku odcięcia , aby stało się ono odcięciem spójnym, należałoby je poszerzyd o zdarzenie , albo usunąd z niego zdarzenie . Twierdzenie 7 Dla odcięcia spójnego z linią odcięcia żadna para stanów (zdarzeo), odpowiadających linii odcięcia nie jest wzajemnie zależna. Twierdzenie 8 Dla każdego diagramu przestrzenno-czasowego z odcięciem spójnym określonym przez linię odcięcia istnieje równoważny diagram przestrzenno-czasowy, w którym linię odcięcia tworzą zdarzenia równoczesne w sensie czasu globalnego . Twierdzenie powyższe oznacza, że linie łamane reprezentujące odcięcia na diagramach przestrzennoczasowych można „przesuwad” tak, by otrzymad równoległe linie proste reprezentujące równoważne odcięcia. Zgodnie z definicją, każdemu odcięciu konfiguracja opisanemu przez linię odcięcia odpowiada . Twierdzenie 9 Niech będzie konfiguracją, a odpowiadającym jej odcięciem. Konfiguracja spójną, wtedy i tylko wtedy, gdy jest odcięciem spójnym. jest konfiguracją Predykaty globalne i ich własności Predykat globalny - predykat zdefiniowany na zbiorze osiągalnych stanów globalnych przetwarzania rozproszonego. Predykat stabilny- prawdziwośd predykatu w stanie globalnym implikuje jego prawdziwośd we wszystkich stanach osiągalnych z (patrz: stan osiągalny). Przykładowymi predykatami stabilnymi są predykaty definiujące stan zakleszczenia, zakooczenie przetwarzania, utraty znacznika, przekroczenia czasu obliczeo, czy czasu transmisji itp. Predykaty można także klasyfikowad w inny sposób. Przykładem są tutaj predykaty słabe, które uznaje się za predykaty prawdziwe w przetwarzaniu rozproszonym, jeżeli istnieje taki spójny stan globalny, w którym są spełnione, oraz predykaty silne, które uznaje się za prawdziwe w przetwarzaniu rozproszonym, gdy są uznawane za prawdziwe w pewnej chwili przez wszystkich uczestników przetwarzania. Duże znaczenie praktyczne posiadają też predykaty zdefiniowane na zbiorze wykonao historia wykonania), a w szczególności poniższe predykaty: (patrz: Predykat - zachodzi wtedy i tylko wtedy, gdy istnieje wykonanie , zawierające stan globalny , dla którego zachodzi predykat . Predykat - jest prawdziwy wtedy i tylko wtedy, gdy w każdym możliwym wykonaniu osiągalny jest stan , dla którego zachodzi . W ogólności wyznaczenie predykatów globalnych w pełni asynchronicznym systemie rozproszonym bez przyjęcia dodatkowych założeo jest niemożliwe, jeżeli chociaż jeden proces może ulec awarii. Stan globalny systemu W systemach rozproszonych, bardzo wiele problemów praktycznych i teoretycznych sprowadza się wprost do ciągłej lub okresowej obserwacji stanu globalnego systemu określonego jako zbioru stanów lokalnych procesów oraz wiadomości znajdujących się w kanałach komunikacyjnych. Znajomośd takiego stanu pozwala bowiem na wykrycie specyficznych sytuacji, niewidocznych z perspektywy pojedynczego procesu, i podjęcie stosownych działao. Przykładamy problemów redukujących się w istocie do oceny stanu globalnego są: Śledzenie i sterowanie wykonywaniem programu rozproszonego (ang. monitoring and debugging) Detekcja stanów awaryjnych (np. utraty wiadomości, zakleszczenia) lub oczekiwanych (np. zakooczenie obliczeo rozproszonych). Stany takie można wykryd tworząc obraz stanu globalnego, a następnie dokonując jego analizy (należy jednak wspomnied, że rozwiązania specjalizowane są często bardziej efektywne). Dostosowywania konfiguracji i funkcji systemu do zmieniającego się obciążenia (np. podział i równoważenie obciążenia, adaptacyjny wybór połączeo) Wyliczenie pewnej globalnej wartości zarządzanej przez program rozproszony Utworzenie kopii zapasowych stanu globalnego programu Obraz stanu globalnego nazywa się też czasami migawką stanu globalnego (ang. global snapshot). Nieformalnie, obraz stanu globalnego określid można jako spójny, jeżeli dla każdego z procesów wygląda, jak gdyby został wyznaczony w jednej chwili we wszystkich częściach systemu. Można tutaj określid stan globalny jako zbiór stanów wyznaczonych w jednej chwili we wszystkich częściach systemu- w asynchronicznym środowisku rozproszonym taka definicja jest jednak nierealna. Zamiast tego więc, mówi się raczej o zbiorze stanów niezależnych wzajemnie od siebie. Modele stanów globalnych Jako przykładowy problem wyznaczania obrazu stanu globalnego rozważmy przetwarzanie rozproszone obejmujące trzy procesy , które współdzielą pewien zasób w trybie wzajemnego wykluczania. Jak wiadomo, problem wzajemnego wykluczania można stosunkowo łatwo rozwiązad, przyjmując, że warunkiem koniecznym dostępu do współdzielonego zasobu (sekcji krytycznej) jest posiadanie w danej chwili unikalnego komunikatu- znacznika (ang. token). Znacznik krążąc między procesami połączonymi w logiczny pierścieo (reprezentowany przez graf cykliczny) wskazuje kolejno procesy uprawnione do operowania na zasobie współdzielonym. Innymi słowy, tylko proces posiadający w danej chwili znacznik posiada równocześnie dostęp do zasobu. Stan procesu zmienne: w każdej chwili czasu globalnego (rzeczywistego) zdefiniowany jest przez trzy - przyjmuje wartośd tylko wówczas, gdy znacznik typu TOKEN znajduje się w chwili w procesie (proces ten posiada znacznik i jednocześnie dostęp do współdzielonego zasobu). - kolejka znaczników wysłanych do chwili przez proces . - kolejka znaczników odebranych przez proces do chwili . Przykład: Zakładamy, że w globalnym stanie początkowym wszystkie kolejki są początkowo puste oraz znacznik znajduje się w procesie . ,a Przedstawione podejście jest powszechnie stosowane, a jego dużą zaletą jest ograniczanie liczby składowych stanu globalnego do liczby procesów ( ). Z drugiej jednak strony, ma ono z praktycznego punktu widzenia pewne określone wady: Podejście jest adekwatne tylko dla systemów z kanałami niezawodnymi Poważną trudnośd stanowi koniecznośd pamiętania wszystkich dotychczas wysłanych i odebranych wiadomości. Z upływem czasu rośnie bowiem istotnie koszt przechowywania i przetwarzania tej informacji. Podejście alternatywne Wady przedstawionego podejścia powodują, że w praktyce stosowane jest też podejście alternatywne, polegające na definiowaniu stanu globalnego jako złożenia stanów lokalnych procesów i stanów kanałów komunikacyjnych. Prowadzi to do reprezentacji stanu globalnego przez składowych, odpowiadających stanom lokalnym wszystkich procesów i wszystkich kanałów. Liczba składowych jest w tym wypadku oczywiście większa, lecz reprezentacja stanu procesu może byd dużo prostsza i w rezultacie efektywniejsza z punktu widzenia zajętości pamięci i kosztów przetwarzania (prostsza reprezentacja stanu procesu kosztem większej liczby składowych). W celu ilustracji podejścia alternatywnego rozważmy jeszcze raz poprzedni przykład. Przyjmijmy, że stan procesu jest w każdej chwili określony przez zmienną logiczną oraz przez liczniki (ang. sent number) i (ang. receive number), o wartościach równych liczbie dotychczas wysłanych i odebranych znaczników typu TOKEN. Z kolei stan kanału określony może byd przez zbiór znaczników, znajdujących się aktualnie w kanale . Możliwa jest też reprezentacja jeszcze prostsza, w której stan procesu określony jest przez zmienną , a stan kanału przez analogiczną zmienną . Zmienne te przyjmują wartości tylko wówczas, gdy znacznik typu TOKEN znajduje się aktualnie w odpowiednim procesie lub kanale. Przykład: Niech dla prostoty zapisu „1” oznacza obecnośd znacznika, a „0”- jego brak. W efekcie stan globalny możemy przedstawid w naszym przypadku w sposób następujący: Tym samym kolejne stany mają postad: do do do - znacznik jest w posiadaniu procesu , kanały są puste - znacznik znajduje się w kanale (został wysłany przez , ale jeszcze nie dotarł - znacznik jest w posiadaniu procesu , kanały są puste - znacznik znajduje się w kanale (został wysłany przez , ale jeszcze nie dotarł - znacznik jest w posiadaniu procesu , kanały są puste - znacznik znajduje się w kanale (został wysłany przez , ale jeszcze nie dotarł ) ) ) Graf stanów osiągalnych Graf stanów osiągalnych przedstawiony poniżej odpowiada przesyłaniu unikalnych znaczników w pierścieniu trzech procesów. Przedstawiony przykład ilustruje dotychczasowe rozumienie stanu lokalnego procesów oraz stanu globalnego przetwarzania rozproszonego- jako historii przetwarzania. Należy zaznaczyd, że rozumienie to pozwala na określenie w każdej chwili aktualnego stanu kanałów na podstawie stanów lokalnych procesów. Ocena stanów globalnych W rozważanych przypadkach ocena stanów globalnych w wybranych momentach czasu może mied na celu sprawdzenie, czy rzeczywiście w każdej chwili w systemie jest dokładnie jeden znacznik. Zaginięcie znacznika, wynikające na przykład z błędu programu, w którymkolwiek węźle, uniemożliwia procesom w sposób trwały wejście do sekcji krytycznej, co może prowadzid do blokady całego systemu. Z kolei stwierdzenie zwielokrotnienia znaczników oznacza możliwośd jednoczesnego działania dwóch lub więcej procesów w sekcjach krytycznych, co w ogólności prowadzi do błędów współbieżnego działania procesów. Porównanie reprezentacji stanów globalnych Przedstawione reprezentacje stanów globalnych nie są równoważne: Pierwsza reprezentacja operuje na informacji najpełniejszej: unikalnych znacznikach i całej historii komunikacji Druga reprezentacja utożsamia wszystkie znaczniki i wyróżnia tylko stany ich obecności oraz nieobecności w poszczególnych procesach i kanałach Powstaje zatem problem wyboru odpowiedniego modelu stanu globalnego. Warto tu podkreślid, że wybór ten zależy istotnie od zastosowania, które w dużej mierze narzuca wymaganą precyzję reprezentacji stanu lokalnego i globalnego. Metoda wyznaczania stanu globalnego Analizując dotychczas przedstawione modele stanów globalnych, abstrahowano od problemu jednoczesnego wyznaczenia poszczególnych składowych stanu globalnego, a więc wyznaczenie stanów lokalnych wszystkich procesów i ewentualnie kanałów w określonej, tej samej chwili. Oznaczało to niejawne założenie istnienia idealnego obserwatora zewnętrznego, który ma dostęp jednocześnie do wszystkich procesów tworzących przetwarzanie, co nie jest niestety możliwe w systemie asynchronicznym. Niestety, w asynchronicznym środowisku rozproszonym takie podejście ma tylko znaczenie teoretyczne z uwagi na jego cechy: Jedyny mechanizm komunikacji i synchronizacji to wymiana komunikatów Brak wspólnej pamięci Proces, chcący wyznaczyd stan globalny, może zatem tylko wysyład żądania wyznaczania stanów lokalnych, a po otrzymaniu odpowiedzi, konstruowad na ich podstawie stan globalny. Niestety, asynchroniczne środowisko rozproszone posiada znacząco utrudniające to zadanie cechy: Brak wspólnego zegara Asynchronizm przetwarzania Nieprzewidywalne czasy transmisji (opóźnienia komunikacyjne) W wyniku tego otrzymane składowe stany lokalne procesów mogą byd: Przestarzałe Niekompletne Odpowiadad konfiguracjom niespójnym- reprezentującym stany nieosiągalne, których wystąpienia zewnętrzny, idealny obserwator nigdy nie mógłby stwierdzid. W tym kontekście jest jasne, że żaden lokalny, rzeczywisty proces dążący do wyznaczenia stanu globalnego przetwarzania rozproszonego nie może w ogólności wyznaczyd chwilowych wartości stanu. Proste i naturalne zwiększenie prędkości transmisji może oczywiście poprawid obraz stanu globalnego w sensie aktualności i kompletności, lecz nie jest wystarczające dla zapewnienia spójności. Dodatkowym źródłem trudności przy ocenie obrazu stanu globalnego jest relatywizm obserwacji, istotny zwłaszcza przy współbieżnej konstrukcji obrazów przez wiele procesów. Nawet, gdy każdy z utworzonych obrazów jest spójny, mogą one się różnid na tyle, że procesy monitorujące mogą podejmowad działania konfliktowe. Koncepcja konstrukcji obrazu stanu globalnego Rozważmy na początek problem przy następujących dodatkowych założeniach: Dostępny jest dla wszystkich procesów globalny zegar czasu rzeczywistego Znane jest maksymalne opóźnienie komunikacji Względne prędkości przetwarzania w poszczególnych węzłach są ograniczone Koncepcja wyznaczenia spójnego obrazu przy przyjętych takich założeniach jest bardzo prosta. Wystarczy, by dowolny proces monitora , wybrał chwilę na tyle odległą w przyszłości, by zagwarantowad, że wiadomośd wysłana w danej chwili dotrze do wszystkich procesów przed . W celu wyznaczenia stanu kanałów, można przyjąd, że każda wiadomośd zawiera etykietę czasową, określającą czas rzeczywisty wysłania wiadomości. Zakładając przy tym, że kanały są niezawodnymi kanałami typu FIFO, ideę algorytmu można przedstawid następująco: 1. Proces inicjatora wysyła do monitorów wszystkich procesów przetwarzania rozproszonego wiadomośd: „zapamiętaj stan lokalny w chwili ” 2. Monitory procesów zapamiętują stan lokalny , odpowiadających im procesów aplikacyjnych w chwili i natychmiast wysyłają wiadomośd kontrolną do wszystkich monitorów (wiadomośd ta jest wysyłana wszystkimi kanałami wyjściowymi). Zapamiętują też stan kanałów wejściowych jako zbiór wszystkich wiadomości aplikacyjnych, które zostały wysłane przed , a dotarły do po chwili . Zapamiętywanie stanu lokalnego oraz wysyłanie wiadomości kontrolnej poprzedza przy tym zajście jakiegokolwiek zdarzenia w procesie aplikacyjnym dla . 3. Gdy monitor otrzyma przez kanał pierwszą wiadomośd o etykiecie czasowej większej od (wiadomośd kontrolną), aktualną wartośd uznaje jako stan tego kanału w chwili . 4. Gdy monitor otrzyma wiadomości o etykiecie czasowej większej od przez wszystkie swoje kanały wejściowe, przesyła stan lokalny zapamiętany w chwili oraz wyznaczone stany kanałów wejściowych do inicjatora detekcji . 5. Po odebraniu od wszystkich monitorów wiadomości zawierających stany lokalne oraz stany ich kanałów wejściowych w chwili inicjator konstruuje obraz stanu globalnego . Zauważmy teraz, że jeżeli zapamiętane stany lokalne obejmowałyby historię komunikacji (kolejki wiadomości wysłanych i odebranych do danej chwili przez procesy aplikacyjne), to oczywiście przesyłanie wiadomości kontrolnych nie byłoby potrzebne. Wiadomo jednak z drugiej strony, że pamiętanie całej historii komunikacji może byd zbyt kosztowne w praktyce i wówczas przedstawione podejście będzie w pełni uzasadnione. Warto też zwrócid uwagę, że przesyłanie wiadomości kontrolnych jest krytyczne dla żywotności przedstawionego wyżej algorytmu. Istotnie, w wypadku bowiem, gdyby proces aplikacyjny nie wysłał po chwili wiadomości przez pewien kanał wyjściowy, stan tego kanału nigdy nie zostałby wyznaczony, a zakooczenie konstrukcji obrazu spójnego byłoby całkowicie uzależnione od własności przetwarzania aplikacyjnego. Dowód poprawności koncepcji Łatwo jest dowieśd poprawności przedstawionej koncepcji konstrukcji obrazu spójnego. Skonstruowany obraz reprezentuje stan globalny, który wystąpił w chwili . Argumentując poprawnośd bardziej formalnie, zauważmy, że wyznaczony obraz uwzględnia wszystkie zdarzenia lokalne, które zaszły przed chwilą . Stąd gdzie jest czasem rzeczywistym zajścia zdarzenia . Zegar czasu rzeczywistego spełnia warunek poprawności zegara, zatem: otrzymujemy a to właśnie należało wykazad. Algorytmy konstrukcji spójnego obrazu stanu globalnego Przedstawione zostaną niektóre algorytmy, służące do konstrukcji obrazu spójnego stanu globalnego. Są to algorytmy Chandy-Lamporta dla kanałów FIFO, algorytm Matterna, stosujący zegary wektorowe, algorytm Lai-Yang dla kanałów non-FIFO, a także algorytm kolorujący procesy i wiadomości oraz dwa algorytmy dla kanałów typu FC (Chandy-Lamporta i stosujący znaczniki BF i FF). Dla niektórych algorytmów zostanie również omówiona ich złożonośd czasowa oraz dowiedziona ich poprawnośd. Algorytm Chandy-Lamporta Algorytm ten wymaga przyjęcia kilku założeo dotyczących środowiska przetwarzania: Niezawodne kanały zachowują uporządkowanie wiadomości (niezawodne kanały FIFO) Stan reprezentowany jest w postaci złożenia lokalnych stanów procesów i stanów kanałów Pełen asynchronizm komunikacji i przetwarzania Brak zegara globalnego Koncepcja algorytmu przedstawia się następująco Pewien monitor inicjuje proces konstrukcji (detekcji) spójnego obrazu stanu globalnego zapamiętuje stan lokalny skojarzonego z nim procesu aplikacyjnego i wysyła wiadomośd kontrolną (znacznik) typu MARKER do wszystkich incydentnych monitorów. Każdy monitor po odebraniu znacznika z kanału sprawdza, czy jest to pierwszy znacznik odebrany w danym procesie detekcji (tzn. czy stan procesu został już w tym procesie detekcji zapamiętany). Jeżeli tak jest, to monitor zapamiętuje stan procesu , uznaje stan kanału za pusty, i propaguje znacznik przez wszystkie swoje kanały wyjściowe (wysłanie znacznika musi poprzedzid zdarzenie wysłania danym kanałem kolejnej, po zapamiętaniu stanu, wiadomości aplikacyjnej). Jeżeli stan procesu został już wcześniej zapamiętany, to uznaje za stan kanału zbiór tych wszystkich wiadomości aplikacyjnych, które dotarły tym kanałem po zapamiętaniu stanu, a przed otrzymaniem znacznika. Po odebraniu znaczników ze wszystkich kanałów wejściowych, monitor przesyła zapamiętany stan lokalny procesu oraz stan wszystkich kanałów wejściowych do monitora , konstruującego obraz stanu globalnego. W szczególności możliwe jest oczywiście, że Ilustracja działania algorytmu Chandy-Lamporta Na powyższym przykładzie przyjęto, że linia czerwona oznacza przesłanie wiadomości aplikacyjnej (np. ), natomiast liniami zielonymi oznaczono przesłanie znacznika między monitorami. Założono ponadto, że topologia przetwarzania reprezentuje graf pełny (każdy proces jest incydentny z każdym innym procesem , gdzie ). Inicjatorem detekcji zachodzącego w zmiennej monitorów i . zapamiętanie stanu jest monitor . Na górnej części rysunku w wyniku zdarzenia , w zmiennej zapamiętany zostaje stan lokalny procesu , nadawana jest wartośd początkowa , a znaczniki zostają wysłane do Odebranie pierwszego znacznika przez w wyniku zdarzenia powoduje lokalnego i uznanie kanału wejściowego za pusty (podstawienie ). Z kolei wiadomośd , odebrana przez po zapamiętaniu stanu lokalnego, zostaje uwzględniona w stanie kanału . Zajście zdarzenia powoduje, że ostatecznie stan kanału będzie zawierał wiadomośd . Ostatecznie zatem zostaje wyznaczony następujący stan spójny: Dla porównania stan wyznaczony w procesie detekcji na dolnej części rysunku wygląda następująco: Jak widad, mimo, że proces detekcji w obu przypadkach rozpoczęty został w tej samej chwili przez ten sam monitor, otrzymane konfiguracje spójne i są różne. Łatwo też zauważyd, że reprezentuje stan , podczas gdy reprezentuje stan, który nie wystąpił w rozpatrywanej realizacji (w żadnej chwili nie ma jednocześnie w kanałach i wiadomości). Ta różnica nie powinna zaskakiwad z uwagi na asynchronizm komunikacji i wynikający z tego niedeterminizm przetwarzania. Algorytm Chandy-Lamporta type PACKET extends FRAME is record of : MESSAGE end record type MARKER extends FRAME /* zwykła wiadomośd aplikacyjna */ /* znacznik */ /*wiadomośd, zawierająca stan procesu oraz stan kanałów incydentnych z tym procesem */ type STATE extends FRAME is record of : PROCESS_STATE : array of set of MESSAGE end record : MESSAGE /* wiadomośd wysyłana przez proces aplikacyjny */ /* monitor procesu opakowuje wiadomośd przesyła dalej jako */ : PACKET : TOKEN /* znacznik */ : STATE /* wiadomośd przesyłająca stan */ /* informacje, czy proces otrzymał znacznik od -tego procesu (wartośd elementu równa ) i tym samym został wyznaczony stan kanału */ : array of BOOLEAN /* stan kanałów wejściowych procesu , lista komunikatów odebranych od momentu zapamiętania stanu przez monitor do momentu otrzymania znacznika od zapisywany będzie w */ : array of set of MESSAGE : PROCESS_STATE /* stan procesu */ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. : set of CHANNEL_ID /* zbiór kanałów wejściowych procesu */ : set of CHANNEL_ID /* zbiór kanałów wyjściowych procesu */ /* wartośd zmiennej oznacza, że proces zaangażował się już w konstrukcję obrazu stanu globalnego */ : BOOLEAN /* procedura zapisuje stan procesu, ustawia stan kanałów na oraz zaznacza, że proces wziął już udział w wyznaczaniu obrazu i wysyła znacznik do wszystkich monitorów połączonych z procesem za pomocą kanałów wejściowych */ procedure do for all do end for end procedure /* powoduje przesłanie stanu procesu procedure do do monitora */ end procedure /* proces inicjatora konstrukcji zapamiętuje własny stan i rozsyła znaczniki do incydentnych monitorów za pomocą procedury , ustawia pozycję w tablicy na oraz wysyła swój stan za pomocą procedury */ when do if then end if end when when do end when /* W przypadku otrzymania znacznika monitor zapisuje stan skojarzonego z nim procesu aplikacyjnego (o ile jeszcze tego wcześniej nie wykonał) i przesyła znacznik dalej (przy pomocy procedury ), ustawia odpowiedni wpis w tablicy na . Jeżeli monitor otrzymał już znaczniki wszystkimi kanałami wejściowymi, rozsyła swój stan do incydentnych monitorów */ when do if then 29. 30. 31. end if 32. if 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. then end if end when /* Jeżeli monitor jest już zaangażowany w proces konstrukcji spójnego obrazu stanu globalnego, to otrzymując dowolną wiadomośd aplikacyjną, przed przekazaniem jej do skojarzonego procesu aplikacyjnego dodaje ją do odpowiedniej pozycji zmiennej */ when do if then end if end when Twierdzenie 10 Algorytm Chandy-Lamporta wyznacza w skooczonym czasie konfigurację spójną. Powyższe twierdzenie można dowieśd następująco, korzystając z poniższego lematu: Jeżeli co najmniej jeden proces zainicjuje algorytm, wszystkie procesy zapiszą swój stan lokalny w skooczonym czasie. Ponieważ każdy proces zapisuje stan i wysyła znacznik co najwyżej raz, algorytm się kooczy w skooczonym czasie. Jeżeli jest procesem, który już zapisał stan, a jest sąsiadem , to również zapisał stan. Wynika to z faktu, że znacznik wysłany przez i odebrany przez wymusza na nim zapisanie stanu, jeżeli wcześniej tego nie dokonał. Ponieważ co najmniej jeden proces zainicjował algorytm, co najmniej jeden zapisał stan, a ponieważ zakładamy, że wszystkie procesy są połączone (pośrednio lub bezpośrednio) za pomocą sieci komunikacyjnej, implikuje to, że wszystkie procesy zapisały stan. Należy obecnie wykazad, że wyznaczona konfiguracja jest spójna. Oznacza to, że nie może ona zawierad wiadomości w zapisanym stanie kanałów bądź zdarzeo odbioru wiadomości wysłanych w wyniku pewnego zdarzenia, które by nie zostało zapisane w obrazie stanu globalnego. Przyjmijmy, że jeżeli proces zapisał swój stan, to wysłał również znacznik do wszystkich sąsiadów. Oznacza to, że każde zdarzenie wysłania przez wiadomości do innego procesu po zapisaniu stanu musi byd poprzedzone zdarzeniem wysłania znacznika- z własności FIFO kanałów komunikacyjnych oznacza to, że otrzyma znacznik przed wiadomością . Z algorytmu wynika, że otrzymanie znacznika przez wymusza na nim zapisanie stanu- a więc jest niemożliwe, aby proces ten otrzymał tą wiadomośd przed zapisaniem stanu. Oznacza to, że wyznaczona konfiguracja nie będzie zawierała żadnej wiadomości, której zdarzenie wysłania nie zostało zapisane w którymś ze stanów lokalnych, a więc jest konfiguracją spójną. Twierdzenie 11 Jeżeli proces konstrukcji konfiguracji spójnej rozpoczął się w chwili , a zakooczył w chwili wyznaczona konfiguracja , reprezentująca pewien stan globalny , jest osiągalna ze stanu a stan globalny jest osiągalny ze stanu . Tym samym: , to , Złożoność czasowa Oznaczmy przez średnicę grafu zorientowanego, odpowiadającego topologii przetwarzania rozproszonego, a przez - liczbę krawędzi tego grafu. Wówczas, pomijając fazę przesyłania wiadomości o stanie procesów i kanałów złożonośd czasowa algorytmu Chandy-Lamporta wynosi , a złożonośd komunikacyjna, w sensie liczby przesyłanych znaczników, wynosi (BŁĄD powinno byd chyba ?). Algorytm Lai-Yang Wstęp W algorytmie Chandy-Lamporta przesyłane znaczniki pełniły podwójną rolę. Po pierwsze, dzięki zachowaniu uporządkowania FIFO pakietów, znaczniki określały pośrednio zbiór wiadomości wysyłanych przez nadawcę do w chwili zapamiętania stanu lokalnego procesu . Zbiór jest bowiem jednocześnie zbiorem wiadomości odebranych przez do chwili otrzymania znacznika (wiadomości wysłane przed znacznikiem dotrą przed nim do procesu docelowego), czyli . Jeżeli więc stan procesu zostanie zapamiętany w chwili , to stan kanału w chwili jest równy . Dodatkowo znaczniki przesyłane kanałami FIFO gwarantują oczywiście, że , a tym samym zapewniają spójnośd obrazu stanu globalnego. Lai-Yang przedstawili algorytm, który nie wymaga by kanały były typu FIFO. Założyli oni natomiast, że reprezentacje stanów lokalnych obejmują historię wykonania, a więc odpowiednie zbiory wiadomości dotychczas wysłanych i odebranych. Koncepcja Jeśli po zapamiętaniu stanu proces potrzeby przesłania do znacznika. już nigdy nie wyśle wiadomości do , to nie ma Jeśli wiadomości będą w dalszym ciągu wysyłane, to można do nich zawsze dołączyd znacznik w formie etykiety, a tym samym odróżnid te pakiety od wszystkich pakietów wysłanych przed zapamiętaniem stanu. Wyróżnione pakiety ze znacznikiem przechwytywane są przez monitor odbiorcy i powodują zapamiętanie stanu procesu , a przed przekazaniem wiadomości aplikacyjnej procesowi . Żadna z wiadomości wysłanych przez do po zapamiętaniu stanu procesu , nie zostanie odebrana przez przed zapamiętaniem jego stanu. Oznacza to dalej, że spełniona będzie relacja: która gwarantuje spójnośd konstruowanego obrazu stanu globalnego przetwarzania rozproszonego Algorytm przydziela procesom (monitorom) oraz wiadomościom jeden z dwóch kolorów lub . Przypisanie odpowiedniego koloru pakietowi oznacza: - pakiet bez znacznika - dołączenie znacznika do wiadomości Analogicznie, kolory przypisane są również procesom (kontrolerom): - proces nie zapamiętał jeszcze stanu - stan procesu został już zapamiętany Ogólna idea algorytmu przedstawia się następująco: Każdy proces jest postrzegany przez monitor początkowo jako , a monitor zmienia jego kolor na po zapamiętaniu stanu procesu. Każdej wiadomości wysłanej przez proces koloru przypisany jest kolor , a każdej wiadomości wysłanej przez proces koloru przypisany jest, analogicznie, kolor . Stan procesu koloru można zapamiętad w dowolnej chwili, lecz koniecznie przed odebraniem wiadomości koloru . Algorytm Lai-Yang Algorytm używa dwóch typów wiadomości. Wiadomości aplikacyjne przesyłane są w pakietach typu PACKET, które dodatkowo zawierają etykietę wiadomości w polu , będącą jedną z wartości lub . Drugim typem jest STATE, zawierający pole , określające stan lokalny procesu, ze zbiorem wiadomości aplikacyjnych wysłanych do chwili zapamiętania stanu procesu oraz pole ze zbiorem wiadomości aplikacyjnych odebranych do chwili zapamiętania stanu procesu. type PACKET extends FRAME is record of : enum : MESSAGE end record type STATE extends FRAME is record of : PROCESS_STATE : set of MESSAGE : set of MESSAGE end record : MESSAGE /* wiadomośd aplikacyjna wypakowywana z odebranego przez monitor pakietu, która zostanie dostarczona procesowi aplikacyjnemu */ : PACKET /* monitor procesu opakowuje wiadomośd aplikacyjną i przesyła dalej jako */ : PACKET /* wiadomośd oznaczona specjalnym znacznikiem inicjującym, przenoszący pustą wiadomośd aplikacyjną */ : STATE /* wiadomośd przesyłająca stan */ : PROCESS_STATE /* stan procesu */ : enum /* kolor monitora */ : set of MESSAGE /* określa zbiór wiadomości wysłanych przez proces do chwili zapamiętania stanu procesu */ : set of MESSAGE /* określa zbiór wiadomości wysłanych przez proces do chwili obecnej */ : set of MESSAGE /* określa zbiór wiadomości odebranych przez proces do chwili zapamiętania stanu procesu */ : set of MESSAGE /* określa zbiór wiadomości odebranych przez proces do chwili obecnej */ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. aplikacyjnych aplikacyjnych aplikacyjnych aplikacyjnych /* procedura zapamiętuje stan procesu, przypisując stan lokalny , a zawartośd zmiennych i do oraz */ procedure do do end procedure /* procedura służy do przesłania zapisanego stanu procesu , zajmującego się konstrukcją obrazu spójnego stanu globalnego */ procedure do do monitora end procedure /* Konstrukcja obrazu spójnego stanu globalnego rozpoczynana jest przez monitor . Zapisuje on stan skojarzonego ze sobą procesu aplikacyjnego, zmienia kolor procesu na i wysyła pusty znacznik o kolorze do wszystkich procesów. Następnie rozsyła również swój stan */ when do end when when end when do 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. /* Otrzymując pakiet o kolorze monitor procesu aplikacyjnego o kolorze zmienia jego kolor na i rozsyła jego stan. Przed dostarczeniem wiadomości do procesu monitor zapamiętuje ją w zmiennej */ when do if then end if if then end if end when Złożoność czasowa Dla grafu pełnego, reprezentującego topologię przetwarzania rozproszonego złożonośd czasowa algorytmu Lai-Yanga wynosi , a złożonośd komunikacyjna, w sensie liczby przesyłanych znaczników, wynosi ( oznacza ilośd wierzchołków tego grafu, czyli de facto, liczbę procesów biorących udział w przetwarzaniu rozproszonym), pomijając fazę przesyłania wiadomości o stanach procesów i kanałów. Twierdzenie 12 Konfiguracja wyznaczona przez algorytm Lai-Yang jest konfiguracją spójną. Dla dowodu powyższego twierdzenia przyjmijmy, że istnieje wiadomośd wysłana z do po fakcie zapisania stanu procesu . To oznacza, że znacznik związany z wiadomością musi mied wartośd , co wymusza na zapisanie stanu lokalnego najpóźniej w momencie odebrania . Tak więc, stan zapisany przez nie zawiera zdarzenia odbioru wiadomości . Niech pakiet sterujący będzie wysyłany kanałami, odpowiadającymi krawędziom drzewa rozpinającego o wysokości , grafu reprezentującego topologię przetwarzania. Pomijając fazę zbierania informacji z poszczególnych węzłów i koszt zmiany koloru pakietów, to złożonośd czasowa i komunikacyjna algorytmu Lai-Yanga wynosi odpowiednio i . Można dowieśd, że jeżeli kanały komunikacyjne nie są FIFO oraz nie używa się znaczników dołączanych do wiadomości aplikacyjnych, konstrukcja obrazu stanu globalnego wymaga zatrzymania przetwarzania. W przypadku kanałów FIFO taki algorytm oczywiście istnieje (przykładem jest np. algorytm Chandy-Lamporta) Algorytm Matterna, stosujący zegary wektorowe Rozważmy system, w którym kanały są kanałami nonFIFO. Algorytm wyznaczający stan globalny dla takiego systemu wywodzi się z koncepcji wyznaczania stanu globalnego z użyciem zegara czasu rzeczywistego (patrz: Wykład #4: zegary). Ogólna koncepcja przedstawia się następująco: określenie momentu czasu , odpowiadającego przyszłości, w którym zostaną zapamiętane stany lokalne wszystkich procesów po wyznaczeniu stanów lokalnych w momencie , monitory przesyłają informację o stanach lokalnych do monitora konstruującego obraz globalny W celu adaptacji powyższej koncepcji do asynchronicznego systemu rozproszonego, proces inicjatora określa wektorowy czas wirtualny momentu zapamiętania w przyszłości stanu lokalnego procesu. Twierdzenie 13 W chwili, gdy uaktualniony został zegar wektorowy procesu , zachodzi: Powyższa własnośd oznacza w praktyce, że zmiana wektorowego zegara lokalnego w pewnym procesie określa czas wirtualny, który z perspektywy wszystkich pozostałych procesów z pewnością nie jest czasem odnoszącym się do przeszłości. Algorytm Matterna Algorytm wykorzystuje pięd różnych typów komunikatów. Typ PACKET służy do przenoszenia wiadomości aplikacyjnych i posiada pole , które jest wektorową etykietą czasową pakietu. Typ komunikatu CONTROL zawiera pole , będące polem zadanego czasu zapamiętania stanu. Komunikaty typu PROC_STATE zawierają stan procesu w polu . Stan kanału przesyłany jest w polu wiadomości typu CHAN_STATE. Wreszcie, wiadomości typu ACK są prostymi potwierdzeniami, niezawierającymi żadnych pól. type PACKET extends FRAME is record of : array of INTEGER : MESSAGE end record type CONTROL extends FRAME is record of : array of INTEGER end record type PROC_STATE extends FRAME is record of : PROCESS_STATE end record type CHAN_STATE extends FRAME is record of : MESSAGE end record type ACK extends FRAME : MESSAGE /* wiadomośd aplikacyjna wypakowywana z odebranego przez monitor pakietu, która zostanie dostarczona procesowi aplikacyjnemu */ : PACKET /* monitor procesu opakowuje wiadomośd aplikacyjną i przesyła dalej jako */ : PACKET /* specjalny pakiet, zawierający pusty komunikat aplikacyjny, wysyłany przy rozpoczęciu algorytmu */ : CONTROL /* pakiet kontrolny */ : ACK /* pakiety potwierdzenia */ : PROC_STATE /* służy do przesyłania stanu procesu */ : CHAN_STATE /* służy do przesyłania stanu kanału */ : array of INTEGER /* wektorowy zegar logiczny procesu */ : array of INTEGER /* reprezentuje logiczny czas zadanego momentu zapamiętania obrazu spójnego*/ : PROCESS_STATE /* stan procesu */ : BOOLEAN /* określa, czy został już zapamiętany stan procesu */ /* Dla uproszczenia będziemy zakładad, że : monitor inicjatora zwiększa pozornie wartośd swojego zegara wektorowego i tym samym wyznacza moment z jego perspektywy w przyszłości o czasie tym informuje wszystkie pozostałe monitory, wstrzymując jednocześnie postęp lokalnego czasu wirtualnego (blokuje postęp przetwarzania aplikacyjnego) Dopiero po upewnieniu się, że wszystkie monitory znają wyznaczony moment w przyszłości, uwalniane jest przetwarzanie aplikacyjne, a więc również zegar lokalny. Monitor zapisuje wtedy stan skojarzonego z nim procesu aplikacyjnego i rozsyła pustą wiadomośd , zaznaczając jednocześnie, że stan procesu został już zapisany. */ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. when for all do do end for end when /* otrzymując wiadomośd kontrolną monitor zapamiętuje w zmiennej moment wyznaczenia stanu lokalnego, a następnie odsyła potwierdzenie */ when do end when /* wysyłając wiadomośd monitor modyfikuje zegar wektorowy w zwykły sposób */ 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. when do end when when for all do do end for if then end if if end if if then then end if end when Otrzymując pakiet aplikacyjny monitor modyfikuje zegar wektorowy w zwykły sposób. Jeżeli monitor zapisywał już stan aplikacyjny, a etykieta odebranego pakietu jest wcześniejsza od momentu wyznaczenia stanu zapisanego w , monitor wysyła informację o otrzymaniu tego pakietu do inicjatora konstrukcji spójnego obrazu stanu globalnego. W wyniku dalszej komunikacji między procesami aplikacyjnymi, bądź w wyniku przesłania dodatkowych wiadomości synchronizujących między monitorami, każdy z procesów osiągnie w koocu, lub będzie usiłował przekroczyd, wyznaczony moment . Przed przekroczeniem wartości , zapamiętany zostanie stan lokalny procesu. Kolekcja takich stanów tworzy konfigurację spójną. Algorytm kolorujący procesy i wiadomości Koncepcja Wadą przedstawionego algorytmu Matterna jest zawieszenie przetwarzania aplikacyjnego procesu do momentu uzyskania przez monitor potwierdzeo odebrania wiadomości kontrolnej, zawierającej żądany moment zapamiętania w przyszłości stanu lokalnego od wszystkich pozostałych monitorów. Problemu tego można uniknąd wprowadzając dodatkową pozycję w wektorze czasu, której wartośd jest zwiększana tylko przez wyróżniony monitor nieskojarzony z żadnym procesem aplikacyjnym. Należy zauważyd, że w nowym wektorze czasu istotne znaczenie będzie miała teraz tylko pozycja , a wszystkie pozostałe mogą byd pominięte. W konsekwencji można też pominąd całą fazę rozgłaszania wartości . W tym wypadku procesy będą zapamiętywad stan lokalny, gdy uzyskają wektor z nową, powiększoną wartością pozycji . Algorytm można dalej uprościd zauważając, że w kontekście detekcji stanu globalnego znaczenie ma w istocie tylko zmiana stanu na pozycji , i stąd dwa stany tej pozycji są wystarczające dla rozróżnienia kolejnych faz wyznaczania obrazu globalnego: - przed zapamiętaniem stanu lokalnego procesu - po zapamiętaniu stanu lokalnego procesu Podobnie, kolory można przypisad pakietom. Kolor i pakietu oznacza, że został on wysłany, odpowiednio, przed lub po zapamiętaniu stanu lokalnego procesu. Monitory procesów wysyłają tylko pakiety koloru , a monitory procesów - tylko pakiety koloru . Każdy proces pierwotnie ma kolor , a staje się po zapamiętaniu jego stanu lokalnego a przed przekazaniem mu pierwszej wiadomości z pakietem koloru . Inicjator detekcji stanu globalnego zapamiętuje stan lokalny procesu, staje się i wysyła pusty pakiet koloru do wszystkich monitorów Wiadomości będące w wyznaczonym obrazie stanu globalnego w kanałach, to wiadomości w pakietach koloru odebrane przez monitor koloru . Za każdym razem, gdy monitor otrzymuje tego typu pakiet, przesyła zawartą w nim wiadomośd do inicjatora Poprawnośd algorytmu wynika z faktu, że nie istnieje pakiet wysłany przez monitor , którego wiadomośd przekazana zostałaby procesowi aplikacyjnemu koloru , gdyż taki pakiet spowodowałby zmianę koloru procesu odbierającego na przed przekazaniem wiadomości. Zakłada się, że inicjator nie inicjuje współbieżnie wielu detekcji, dlatego wprowadzenie większej liczby kolorów (wartości elementu czasu wektorowego) jest niekonieczne. Łatwo zauważyd, że algorytm staje się praktycznie identyczny jak wcześniej przedstawiony algorytmu Lai-Yanga. Różnicą jest jedynie prostsza reprezentacja stanu lokalnego, gdzie nie ma potrzeby pamiętania historii komunikacji, co jednak pociąga za sobą koniecznośd wprowadzenia dodatkowego mechanizmu wyznaczania stanów kanałów komunikacyjnych. Jedynym problemem w tym przypadku jest wyznaczenie momentu zakooczenia konstrukcji obrazu stanu globalnego- tzn. podjęcia przez inicjatora decyzji, że zebrany dotychczas stan jest stanem kompletnym i żaden z monitorów nie prześle w przyszłości pakietu koloru . Problem ten, znany jest jako problem detekcji zakooczenia przetwarzania rozproszonego. Algorytm kolorujący procesy i wiadomości Tak zmodyfikowany algorytm używa trzech zamiast pięciu typów komunikatów. Struktura tych typów jest identyczna jak poprzednio, z jednym wyjątkiem: pakiet typu PACKET zamiast etykiety czasu wektorowego posiada pole oznaczającego kolor pakietu ( , ). Również liczba używanych zmiennych jest mniejsza niż w poprzednim algorytmie, a główna różnica wynika z braku oraz oraz wprowadzenie zmiennej, zawierającej kolor procesu, . type PACKET extends FRAME is record of : enum : MESSAGE end record type PROC_STATE extends FRAME is record of : PROCESS_STATE end record type CHAN_STATE extends FRAME is record of : MESSAGE end record : MESSAGE /* wiadomośd aplikacyjna wypakowywana z odebranego przez monitor pakietu, która zostanie dostarczona procesowi aplikacyjnemu */ : PACKET /* monitor procesu opakowuje wiadomośd aplikacyjną i przesyła dalej jako */ : PACKET /* specjalny pakiet, zawierający pusty komunikat aplikacyjny, wysyłany przy rozpoczęciu algorytmu */ : PROC_STATE /* służy do przesyłania stanu procesu */ : CHAN_STATE /* służy do przesyłania stanu kanału */ : PROCESS_STATE : enum 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. when do end when when do end when when do if then end if if then 22. 23. 24. 25. 26. 27. 28. 29. 30. end if if then end if end when Algorytm Chandy-Lamporta dla kanałów FC Przypomnijmy, że kanały FC (patrz: Wykład #4) umożliwiają dobór operacji komunikacji i tym samym własności przesyłanych wiadomości, stosownie do wymaganego zastosowania. Użycie wyłączenie operacji powoduje, że kanał typu FC ma własności kanału FIFO Użycie tylko operacji , to kanał typu FC równoważny byłby kanałowi nonFIFO Zatem kanały typu FC są elastycznym mechanizmem, oferującym dobór operacji komunikacji i tym samym różne stopnie współbieżności komunikacji. Możliwa jest modyfikacja algorytmu Chandy-Lamporta, polegająca na zastąpieniu znacznika przysłanego kanałem FIFO, przez znacznik typu TF- TMARKER. Poza tym algorytm nie różni się istotnie od pierwowzoru. Algorytm Chandy-Lamporta dla kanałów FC Typy komunikatów używane w przedstawionym algorytmie nie różnią się od typów używanych w wersji algorytmu dla kanałów FIFO. Różnica polega na zastąpieniu typu MARKER typem TMARKER, będącego komunikatem typu TF (patrz: Wykład #4: Wyprzedzanie wiadomości). Zmienne używane w algorytmie posiadają znaczenie analogiczne do wcześniej przedstawionego algorytmu ChandyLamporta dla kanałów FIFO. type PACKET extends FRAME is record of : MESSAGE end record type TMARKER extends FRAME type STATE extends FRAME is record of : PROCESS_STATE : array of set of MESSAGE end record : MESSAGE : PACKET : TMARKER : STATE : array of BOOLEAN : array of set of MESSAGE : PROCESS_STATE : set of CHANNEL_ID : set of CHANNEL_ID : BOOLEAN 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. procedure for all do do end for end procedure /* Inicjator zapamiętuje spontanicznie stan skojarzonego z nim procesu aplikacyjnego i wysyła wiadomośd kontrolną (znacznik) typu TMARKER do wszystkich incydentnych monitorów. W odróżnieniu od wersji algorytmu dla kanałów FIFO, nie jest wysyłany stan za pomocą procedury SEND_STATE */ when do end when when do end when /* W przypadku otrzymania znacznika z kanału monitory sprawdzają, czy stan lokalny został już wcześniej zapamiętany. Jeśli okazuje się, że jest to pierwszy znacznik typu TMARKER odebrany w danym procesie konstrukcji obrazu spójnego, to stan lokalny jest zapamiętany przed dopuszczeniem do wysłania kolejnej wiadomości aplikacyjnej, a znacznik typu TMARKER wysyłany jest poprzez wszystkie kanały wyjściowe. Stan kanału przyjmuje się przy tym jako zbiór pusty. Jeżeli odebrano już znaczniki TMARKER z wszystkich kanałów wejściowych, rozsyłany jest stan procesu i kanałów do wszystkich pozostałych monitorów */ when do if then end if if then 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. end if end when /* Podczas odbioru wiadomości aplikacyjnej następuje sprawdzenie, czy stan lokalny był już zapamiętany. Jeżeli tak, to wszystkie wiadomości odebrane między momentem zapamiętania stanu, a momentem otrzymania znacznika są włączane do zbioru określającego stan kanału wejściowego */ when if do then end if end when Algorytm ze znacznikami BF I FF Koncepcja Rozwinięcie poprzedniego algorytmu opiera się na spostrzeżeniu, ze do utworzenia spójnego obrazu przetwarzania rozproszonego wystarczy, by stany lokalne zapamiętane były w wyniku odebrania znaczników typu BF (BMARKER, patrz: Wykład #4: Wyprzedzanie wiadomości). Znacznik ten nie może byd wyprzedzony przez żadną wiadomośd, i stąd pakiety wysłane po zapamiętaniu stanu i po wysłaniu znacznika typu BF dotrą do monitora docelowego z pewnością po zapamiętaniu stanu lokalnego adresata. Nie zaistnieje więc sytuacja, prowadząca do niespójnej konfiguracji, w której wiadomośd nieuwzględniona w stanie lokalnym przez nadawcę (wysłana po zapamiętaniu stanu) zostanie uwzględniona w stanie lokalnym odbiorcy (odebrana przed zapamiętaniem stanu). Znacznik typu FF (FMARKER) wysłany kanałem zaraz po zapamiętaniu stanu lokalnego procesu, nie wyprzedzi pakietów wysłanych przed nim. Jeśli zatem monitor będzie zapamiętywał wszystkie wiadomości otrzymane danym kanałem od momentu zapamiętania stanu do momentu odebrania znacznika FMARKER, to zbiór tych wiadomości obejmie wszystkie wiadomości tworzące stan kanału (wysłane przed znacznikiem, a odebrane po zapamiętaniu stanu procesu docelowego) oraz wiadomości wysłane po znaczniku FMARKER, które znacznik ten wyprzedził. Algorytm Wiadomości aplikacyjne typu PACKET zawierają pole , określające numer sekwencyjny komunikatu. Znaczniki FMARKER, będące komunikatami typu FF, zawierają pole , określające numer sekwencyjny poprzedniego pakietu. Znaczniku typu BMARKER to komunikaty typu BF. Wreszcie pakiet STATE posiada identyczne znaczenie, jak poprzednio. type PACKET extends FRAME is record of : INTEGER : MESSAGE end record type FMARKER extends FRAME is record of : INTEGER end record type BMARKER extends FRAME type STATE extends FRAME is record of : PROCESS_STATE : array of set of MESSAGE end record : MESSAGE : PACKET : TMARKER /* pakiet typu FMARKER */ : TMARKER /* pakiet typu BMARKER */ : STATE : array of set of PACKET /* zapamiętuje zbiór pakietów odebranych od momentu zapamiętania stanu przez monitor do momentu otrzymania znacznika FMARKER od */ : array of BOOLEAN : array of set of MESSAGE : PROCESS_STATE : set of CHANNEL_ID : set of CHANNEL_ID : BOOLEAN : INTEGER /* numer sekwencyjny ostatnio wysłanego pakietu przez monitor */ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. procedure for all do do end for end procedure /* Inicjator zapamiętuje spontanicznie stan skojarzonego z nim procesu aplikacyjnego i wysyła wiadomośd kontrolną (znacznik) typu TMARKER do wszystkich incydentnych monitorów. W odróżnieniu od wersji algorytmu dla kanałów FIFO, nie jest wysyłany stan za pomocą procedury */ when do 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. end when when if do then end if end when /* Monitor , który już zapisał swój stan, otrzymując zwykły pakiet aplikacyjny od monitora , od którego nie otrzymano dotąd znacznika FMARKER, dopisuje otrzymany pakiet do zbioru na odpowiedniej pozycji tablicy */ when do if then end if end when /* Otrzymanie znacznika typu FMARKER nadesłanego przez monitor powoduje zapisanie tego faktu w tablicy poprzez nadanie -temu elementowi wartości . Następnie opróżniana jest odpowiednia -ta pozycja tablicy , po czym dodane są do niej wszystkie takie pakiety z -tego wpisu tablicy, których numer sekwencyjny jest niewiększy niż numer sekwencyjny z pola nadesłanego znacznika. Jeżeli znacznik typu FMARKER otrzymano już wszystkimi kanałami wejściowymi, rozsyłany jest stan procesu */ when do for all if do then end if end for if then end if end when /* Wysyłając wiadomośd aplikacyjną, monitor inkrementuje zawartośd licznika oraz dołącza go do wysyłanego pakietu obudowującego tą wiadomośd */ when do 46. 47. 48. end when Niedeterminizm przetwarzania rozproszonego Poniżej widzimy różne realizacje przetwarzania rozproszonego klient-serwer jako wynik nieprzewidywalnych czasów transmisji. Załóżmy istnienie dwóch procesów i , żądające realizacji usługi przez dwa serwery i . Proces jest przy tym repliką procesu . Przyjmijmy ponadto, że dla prawidłowego działania procesów użytkowych muszą one korzystad z obu serwerów w trybie wzajemnego wykluczania. Aby to osiągnąd, każdy z procesów i wysyła komunikaty zawierające żądania, odpowiednio do obu serwerów, w celu uzyskania wyłącznego do nich dostępu. Ponieważ zdarzenia wysyłania żądao są współbieżne, a kanały wnoszą nieprzewidywalne opóźnienia, żądania mogą dotrzed do serwerów w różnej kolejności. Jeśli przyjmiemy jeszcze, że procesy i mogą kontynuowad działanie dopiero po otrzymaniu potwierdzeo od obu procesów i , skutki niedeterminizmu transmisji mogą byd bardzo istotne. Na górnej części rysunku, w chwili (po zakooczeniu przesyłania wszystkich wiadomości) został osiągnięty pewien stan , w którym proces może kontynuowad działanie, a proces oczekuje na zwolnienie serwerów przez . Stan ten można uznad za poprawny. Natomiast w dolnej części rysunku widzimy osiągnięcie pewnego stanu , w którym proces otrzymał potwierdzenie od , a proces otrzymał potwierdzenie od . Dla każdego z procesów i z osobna, otrzymane potwierdzenia nie są wystarczające do kontynuacji działania i dalej zwolnienia potwierdzonych serwerów. Zauważmy też, że jeżeli inne, zewnętrzne w stosunku do , procesy nie wymuszą na lub zwolnienia serwerów, to wówczas zarówno serwery, jak i procesy żądające usług pozostaną zablokowane. W rozważanym przykładzie, wykrycie wystąpienia stanu , odpowiadającego trwałej blokadzie wszystkich procesów, miałoby na celu zainicjowanie specjalnych działao prowadzących do osiągnięcia stanu, w którym dalsze poprawne przetwarzanie byłoby możliwe. Wykład #9, 10: Problem detekcji zakończenia Plan wykładu: a) b) c) d) e) f) g) h) i) j) Problem zakooczenia- przykłady Definicje zakooczenia Zakooczenie dynamiczne i statyczne Detekcja zakooczenia dla synchronicznego modelu przetwarzania Detekcja zakooczenia dla dyfuzyjnego modelu przetwarzania Algorytm z licznikami wiadomości Jednofazowy algorytm detekcji zakooczenia Wektorowy algorytm detekcji zakooczenia Detekcja zakooczenia statycznego Detekcja zakooczenia dynamicznego Problem detekcji zakooczenia został wstępnie omówiony w wykładzie #1 (patrz: sortowanie). Przykład ilustrujący potrzebę poprawnej detekcji zakończenia W celu ilustracji problemu detekcji zakooczenia wrócimy ponownie do wcześniej omawianego algorytmu Matterna konstrukcji spójnego obrazu stanu globalnego w środowisku z kanałami nonFIFO (patrz: Wykład #8). Ze względu na możliwe zmiany uporządkowania wiadomości w kanałach otrzymanie wiadomości koloru nie przesądzało o tym, że w kanałach nie ma już wcześniej wysłanych wiadomości koloru . Ponieważ jednak zbiór otrzymanych przez proces koloru wiadomości określa stan kanału w wyznaczanym obrazie stanu globalnego, niezbędne jest niezależne od procesu konstrukcji obrazu stanu globalnego sprawdzenie, czy w kanałach nie ma jeszcze wiadomości koloru . Dopiero bowiem wówczas, gdy stwierdzimy, że wszystkie wiadomości koloru zostały odebrane, wyznaczone stany kanałów odpowiadają spójnemu obrazowi stanu globalnego. Definicja zakończenia Definicja nieformalna zakończenia Nieformalnie problem detekcji zakooczenia przetwarzania rozproszonego polega na sprawdzeniu, czy wszystkie procesy przetwarzania są w stanie pasywnym oraz, czy żadna wiadomośd będąca w kanale (transmitowana lub dostępna) nie uaktywni któregokolwiek z tych procesów. Przez proces aktywny rozumiemy tutaj wykonujący kroki algorytmu; w przeciwnym wypadku uznajemy go za pasywny. Dokładne definicje zostały przedstawione na wcześniejszych wykładach. Przez zakooczenie obliczeo rozproszonych mamy tutaj na myśli osiągnięcie pewnej koocowej konfiguracji, w której nie są już możliwe dalsze kroki algorytmu. Definicja formalna zakończenia W formalnej definicji tego problemu wykorzystane są następujące oznaczenia: - zmienna logiczna (predykat), przyjmująca wartośd wtedy i tylko wtedy, gdy proces jest pasywny - tablica zmiennych logicznych procesu skojarzona z wiadomościami dostępnymi - -ty element tablicy dostępna wiadomośd wysłana przez - tablica zmiennych logicznych procesu skojarzona z wiadomościami transmitowanymi - -ty element tablicy , przyjmujący wartośd , gdy wiadomośd wysłana przez do należy do zbioru , a więc jest transmitowana i nie , przyjmujący wartośd , gdy dla jest jest jeszcze dostępna Zakończenie dynamiczne Nieformalnie, przetwarzanie rozproszone jest w danej chwili w stanie zakooczenia dynamicznego, jeżeli żaden proces składowy przetwarzania rozproszonego nie będzie już nigdy uaktywniony. Stan ten będzie utrzymywany pomimo, że pewne wiadomości są wciąż transmitowane, a pewne wiadomości są już dostępne. Przetwarzanie rozproszone jest poniższy predykat: jest w danej chwili w stanie zakooczenia dynamicznego, gdy spełniony Predykat ten oznacza, że żaden proces składowy przetwarzania rozproszonego nie będzie już nigdy uaktywniony. Stan ten będzie utrzymywany pomimo, że pewne wiadomości są wciąż transmitowane , a pewne wiadomości są już dostępne . Takie sformułowanie definiującego stan zakooczenia jest interesujące z praktycznego punktu widzenia, gdyż pozwala stwierdzid zakooczenie przetwarzania nawet przed dotarciem wszystkich wiadomości do procesów (węzłów) docelowych. Definicja zakooczenia dynamicznego uwzględnia rzeczywistą aktywnośd procesów wyrażoną przez zmienną oraz potencjalną aktywnośd wyrażoną przez predykat . Predykat jest predykatem stabilnym. Zakończenie statyczne Przetwarzanie rozproszone jest w danej chwili w stanie zakooczenia statycznego, jeżeli: a) wszystkie procesy składowe są pasywne ( ) b) wszystkie wiadomości w kanałach są dostępne ( ) c) dla żadnego procesu nie jest spełniony warunek uaktywnienia (patrz: Wykład #5,6) ( ) Przetwarzanie rozproszone predykat: jest w danej chwili w stanie zakooczenia statycznego, gdy spełniony jest Oznaczenia w powyższym wzorze wprost odpowiadają wcześniej podanej definicji. Definicja ta uwzględnia zatem zarówno stany procesów, jak i kanałów. Porównując z , predykat odpowiada detekcji nieco późniejszej, gdyż dodatkowo wymaga się, by wiadomości nie były już transmitowane. Niech oznacza, że zajście predykatu prowadzi w skooczonym, chod nieprzewidywalnym, czasie do zajścia predykatu . Twierdzenie 14 Klasyczna definicja zakończenia W klasycznej definicji zakooczenia przyjmowano, że przetwarzanie rozproszone jest w stanie zakooczenia, jeżeli w danej chwili wszystkie procesy są pasywne i wszystkie kanały są puste, a więc gdy zachodzi następujący predykat: Rozważmy teraz relację między ,a . Twierdzenie 15 Jeżeli procesy są natychmiastowo uaktywnione przez każdą dostępną wiadomośd, to przetwarzanie rozproszone, obejmujące zbiór procesów jest statycznie zakooczone wtedy i tylko wtedy, gdy zachodzi predykat . Problem detekcji zakończenia Problem detekcji zakooczenia przetwarzania rozproszonego, obejmującego zbiór procesów, sprowadza się do sprawdzenia, czy przetwarzanie osiągnęło określony stan zakooczenia, a więc, czy zachodzi odpowiedni predykat: , , . Można dowieśd, że jeżeli w czasie przetwarzania aplikacyjnego wymienianych jest wiadomości, to niemożliwa jest konstrukcja algorytmu detekcji zakooczenia o złożoności komunikacyjnej mniejszej niż . Model przetwarzania synchronicznego W modelu przetwarzania synchronicznego przyjmuje się, że transmisje są natychmiastowe. Stąd kanały mogą byd uznane za puste przez cały czas i problem zakooczenia sprowadza się do sprawdzenia, czy wszystkie procesy są jednocześnie pasywne. Stan zakooczenia opisuje zatem następujący predykat: Detekcja zakończenia dla modelu synchronicznego Zostanie obecnie omówiony algorytm autorstwa Dijkstry, Feijen oraz van Gasterena detekcji zakooczenia dla modelu przetwarzania synchronicznego. Wykorzystuje on koncepcję ciągu cykli detekcyjnych i zakłada, że wszystkie monitory procesów aplikacyjnych połączone są w logiczny pierścieo i obserwują stany procesów aplikacyjnych. Monitorom (procesom) przypisany jest kolor lub Monitory przesyłają wzdłuż pierścienia wiadomośd kontrolną- znacznik typu TOKEN, który również może mied kolor lub Początkowo monitory mają kolor , a zmieniają go na , gdy odpowiadający im proces aplikacyjny wyśle wiadomości do procesu o indeksie większym Monitor inicjujący detekcję zakooczenia wysyła znacznik koloru do swego następnika w pierścieniu , jeżeli obserwowany przez niego proces aplikacyjny jest pasywny Każdy kolejny monitor , odbierający znacznik czeka aż obserwowany przez niego proces stanie się pasywny i wówczas wysyła znacznik o kolorze zgodnym z kolorem monitora. Po wysłaniu znacznika monitorowi (procesowi) przypisywany jest kolor Algorytm kooczy się, gdy znacznik koloru dotrze do inicjatora. Dla uproszczenia prezentacji, w algorytmie wykorzystano funkcje: Przykład detekcji zakończenia Runda zakooczona niepowodzeniem Inicjator (proces ) przesyła znacznik koloru do swojego następnika- . Następnie znacznik ten jest przesyłany w pierścieniu do kolejnego procesu- . Oba te procesy posiadają przypisany kolor , a więc były pasywne w bieżącej rundzie detekcji. Znacznik nie zmienia zatem swojego koloru i pozostaje . Tymczasem proces wysyła wiadomośd aplikacyjną do procesu , co powoduje zmianę jego koloru na . Kiedy więc znacznik dociera od procesu do , zmienia on swój kolor na . Po przejściu całego pierścienia znacznik powraca do inicjatora. Ponieważ znacznik przyjął kolor , detekcja zakooczenia nie została uwieoczona powodzeniem. Kolejna iteracja jest potrzebna w algorytmie detekcji zakooczenia. Runda zakooczona sukcesem Monitor po otrzymaniu znacznika koloru zmienia swój kolor na i ponownie wysyła znacznik o kolorze do swojego następnika w pierścieniu. Sytuacja jest podobna jak poprzednio- znacznik jest przesyłany między procesami od inicjatora , do jego następnika , dalej do . W tym momencie proces wysyła wiadomośd do procesu - nie powoduje to jednak zmiany koloru przypisanego do procesu, gdyż indeks adresata wiadomości jest mniejszy niż indeks nadawcy. Kiedy więc znacznik dociera do procesu , jego kolor się nie zmienia i dalej jest przesyłany również z przypisanym kolorem . Ostatecznie znacznik dociera do inicjatora detekcji, a ponieważ jego kolor pozostaje , inicjator może stwierdzid wykrycie zakooczenia. Algorytm Dijkstra, Feijen, van Gasteren Algorytm wykorzystuje pakiety dwóch typów: pierwszy typ- PACKET- opakowuje wiadomości aplikacyjne. Drugi typ- TOKEN- znacznik posiadający pole , oznaczające kolor znacznika. type PACKET extends FRAME is record of : MESSAGE end record type TOKEN extends FRAME is record of : enum end record : MESSAGE : PACKET : TOKEN : BOOLEAN procesie /* określa obecnośd znacznika w */ : enum : BOOLEAN 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. /* Procedura wywoływana jest przez monitor procedure do ( ) podczas inicjacji kolejnej rundy */ end procedure /* Inicjator wysyła znacznik koloru (wywołując procedurę ) do swego następnika w pierścieniu jeżeli obserwowany przez niego proces aplikacyjny jest pasywny */ when do wait until end when /* Monitor zmienia kolor na jeżeli obserwowany przez niego proces aplikacyjny wysyła wiadomośd aplikacyjną do procesu o wyższym indeksie */ when do if then 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. end if end when when do end when /* Odebranie znacznika przez proces wysłanego przez jego następnika w pierścieniu , powoduje ustawienie zmiennej na . Znacznik jest zatrzymywany w monitorze do czasu aż obserwowany przez niego proces aplikacyjny stanie się pasywny. Jeżeli i kolor zarówno obserwowanego procesu, jak i znacznika są , inicjator kooczy algorytm, decydując o wykryciu zakooczenia. Jeżeli , ale albo kolor procesu, albo kolor znacznika równy jest , inicjator rozpoczyna kolejną rundę algorytmu. Jeżeli zaś , to następuje przesłanie dalej znacznika o kolorze takim samym jak kolor obserwowanego procesu aplikacyjnego, następnie zmienia kolor procesu na oraz zmienia wartośd na wartośd */ when do wait until if then if then else end if else if then end if end if end when Model przetwarzania dyfuzyjnego Przetwarzanie dyfuzyjne (ang. diffusing computation) rozproszonym, w którym wyróżnia się: jest specyficznym przetwarzaniem inicjatora- może w dowolnej chwili rozpocząd przetwarzanie dyfuzyjne, wysyłając wiadomośd aplikacyjną do jednego lub wielu procesów kooperujących (zakłada się, że inicjacja taka zachodzi tylko raz) hierarchię kooperujących procesów Każdy proces po uzyskaniu pierwszej wiadomości aplikacyjnej, nadawcę tej wiadomości traktuje jako proces angażujący (ang. engager) i realizuje dalsze przetwarzanie, wysyłając wiadomości do innych procesów, w tym ewentualnie do inicjatora. Dla ułatwienia opisu przedstawionych poniżej algorytmów, przyjmiemy pewne dodatkowe założenia: proces aktywny staje się procesem pasywnym tylko w wyniku pewnego zdarzenia wewnętrznego proces zawsze staje się aktywny po otrzymaniu wiadomości proces pasywny może stad się aktywny tylko w wyniku otrzymania wiadomości Innymi słowy, proces aplikacyjny może w dowolnej chwili stad się pasywny i oczekiwad na uaktywniającą go wiadomośd aplikacyjną od dowolnego innego procesu. Warunek uaktywnienia procesu definiuje zatem model żądao OR i zbiór warunkujący . Algorytm Dijkstry-Scholten’a Koncepcja algorytmu Monitory procesów aplikacyjnych przesyłają wiadomości kontrolne typu SIGNAL jako pewnego rodzaju odpowiedzi na wiadomości aplikacyjne Monitor pasywnego inicjatora może stwierdzid zakooczenie przetwarzania po odebraniu wiadomości kontrolnych typu SIGNAL od wszystkich monitorów związanych z procesami uaktywnionymi przez inicjatora Graf przetwarzania dyfuzyjnego Inicjatorem przetwarzania dyfuzyjnego w przedstawionym przykładzie jest proces . Staje się on procesem angażującym dla procesów . Każdy z nich z kolei sam angażuje kolejne procesy. Procesy tworzą więc drzewo, a wiadomości są przesyłane od inicjatora (korzenia drzewa) w dół (do liści). Procesy odsyłają specjalne wiadomości, poczynając od liści drzewa. Każdy proces- węzeł drzewa przesyła wiadomośd do swojego procesu angażującego, jeśli zebrał już wiadomości od wszystkich procesów potomnych. W momencie, w którym inicjator zbierze wszystkie wiadomości od swoich procesów potomnych, może uznad, że zostało wykryte zakooczenie przetwarzania. Algorytm detekcji zakończenia dla modelu dyfuzyjnego Algorytm wykorzystuje pakiety dwóch typów: pierwszy, typ PACKET, opakowuje wiadomości aplikacyjne, natomiast drugi typ, SIGNAL, to specjalna wiadomośd kontrolna przesyłana między monitorami. Zmienna zawiera identyfikator monitora, którego proces uaktywnił . Z kolei zbiór oznacza zbiór monitorów różnych od monitora angażującego, od których odebrano pakiet. Zmienne oraz oznaczają, odpowiednio, liczbę wiadomości odebranych bądź wysłanych przez proces , a niepotwierdzonych jeszcze przez wiadomością typu SIGNAL. type PACKET extends FRAME is record of : MESSAGE end record type SIGNAL extends FRAME : MESSAGE : PACKET : SIGNAL : PROCESS_ID : set of PROCESS_ID : INTEGER : INTEGER : BOOLEAN 1. /* Przetwarzanie dyfuzyjne jest inicjowane przez proces , który wysyła wiadomości do swoich bezpośrednich potomków w hierarchii należących do zbioru . Zmienna zawiera liczbę tych wysłanych wiadomości */ when do 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. end when /* Zdarzenie wysłania wiadomości typu SIGNAL może zajśd dla monitora spełniony jest warunek tylko wtedy, gdy . Monitor , wysyłając wiadomośd typu SIGNAL, sprawdza, czy odebrał już wiadomości od wszystkich procesów poza angażującym ( ), nie wysłał żadnej niepotwierdzonej wiadomości ( ), a skojarzony zeo proces jest pasywny. W takim wypadku wysyła procesowi angażującemu sygnał. W przeciwnym wypadku wysyła wiadomośd kontrolną typu SIGNAL do wszystkich monitorów procesów, od których otrzymał jakąś wiadomośd i jeszcze jej nie potwierdził do tej pory wiadomością SIGNAL, poza monitorem procesu angażującego i usuwa te procesy ze zbioru . Wreszcie dekrementuje zmienną */ when do if then else for do 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. end for end if end when /* Monitor , odbierając sygnał, dekrementuje zmienną (gdyż zmienna ta oznacza ilośd niepotwierdzonych wysłanych wiadomości). Jeżeli , to w momencie, w którym skojarzony proces aplikacyjny stanie się pasywny, monitor decyduje o wykryciu zakooczenia przetwarzania */ when do if then wait until end if end when /* Zdarzenie wysłania wiadomości aplikacyjnej może zajśd dla monitora wtedy, gdy */ when do dla tylko 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. end when /* W przypadku otrzymania wiadomości, jeżeli jest to pierwsza otrzymana wiadomośd ( ), to monitor uznaje nadawcę za proces angażujący, a w przeciwnym wypadku dodaje go do zbioru */ when do if then else end if end when Twierdzenie 16 Jeżeli przetwarzanie dyfuzyjne uległo zakooczeniu, to fakt ten stwierdzi algorytm DijkstryScholtena. Model przetwarzania asynchronicznego Dla systemów asynchronicznych (patrz: Wykład #2: Komunikacja asynchroniczna) można wykorzystad w celu detekcji zakooczenia algorytm Misra z roku 1983, który nie czyni żadnych założeo, co do topologii przetwarzania i czasy przesyłania. Algorytm ten wymaga natomiast, by żadne niewiadomości nie były gubione podczas transmisji (niezawodnośd komunikacji) oraz by kanały komunikacyjne zachowywały porządek wysyłania wiadomości (kanały FIFO). Algorytm ten, podobnie jak przedstawiony wcześniej algorytm dla modelu synchronicznego (Dijkstra, Feijen, van Gasteren) używa znacznika, a także kolorowania procesów. Dla ułatwienia analizy, można przyjąd, że topologia przetwarzania to graf pełny, jednakże algorytm łatwo można dostosowad do dowolnej topologii, co zostanie pokazane później. Algorytm detekcji zakończenia dla systemów asynchronicznych Algorytm wykorzystuje dwa typy wiadomości: PACKET i TOKEN. Drugi z nich oznacza specjalną wiadomośd kontrolną- znacznik- przesyłana między monitorami, zawierające pole , które oznacza z kolei liczbę procesów odwiedzonych przez znacznik, które były pasywne. Zmienna oznacza następnik procesu w cyklu, obejmującym wszystkie kanały komunikacyjne. Związane jest to z wymaganiem, by znacznik typu TOKEN odwiedził wszystkie kanały łączące procesy. to zbiór wszystkich kanałów, tworzących cykl, obejmujący wszystkie kanały komunikacyjne. type PACKET extends FRAME is record of : MESSAGE end record type TOKEN extends FRAME is record of : INTEGER end record : MESSAGE : PACKET : TOKEN : BOOLEAN : PROCESS_ID : set of CHANNEL_ID : enum : BOOLEAN 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. /* określa kolor monitora */ /* Zaczynając detekcję, proces wysyła znacznik do swojego następnika w cyklu, przypisując polu tego znacznika wartośd 0 */ when do end when /* Otrzymanie wiadomości aplikacyjnej przez monitor powoduje, poza uaktywnieniem procesu i dostarczeniem wiadomości, zmianę koloru procesu na */ when do end when /* Po otrzymaniu znacznika, monitor przesyła go dalej w momencie, gdy obserwowany przez niego proces staje się pasywny. Jeżeli proces ma kolor , pole znacznika jest zerowane. W przeciwnym razie jest ono inkrementowane. Kolor procesu następnie jest ustawiany na oraz monitor przesyła znacznik do swojego następnika w cyklu. Oznacza to, że każdy proces musi pozostad pasywny pomiędzy wszystkimi odwiedzinami znacznika, a znacznik musi co najmniej dwa razy przejśd cykl */ when do wait until if else end if end when then 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. /* Inicjator przetwarzania, po otrzymaniu znacznika, jeżeli kolor procesu posiada wartośd oraz jeżeli wartośd zapisana w polu otrzymanego znacznika równa jest liczbie kanałów komunikacyjnych (liczbie krawędzi grafu topologii przetwarzania), decyduje o wykryciu zakooczenia. W przeciwnym wypadku przesyła znacznik dalej, byd może zerując wartośd pola nb w podobny sposób, jak każdy inny proces. Warte podkreślenia jest, że w ogólności każdy monitor, a nie tylko inicjator może dokonad decyzji o wykryciu zakooczenia, obserwując wartośd pola oraz kolor obserwowanego przez siebie procesu */ when do if then else if then else end if end if end when /* Zdarzenie wysłania wiadomości aplikacyjnej może zajśd dla monitora wtedy, gdy */ when dla tylko do end when Cechy algorytmu Misra Możliwośd rozszerzenia do dowolnej topologii Aby dostosowad przedstawiony algorytm do dowolnej topologii, wystarczy ustawid odpowiednio wartości zmiennej - wystarczy podzielid graf topologii przetwarzania na zbiór cykli o maksymalnej długości i odwiedzad je po kolei. Wiele monitorów naraz może wykrywad zakooczenia W tym celu należy dodad do znacznika pole wskazujące na inicjatora detekcji. Cykle obejmujące kanały komunikacyjne muszą byd znane z góry Należy podkreślid, że jest to duża wada powyższego algorytmu. Model atomowy przetwarzania W atomowym modelu przetwarzania, czasy przetwarzania lokalnego są zaniedbywane (zerowe), a opóźnienia są związane tylko z transmisją. Można przyjąd, że procesy (uaktywniane natychmiastowo) są przez cały czas pasywne i sprowadzid problem detekcji zakooczenia do wyznaczania stanów kanałów. Przyjmijmy dla uproszczenia, model żądao typu OR (patrz: Wykład #2: Model żądao OR). Oznacza to, że dowolna wiadomośd w kanale uaktywni proces. Wówczas zakooczenie przetwarzania opisuje następujący predykat: Algorytm z licznikami wiadomości Matterna - liczba wiadomości wysłanych do chwili przez - liczba wiadomości odebranych do chwili przez - sumaryczna liczba wiadomości wysłanych przez wszystkie procesy do chwili - sumaryczna liczba wiadomości odebranych przez wszystkie procesy do chwili Dla modelu przetwarzania atomowego, równośd oznacza, że każda wiadomośd wysłana została odebrana. Tym samym wszystkie kanały są w chwili puste, a więc osiągnięty został stan zakooczenia. Problem polega na tym, że wyznaczenie oraz nie jest w systemie rozproszonym proste. Koncepcja Wiadomośd kontrolna wysłana przez inicjatora przesyłana jest między monitorami, a po dotarciu do wszystkich monitorów wraca do Celem wysłania wiadomości kontrolnej jest wyznaczenie sumarycznej liczby wiadomości wysłanych i odebranych przez wszystkie procesy aplikacyjne Każdy z monitorów dodaje do znacznika stany liczników i , odpowiadające bieżącej chwili Ponieważ kanały wprowadzają opóźnienia, zebrane liczniki odpowiadają różnym momentom , W swej idei, algorytmy detekcji z użyciem liczników zakooczenia wykorzystują koncepcję ciągu cykli detekcyjnych. W tym jednak wypadku celem wysłania wiadomości kontrolnej jest wyznaczenie sumarycznej liczby wiadomości wysłanych i odebranych przez wszystkie procesy aplikacyjne. Dlatego wiadomośd kontrolna wysłana przez inicjatora przesyłana jest pomiędzy monitorami, a następnie wraca do monitora . Oznaczmy przez pamiętając, że: i odpowiednio sumy zebranych przez znacznik liczników, a więc: Dla zilustrowania przedstawionej koncepcji rozważmy obecnie dwa przykłady przedstawione poniżej. Na przykładzie po lewej stronie, proces detekcji rozpoczynany jest w chwili przez monitor procesu . W chwili tej oraz . Znacznik jest przesyłany następnie do monitora procesu , który odczytuje wartości oraz . Następnie, kolejno wyznaczane są wartości: oraz , i . W efekcie w chwili otrzymujemy ,a . Z kolei sytuacja na przykładzie po prawej stronie jest następująca: , , , , , , , . Tym samym ,a . Równośd liczników wiadomości wysłanych i odebranych mogłoby sugerowad, że wszystkie kanały są puste, i że tym samym wystąpiło zakooczenie. Zauważmy jednak, że w żadnym momencie z przedziału obserwacji kanały nie są jednocześnie puste, a więc dla każdego , . Powstaje zatem problem, czy i kiedy na podstawie faktu, że można wnioskowad o wystąpienie zakooczenia. Poprawność algorytmu detekcji zakończenia dla atomowego modelu przetwarzania W algorytmie detekcji zakooczenia rozważane są dwie fazy detekcji. Pierwsza rozpoczyna się o chwili i kooczy w chwili , a druga odpowiednio w chwilach i . Przyjęto ponadto, że: Oznaczmy teraz przez i oznaczone w drugiej fazie. liczniki wyznaczone w pierwszej fazie, a przez i liczniki Twierdzenie 17 Jeżeli to monitorowane przetwarzanie aplikacyjne osiągnęło stan zakooczenia przed zakooczeniem procesu detekcji. Dowód: W celu udowodnienia powyższego twierdzenia wykażemy, że jeżeli , to przetwarzanie jest w stanie zakooczenia. W tym wykażemy w dalszym ciągu prawdziwośd pięciu lematów. Lemat 1 Lokalne liczniki wiadomości są monotoniczne, zatem jeżeli , to Lemat 2 Sumaryczna liczba wiadomości wysłanych lub odebranych jest monotoniczna. Jeżeli zatem , to Lemat 3 Dowód powyższego lematu przedstawia się następująco: Z definicji mamy , przy czym dla każdego , . Z kolei . Ponieważ z lematu pierwszego wynika, że liczniki są monotoniczne i dla każdego zachodzi , więc tym samym dla każdego , a w konsekwencji: Lemat 4 Dowód powyższego lematu przedstawia się następująco: Z definicji , przy czym dla każdego , . Z kolei . Z lematu pierwszego wynika, że liczniki są monotoniczne i dla każdego , , stąd zachodzi dla każdego , a w konsekwencji: Lemat 5 Dla wszystkich zachodzi: * Dowód: Relacja jest prawdziwa, gdyż kanały są z założenia niezawodne. Wródmy do dowodu twierdzenia 17. Z założenia wynika, że lematów otrzymujemy, że: . Z kolei z przedstawionych * gdzie: wynika z lematu 4, - z lematu 3. - z lematu 2, - z lematu 5, zaś Relacje * i * zachodzą jednocześnie tylko wówczas, gdy: Tym samym w chwili , wystąpiło zakooczenie przetwarzania. , a to z kolei oznacza, że wszystkie kanały są puste, a więc Jednofazowy algorytm detekcji zakończenia Wadą poprzedniego rozwiązania jest koniecznośd dwukrotnego przesyłania wiadomości kontrolnej do wszystkich procesów. Istnieją propozycje realizacji detekcji zakooczenia w jednym przebiegu, czyli algorytmy jednofazowe. Załóżmy, że monitory dla połączone są w logiczny pierścieo. Ideą rozwiązania jest przesyłanie wiadomości kontrolnej (znacznika) typu TOKEN między kolejnymi monitorami, zawierającego informacje ewentualnie wystarczające inicjatorowi do podjęcia decyzji o wykryciu zakooczenia. Algorytm: W algorytmie detekcji zakooczenia przetwarzania rozproszonego przesyłana jest wiadomośd kontrolna (znacznik) typu TOKEN między kolejnymi monitorami. Wiadomośd ta zawiera: Identyfikator inicjatora Numer sekwencyjny cyklu detekcji zainicjowanego przez Pole , czyli sumy liczników monitorów odwiedzonych już przez znacznik Pole flagi niepoprawności procesu detekcji . Flaga ta przyjmuje ostatecznie wartośd , jeżeli którykolwiek proces aplikacyjny otrzymał między kolejnymi cyklami detekcji wiadomośd, która narusza warunek konieczny poprawności detekcji: , gdzie liczba oznacza numer sekwencyjny cyklu detekcji skojarzony z wiadomością wysłaną najpóźniej, spośród wszystkich wiadomości odebranych przez . Z kolei wiadomości aplikacyjne typu PACKET zawierają dodatkowo pole numer sekwencyjny cyklu detekcji. , zawierające Algorytm wykorzystuje następujące zmienne: - lokalny licznik (ang. send-receive balance) o początkowej wartości 0. Wartośd licznika w każdej chwili jest równa . - numer sekwencyjny cyklu detekcji zakooczenia, zainicjowanego przez monitor - zmienna, określająca numer sekwencyjny cyklu detekcji zakooczenia skojarzony z wiadomością wysłaną najpóźniej, spośród wszystkich wiadomości odebranych przez type PACKET extends FRAME is record of : INTEGER : MESSAGE end record type TOKEN extends FRAME is record of : PROCESS_ID : INTEGER : INTEGER : BOOLEAN end record : MESSAGE : PACKET : TOKEN : INTEGER : INTEGER : INTEGER : BOOLEAN 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. /* Inicjator detekcji inkrementuje licznik cyklu detekcji oraz wysyła znacznik do swojego następnika w pierścieniu. Początkowe wartości pól , , oraz w znaczniku są ustawiane na, kolejno, identyfikator monitora , numer cyklu detekcji, sumę liczników oraz */ when do end when /* Przesyłając wiadomośd aplikacyjną monitor inkrementuje zmienną przypisuje jej numer cyklu detekcji zakooczenia */ when do oraz end when /* Otrzymując wiadomośd aplikacyjną, monitor dekrementuje licznik . Jeżeli wartośd numeru cyklu detekcji przesłana w otrzymanej wiadomości aplikacyjnej jest większa niż bieżąca wartośd , to zmiennej przypisana zostaje właśnie ta wartośd */ when do end when /* W każdym odwiedzanym monitorze uaktualniany jest numer sekwencyjny bieżącego cyklu detekcji. Jeżeli , to inicjator decyduje, że wykryte zostało zakooczenie, jeżeli wartośd pola jest równa zero i równocześnie flaga nie ma przypisanej wartości . Jeżeli znacznik powrócił do inicjatora, ale nie może on podjąd decyzji o zakooczeniu detekcji, to rozpoczyna on nowy cykl detekcyjny */ 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. when do if then if then else end if else end if end when Dla monitorów w powyższej funkcji, fladze przypisywana jest suma logiczna bieżącej wartości tej flagi oraz wartości relacji , która jest prawdziwa, jeżeli do monitora dotarł już pewien pakiet z etykietą o wartości większej lub równej numerowi sekwencyjnemu bieżącego cyklu detekcji . Oznacza to, że pakiet ten został wysłany po wizycie bieżącego znacznika. Zauważmy, że zdarzenie odbioru pakietu będzie uwzględnione w koocowej wartości licznika , a nie będzie uwzględnione zdarzenie nadania tego pakietu. Tym samym, konkluzja dotycząca zakooczenia przetwarzania byłaby formułowana na podstawie niespójnego obrazu przetwarzania, a więc w ogólności byłaby niepoprawna. W takim wypadku, wynik bieżącego cyklu detekcji należy zatem uznad za niepoprawny. W efekcie wykrycie zakooczenia wymaga wykonania kolejnego cyklu detekcji. Wektorowy algorytm detekcji zakończenia Przedstawiony zostanie obecnie algorytm, wykorzystujący wektor liczników , będący tablicą . Przyjęto przy tym, że procesy nie komunikują się same ze sobą, a monitory tworzą strukturę o topologii pierścienia. Algorytm: Cyrkulujący w pierścieniu znacznik typu TOKEN przenosi -elementowy wektor , zawierający sumę wektorów monitorów odwiedzonych już w danym cyklu detekcji przez znacznik. Dodatkowo algorytm wykorzystuje m.in. następujące zmienne: - wektor liczników, będący tablicą . Elementy , dla , każdego procesu określają liczbę wiadomości wysłanych przez proces do od czasu ostatniej wizyty znacznika. Wartośd bezwzględna elementu określa liczbę wiadomości odebranych przez od czasu ostatniej wizyty znacznika. W dowolnej chwili , suma -tych elementów wszystkich liczników , dla każdego oraz wartości pozycji wektora cyrkulującego znacznika , jest równa liczbie wiadomości, będących w drodze do . Zmienna przyjmuje wartośd , jeżeli monitor pierwszy raz otrzymał znacznik. type PACKET extends FRAME is record of : MESSAGE end record type TOKEN extends FRAME is record of : array of INTEGER : MESSAGE end record : MESSAGE : PACKET : TOKEN : array : BOOLEAN : BOOLEAN 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. of INTEGER /* Inicjator detekcji rozpoczyna detekcję, wysyłając znacznik typu TOKEN z wektorem oraz ustawiając wartośd zmiennej na */ when do for all do end for end when /* Po otrzymaniu znacznika monitor sumuje własny wektor wiadomości z wektorem zawartym w znaczniku. Warunek oznacza, że istnieje wiadomośd aplikacyjna uwzględniona już w znaczniku jako wysłana do , a która jeszcze nie została odebrana przez . W tym wypadku znacznik jest zatrzymywany w monitorze , a jego dalsze przesłanie jest uwarunkowane otrzymaniem odpowiedniej liczby wiadomości aplikacyjnych przez */ when do if then 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. if then else for all do end for end if end if end when /* Każdy monitor zwiększając licznik nalicza indywidualnie wiadomości aplikacyjne wysłane przez , na pozycji odpowiadającej procesowi przeznaczenia */ when do end when /* Z drugiej strony monitor zmniejsza licznik własny , gdy odebrana zostanie wiadomośd aplikacyjna wysłana przez proces . Jeżeli , to jeżeli dla każdej pozycji wektora liczników jest ona równa zero i flaga nie jest ustawiona, to zostaje podjęta decyzja o wykryciu zakooczenia. W przeciwnym wypadku rozpoczynany jest kolejny cykl detekcyjny */ when do if then if then else for all end for end if end if end when do Cechy algorytmu wyeliminowanie konieczności dołączania etykiet do wiadomości aplikacyjnych zatrzymanie znacznika do momentu spełnienia koniecznych warunków zakooczenia wykonywanie algorytmu w sposób ciągły aż do momentu stwierdzenia zakooczenia przetwarzania aplikacyjnego algorytm ten kooczy się w ciągu jednej rundy wymiany znacznika od momentu faktycznego zakooczenia przetwarzania aplikacyjnego dużą wadą jest spora liczba informacji przesyłanych w znaczniku Detekcja zakończenia statycznego Koncepcja algorytmu Obecnie przedstawiony zostanie algorytm (Brzezioski, Helary, Raynal), zajmujący się problemem wykrycia faktu zakooczenia statycznego (patrz: Wykład #9: Zakooczenie statyczne). W algorytmie tym wykorzystano koncepcję ciągu cykli detekcyjnych, gdzie monitory są logicznie połączone w strukturę gwiazdy. Detekcja zakooczenia statycznego sprowadza się do wyznaczenia wartości predykatu: Algorytm detekcji zakończenia statycznego Algorytm wykorzystuje cztery typu komunikatów. Typ PACKET służy do przesyłania wiadomości aplikacyjnych. Typ QUERY jest zapytaniem wysyłanym przez inicjatora detekcji. Typ ACK ma za zadanie potwierdzad wiadomości aplikacyjne, i wreszcie typ REPLY jest odpowiedzią na wiadomości QUERY. Ten ostatni typ zawiera pole , które jest flagą, zawierającą wartośd zmiennej nadawcy wiadomości REPLY, w chwili jej wysłania. Aby uniknąd pominięcia wiadomości aplikacyjnej, która została wysłana przed otrzymaniem zapytania QUERY przez pewien monitor , a odebrana po otrzymaniu zapytania przez inny monitor wprowadzona jest zmienna logiczna , która jest inicjowana wartością . Za każdym razem, gdy jest uaktywniany, przyjmuje wartośd . Z kolei, wysyłając wiadomośd kontrolną REPLY monitory nadają zmiennej ponownie wartośd . Wartośd zmiennej w danej chwili oznacza, że proces był pasywny przez cały czas od chwili wysłania ostatniej wiadomości REPLY. Jeżeli zmienna przyjmuje wartośd , to monitor stwierdza zakooczenie statyczne, przypisując wartośd zmiennej . Zmienna jest licznikiem niepotwierdzonych wiadomości. Zbiór zawiera identyfikatory procesów, od których wiadomości aplikacyjne są już dostępne dla . type PACKET extends FRAME is record of : MESSAGE end record type QUERY extends SIGNAL type ACK extends SIGNAL type REPLY extends FRAME is record of : BOOLEAN end record : MESSAGE : PACKET : QUERY : REPLY : ACK : BOOLEAN : BOOLEAN : INTEGER : set of PROCESS_ID : BOOLEAN 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. /* W celu stwierdzenia zakooczenia statycznego przetwarzania aplikacyjnego, inicjator rozpoczyna detekcję przez wysłanie do wszystkich monitorów, w tym do siebie, wiadomości kontrolnej typu QUERY. Po otrzymaniu wszystkich odpowiedzi, inicjator wyznacza iloczyn logiczny otrzymanych zmiennych , jako wartośd zmiennej . Jeżeli przyjmie wartośd , to stwierdza zakooczenie, w przeciwnym razie inicjator ponownie wysyła zapytanie QUERY */ when do repeat for all do end for until end when /* Po otrzymaniu zapytania QUERY w odpowiedzi monitory przesyłają wiadomości typu REPLY natychmiast, gdy skojarzony z nimi proces aplikacyjny staje się pasywny, liczni niepotwierdzonych wiadomości wynosi zero i żadna z dostępnych w danej chwili wiadomości nie wystarcza do aktywacji procesu. Wysyłana wiadomośd zawiera bieżącą wartośd zmiennej logicznej, określającej, czy od czasu wysłania ostatniej odpowiedzi QUERY proces wciąż pozostał pasywny, w polu */ when do wait until 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. end when /* Wysyłając wiadomośd inkrementowany jest licznik , który z kolei jest zmniejszany w wyniku otrzymania potwierdzenia wiadomości */ when do end when when do end when when do end when /* W momencie aktywacji procesu */ when do zmiennej przypisywana jest wartośd end when Dowód poprawności algorytmu Przyjmijmy, że: - czas globalny wysłania odpowiedzi przez monitor czas globalny rozpoczęcia -tego cyklu detekcji czas globalny zakooczenia -tego cyklu detekcji w -tym cyklu detekcji Zachodzi oczywiście następujący związek: - jest wartością zmiennej (predykatu) w chwili inicjator aplikacyjnymi jest dodatkowym procesem, niezwiązanym z procesami Twierdzenie 18 Jeżeli algorytm detekcji zakooczenia statycznego jest wykonywany w chwili, gdy przetwarzanie aplikacyjne osiągnęło stan zakooczenia statycznego, to algorytm ten zakooczy się w skooczonym czasie, stwierdzając wystąpienie zakooczenia statycznego przetwarzania aplikacyjnego ( ) Twierdzenie 19 Jeżeli algorytm stwierdza wystąpienie zakooczenia statycznego przetwarzania aplikacyjnego, to przetwarzanie aplikacyjne jest w istocie w stanie zakooczenia statycznego. Rozważmy dwa kolejne cykle detekcyjne oraz . Załóżmy, że algorytm stwierdza zakooczenie przetwarzania aplikacyjnego koocząc cykl , a więc w chwili . Wówczas jest prawdziwe ( ). Szkic dowodu twierdzenia 19 Ponieważ cykle są inicjowane sekwencyjnie, istnieje taki moment , że Udowodnimy teraz, że jeżeli , to w chwili przetwarzanie aplikacyjne jest statycznie zakooczone, a więc: . Innymi słowy wykażemy, że dla wszystkich procesów spełnione będą następujące warunki: Warunek C1: Warunek C2: jeszcze nie dotarły do Warunek C3: do uaktywnienia procesu (proces -ty jest pasywny w chwili ) (nie ma żadnych procesów, od których wiadomości (dostępne wiadomości nie wystarczają Dowód warunku C1: Z konstrukcji algorytmu wynika, że zakooczy się on w chwili z tylko wówczas, gdy każdy proces był pasywny w czasie między , więc możemy zatem wnosid, że dla każdego , , a . Skoro jednak . Dowód warunku C2: Zgodnie z konstrukcją algorytmu, w każdym cyklu detekcyjnym odpowiedź REPLY jest wstrzymywana aż do momentu nadejścia potwierdzeo od monitorów procesów przeznaczenia, dla wszystkich wysłanych wcześniej wiadomości aplikacyjnych. Wówczas przyjmie wartośd 0. Z drugiej strony, można jednak zauważyd, że od chwili do proces jest ciągle pasywny, a więc nie wysyła wiadomości. Stąd więc wnosimy, że dla każdego procesu , . Dowód warunku C3: W każdym cyklu detekcyjnym odpowiedź jest opóźniana do momentu uzyskania przez predykat wartości ( o wartości ). Skoro algorytm kooczy się w chwili , to predykat miał wartośd . Ponieważ w przedziale proces był przez cały czas pasywny, żadna wiadomośd nie została w tym czasie odebrana. Stąd też, w przedziale tym do zbioru mogły byd co najwyżej dołączone dodatkowe wiadomości. W efekcie: . Z własności monotoniczności predykatu możemy przy tym wnioskowad, że skoro zachodzi , to również zachodzi . Wykazaliśmy zatem, że w chwili , dla każdego procesu spełnione są warunki C1, C2 i C3, a więc predykat zakooczenia statycznego w chwili jest prawdziwy. Ponieważ predykat ten jest stabilny, więc również dla każdego , w tym również dla , . Złożoność algorytmu Efektywnośd, a także złożonośd czasowa i komunikacyjna algorytmu zależy od implementacji cykli detekcyjnych i topologii przetwarzania monitorującego. W celu wyznaczenia złożoności czasowej zauważmy, że po wystąpieniu zakooczenia statycznego, dla jego stwierdzenia potrzebne są w najgorszym wypadku dwa pełne cykle detekcyjne oraz musi byd dokooczony bieżący cykl. W każdym cyklu przesyłanych jest wiadomości typu QUERY i wiadomości typu REPLY, przenoszących jednobitową zmienną. Tak więc, zaniedbując wiadomości potwierdzeo (których liczba jest równa liczbie wiadomości aplikacyjnych), otrzymujemy liczbę wiadomości kontrolnych, wystarczających do stwierdzenia zakooczenia, równą . Przyjmijmy teraz, że struktura topologiczna przetwarzania detekcyjnego jest grafem pełnym. Pomijając ponownie wiadomości potwierdzeo, łatwo już zauważyd, że złożonośd czasowa algorytmu wynosi . Oczywiście przy innych topologiach złożonośd ta odpowiednio się zmienia. Przykładowo, w przypadku pierścienia złożonośd czasowa wynosi . Detekcja zakończenia dynamicznego Koncepcja algorytmu Detekcja zakooczenia dynamicznego (patrz: Wykład #9: Zakooczenie dynamiczne) sprowadza się do wyznaczenia wartości predykatów, definiujących takie zakooczenie, tzn.: W tym celu zaproponowano algorytm (Brzezioski, Helary, Raynal), który stosuje mechanizm cykli detekcyjnych oraz wiadomości kontrolne typu QUERY i REPLY, a także liczniki wiadomości odebranych i wysłanych przez procesy. Algorytm detekcji zakończenia dynamicznego Algorytm wykorzystuje trzy typu komunikatów, z których PACKET służy do przenoszenia wiadomości aplikacyjnych w postaci pakietów. Typ QUERY zawiera pole , będące wektorem liczników wiadomości wysłanych do adresata wiadomości typu QUERY, zgodnie z wiedzą inicjatora . W polu zapisywany jest iloczyn logiczny wartości zmiennej oraz , określającego, czy proces może zostad uaktywniony przez sumę logiczną wiadomości już dostępnych oraz tych, które prawdopodobnie znajdują się jeszcze w kanałach komunikacyjnych. Pole zawiera wektor liczników wiadomości aplikacyjnych wysłanych przez proces obserwowany przez monitor- nadawcę wiadomości REPLY, w chwili jej wysłania. Swoje znaczenie, identyczne do poprzednio omawianego algorytmu detekcji zakooczenia statycznego, zachowują , , , , oraz i . Zmienna jest tablicą wiadomości wysłanych przez do liczników, w której element . Analogicznie, zmienna jest tablicą oznacza liczbę liczników, w której element oznacza liczbę wiadomości odebranych przez od procesu . Ponadto, inicjator przechowuje zmienną , będącą tablicą . Wiersz -ty tej tablicy zawiera wektor przesłany ostatnio do inicjatora przez monitor , w wiadomości kontrolnej typu REPLY. W efekcie, każdy element tablicy reprezentuje wiedzę inicjatora o liczbie wiadomości aplikacyjnych wysłanych z do . Zauważmy, że wiedza ta nie jest precyzyjna, gdyż nadesłane wektory dla , odnoszą się w ogólności do różnych momentów czasu. jest aproksymacją zbioru identyfikatorów procesów, które wysłały wiadomości niedostępne jeszcze dla . Zmienna logiczna posiada wartośd , gdy proces pozostał pasywny od momentu wysłania ostatniej wiadomości typu REPLY. Jeżeli wartośd zmiennej logicznej będzie równy , inicjator podejmie decyzję o wykryciu zakooczenia dynamicznego. type PACKET extends FRAME is record of : MESSAGE end record type QUERY extends FRAME is record of : array of INTEGER end record type REPLY extends FRAME is record of : BOOLEAN : array of INTEGER end record : MESSAGE : PACKET : QUERY : REPLY : array of INTEGER : array of INTEGER : array of INTEGER : set of PROCESS_ID : set of PROCESS_ID : BOOLEAN : BOOLEAN : BOOLEAN /* Inicjator detekcji rozpoczyna cykl detekcyjny, wysyłając do wszystkich monitorów wiadomośd kontrolną typu QUERY, zawierającą w polu odpowiednią kolumnę tablicy , dzięki czemu każdy monitor będzie mógł dokonad aproksymacji liczby wiadomości wysłanych, lecz jeszcze nieodebranych przez (znajdujących się w kanałach komunikacyjnych). Wektor ten informuje odbiorcę o znanej inicjatorowi liczbie wiadomości wysłanych do przez inne procesy. Następnie inicjator oczekuje na zebranie odpowiedzi od wszystkich pozostałych procesów. Później, sumuje on wartości nadesłanych 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. liczników wiadomości aplikacyjnych wysłanych przez te procesy- suma ta zostanie wykorzystana w następnym cyklu detekcyjnym. Algorytm stwierdza wykrycie zakooczenia dynamicznego przetwarzania aplikacyjnego, gdy wszystkie odebrane w danym cyklu przez zmienne mają wartośd . W przeciwnym wypadku, rozpoczyna następny cykl detekcyjny */ when do repeat for all for all do do end for end for for all for all do do end for end for until end when /* Po otrzymaniu zapytania QUERY, monitor może wyznaczyd zbiór , będący aproksymacją zbioru tych procesów, których wiadomości wysłane do są potencjalnie jeszcze w kanałach (porównywany jest wektor odebrany przez z - jeżeli , to w kanale znajdą się wiadomości wysłane przez do , a nieodebrane jeszcze przez ). Następnie każdy z monitorów wyznacza wartośd zmiennej ( wtedy i tylko wtedy, gdy , a predykat ) Po wyznaczeniu wartości monitor wysyła odpowiedź typu REPLY, zawierającą pole oraz aktualny wektor , który będzie użyty przez do uaktualnienia tablicy */ when do end when /* Przy wysyłaniu (odbieraniu) wiadomości aplikacyjnych do ty wpis w tablicy ( ) */ monitor inkrementuje - 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. when do end when /* Wysyłając wiadomośd inkrementowany jest licznik , który z kolei jest zmniejszany w wyniku otrzymania potwierdzenia wiadomości */ when do end when /* W momencie aktywacji procesu */ when do zmiennej przypisywana jest wartośd end when Twierdzenie 20 Jeżeli algorytm jest wykonywany w chwili, gdy przetwarzanie aplikacyjne osiągnęło stan zakoodzenia dynamicznego, to algorytm ten zakooczy się w skooczonym czasie, stwierdzając wystąpienie dynamicznego zakooczenia przetwarzania aplikacyjnego. Dowód powyższego twierdzenia przebiega następująco: Cykl detekcyjny nie jest wstrzymywany przez monitory, a więc inicjator otrzyma odpowiedź od każdego monitora w skooczonym czasie. Zakładamy, że przetwarzanie aplikacyjne osiągnęło stan zakooczenia dynamicznego w chwili ( ). Od tego momentu zatem, wszystkie procesy pozostają ciągle pasywne: oraz , dla każdego . Zatem każdy cykl zainicjowany po czasie , powiedzmy cykl -ty, nada wszystkim zmiennym wartośd i odbierze od monitorów wektor koocowych wartości liczników . Dlatego, w chwili rozpoczęcia kolejnego cyklu detekcyjnego, wysłane zostaną ostateczne wartości liczników wiadomości wysłanych, a stąd . W efekcie otrzymujemy, że: . Ze względu na fakt, że ten ostatni predykat ma wartośd od chwili , a , więc w cyklu wszystkie zmienne będą miały wartośd , i w efekcie algorytm detekcji dynamicznego zakooczenia przetwarzania aplikacyjnego się zakooczy. Twierdzenie 21 Jeżeli algorytm stwierdza wystąpienie dynamicznego zakooczenia przetwarzania rozproszonego, to przetwarzanie aplikacyjne jest w istocie w stanie zakooczenia dynamicznego. Oznaczmy przez k i k+1 dwa ostatnie cykle detekcyjne. Dowód powyższego twierdzenia obejmuje wykazanie, że istnieje taki moment dla którego dla wszystkich procesów są spełnione następujące warunki: Warunek C4: (wszystkie procesy są pasywne w chwili Warunek C5: (ani wiadomości już dostępne, ani znajdujące się w kanałach komunikacyjnych nie wystarczą do uaktywnienia procesu ) Dowód warunku C4 pomijamy, jako identyczny, jak w przypadku warunku C1 (patrz: Twierdzenie 19) dla twierdzenia o poprawności algorytmu detekcji zakooczenia statycznego. Dowód warunku C5: Z konstrukcji algorytmu wynika, że algorytm ten zakooczy się w chwili pod warunkiem, że predykat . Ponieważ każdy proces był pasywny w przedziale dla każdego z nich zachodzi: Warunek C6: oraz Wyznaczając zbiór procesów, od których wiadomości są aktualnie transmitowane do algorytm uwzględnia w istocie następującą zależnośd: gdyż , . Zauważmy, że liczniki są monotoniczne, zatem: Ponieważ dla każdego , różnica między rzeczywistym zbiorem , a jego aproksymacją , może wynikad tylko z dotarcia pewnych wiadomości do procesów docelowych. Wówczas jednak odpowiedni nadawcy zostaną uwzględnieni w zbiorze , zatem biorąc pod uwagę warunek C6 możemy wnioskowad, że: Dalej, z monotoniczności predykatu wynika, że dla każdego : Powyższe oznacza, że warunek C5 jest spełniony. Złożoność algorytmu i jego cechy Aby wykryd wystąpienie zakooczenia dynamicznego, niezbędne są w najgorszym wypadku dwa cykle detekcyjne po zakooczeniu cyklu bieżącego Ponieważ nie są przesyłane potwierdzenia, złożonośd komunikacyjna algorytmu wynosi (zatem jest mniejsza niż w przypadku algorytmu detekcji zakooczenia statycznego przedstawionego wcześniej- ) Porównując dalej algorytmy detekcji zakooczenia statycznego i dynamicznego, widzimy, że wiadomości kontrolne w drugim z nich są bardziej złożone, gdyż zawierają wektory liczników. Opóźnienie detekcji jest mniejsze, ze względu na brak konieczności oczekiwania na potwierdzenia. Wystąpienie zakooczenia dynamicznego wyprzedza w czasie wystąpienie zakooczenia statycznego. Uzyskane w sumie przyspieszenie momentu wykrycia zakooczenia obliczeo rozproszonych może zatem mied istotne znaczenie praktyczne, zwłaszcza w zastosowaniach czasu rzeczywistego. Wykład #11: Niezawodność przetwarzania Plan wykładu: a) b) c) d) Pojęcia podstawowe (awaria, błąd, wada) Klasy awarii procesów Kanały komunikacyjne Modele systemów rozproszonych w kontekście niezawodności (model asynchroniczny, synchroniczny i częściowo synchroniczny) e) Detektory awarii- definicje, zależności, metryki f) Implementacja detektorów awarii klasy i g) Problem elekcji w środowisku zawodnym Poprawność procesu Proces poprawny to taki, który działa zgodnie z algorytmem (specyfikacją). Dla procesu poprawnego predykat Analogicznie, procesem niepoprawnym, nazywamy proces, który działa niezgodnie z algorytmem (specyfikacją); wówczas predykat . Pojęcia podstawowe Awaria (ang. failure)- działanie (zachowanie) procesu niezgodnie ze specyfikacją Błąd (ang. error)- składnik stanu procesu odpowiedzialny za będącą jego następstwem awarię. Może on byd symptomem awarii, która ujawnia się natychmiast lub dopiero w przyszłości. Wada (ang. fault)- stwierdzona lub hipotetyczna przyczyna wystąpienia błędu Klasy awarii procesów Wyróżnia się cztery podstawowe klasy awarii procesów: załamania, zaniechania, awarie powtarzalne i awarie dowolne. Załamanie (ang. crashes) oznacza, że proces działa poprawnie do pewnej chwili , po której zaprzestaje wysyład i odbierad wiadomości, pomimo, że wynika to z algorytmu procesu. Specjalnym przypadkiem jest sytuacja, w której proces ulega awarii przed wykonaniem jakiegokolwiek kroku algorytmu (ang. initially-dead). Zaniechanie (ang. omissions) oznacza, że proces nie wysyła (lub nie dostarcza) wiadomości, pomimo, że powinien to zrobid, zgodnie z wykonywanym algorytmem. Awarie zaniechania mogą byd konsekwencją przepełnienia bufora lub przeciążenia sieci komunikacyjnej. Awaria powtarzalna (ang. crash &recoveries) oznacza, że proces może byd odtworzony (wznowiony) po awarii. Wystąpienie awarii tego typu wstrzymuje proces na pewien czas, po upływie którego proces rozpoczyna ponownie wykonywanie algorytmu. Proces jest uznawany za poprawny, jeżeli istnieje pewna chwila , po której proces wykonuje algorytm i nigdy nie podlega awariom. Innymi słowy, proces poprawny to taki, który ulega skooczonej liczbie awarii, przy czym po każdej z nich możliwe jest odtworzenie jego stanu. Proces błędny w tym modelu to taki, który nie jest wznowiony po kolejnej (w szczególności, pierwszej) awarii lub taki, który wiele razy ulega awarii Awaria dowolna (ang. arbitrary failures) oznacza, że zachowanie procesu odbiega w sposób dowolny od algorytmu, który powinien wykonywad. Na przykład, proces może wysyład w dowolnej chwili różne wiadomości. Szczególnym przypadkiem awarii dowolnych są tzw. awarie bizantyjskie. Jak łatwo zauważyd, najbardziej ogólną klasą awarii jest klasa z awariami dowolnymi. Zaniechania są specjalnym przypadkiem awarii powtarzalnych, natomiast załamania szczególnym przypadkiem zaniechao. W synchronicznych systemach rozproszonych pojawia się dodatkowa klasa awarii związana z wykonywaniem kroków we właściwej kolejności, ale w niewłaściwym czasie. Są to awarie dotyczące czasu (ang. timing errors). Modele kanałów komunikacyjnych Przypomnijmy, że kanał (patrz: Wykład #2: Kanał komunikacyjny) jest obiektem (abstrakcją, mechanizmem) skojarzonym z uporządkowaną parą procesów , modelującym jednokierunkowe łącza transmisyjne. Dotychczas zakładaliśmy, że kanały są niezawodne. Oznaczało to, że każda wiadomośd wysłana kanałem ostatecznie (w koocu) docierała do adresata. Takie założenie nie zawsze jest realizowalne. Przeanalizujemy więc dalej różne modele kanałów komunikacyjnych, uwzględniając możliwe ich awarie. W szczególności omówimy kanały rzetelne (ang. fair loss links), kanały wytrwałe (ang. stubborn links) i kanały niezawodne (ang. perfect links), które będą podstawą konstrukcji wybranych algorytmów rozproszonych w środowisku zawodnym. Kanały rzetelne Specyfikacja Kanał między dwoma procesami nazywad będziemy kanałem rzetelnym, jeżeli posiada on następujące własności: Rzetelne dostarczanie (ang. fair loss delivery) Jeżeli wiadomośd wysyłana jest nieskooczoną liczbę razy przez proces do i żaden z tych procesów nie ulega awarii (oba są poprawne), to wiadomośd jest dostarczana nieskooczoną liczbę razy do . Należy zauważyd, że własnośd ta dopuszcza zagubienie wiadomości - nawet nieskooczoną liczbę razy. Ograniczone powielanie (ang. finite duplication) Jeżeli wiadomośd wysyłana jest skooczoną liczbę razy przez proces do , to wiadomośd ta nie może byd dostarczona nieskooczoną liczbę razy do procesu . Brak samogeneracji (ang. no creation) Jeżeli wiadomośd została dostarczona do procesu , to została ona wcześniej wysłana do tego procesu przez jakiś inny proces . Innymi słowy, kanał nie tworzy samorzutnie wiadomości. Operacje komunikacyjne Operację wysłania wiadomości przez proces rzetelnego oznaczad będziemy przez będziemy jako do procesu , gwarantującą własności kanału , a odpowiadające jej zdarzenie zapisywad . Analogicznie przez oznaczad będziemy operację uaktywniającą zdarzenie i przekazującą wiadomośd do procesu aplikacyjnego lub innego mechanizmu komunikacyjnego (innej warstwy komunikacyjnej). Kanały wytrwałe Specyfikacja Kanał między dwoma procesami nazywad będziemy kanałem wytrwałym (upartym) (ang. stubborn link), jeżeli posiada on następujące własności: Wytrwałe dostarczanie (ang. stubborn delivery) Jeżeli wiadomośd wysyłana jest przez proces do procesu i oba te procesy są poprawne (nie ulegają awarii), to wiadomośd jest dostarczona nieskooczoną liczbę razy do . Brak samogeneracji (ang. no creation) Własnośd taka sama, co w przypadku kanałów rzetelnych. Jeżeli wiadomośd została dostarczona do procesu , to została ona wcześniej wysłana do tego procesu przez jakiś inny proces . Innymi słowy, kanał nie tworzy samorzutnie wiadomości. Operacje komunikacyjne Operację wysłania wiadomości przez proces wytrwałego oznaczad będziemy będziemy jako do procesu , gwarantującą własności kanału , a odpowiadające jej zdarzenie zapisywad . Analogicznie, przez oznaczad będziemy operację uaktywniającą zdarzenie i przekazującą wiadomośd do procesu aplikacyjnego lub innego mechanizmu komunikacyjnego (innej warstwy komunikacyjnej). Implementacja kanałów wytrwałych Algorytm, implementujący mechanizm kanałów wytrwałych (ang. retransmit forever algorithm) zakłada dostępnośd mechanizmu kanałów rzetelnych. W poniższym algorytmie wiadomości aplikacyjne umieszczane są w pakietach typu PACKET. Wiadomości aplikacyjne ( ) są umieszczane w pakietach ( ) i, po odebraniu danego pakietu przez monitor, są one przekazywane procesom aplikacyjnym z użyciem operacji , uaktywniającej zdarzenie w odpowiednim procesie aplikacyjnym. type PACKET extends FRAME is record of : MESSAGE end record : MESSAGE : PACKET 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. /* Po stronie nadawcy implementacja mechanizmu kanałów wytrwałych sprowadza się do wysyłania wiadomości nieskooczoną liczbę razy */ when do while wait end while end when /* Po stronie odbiorcy wiadomości, każde odebrana wiadomośd jest po prostu przekazywana procesowi aplikacyjnemu- adresatowi */ when do end when Kanały niezawodne Specyfikacja Kanał między dwoma procesami jest nazywany kanałem niezawodnym (ang. perfect link, reliable link), jeżeli posiada on następujące własności: Niezawodne dostarczanie (ang. reliable delivery) Jeżeli wiadomośd wysyłana jest przez proces do procesu poprawne, to wiadomośd jest ostatecznie dostarczona do . i oba te procesy są Brak powielania (ang. no duplication) Żadna wiadomośd wysłana do nie może byd dostarczona do więcej niż raz. Brak samogeneracji (ang. no creation) Analogicznie, co w przypadku tej samej własności w kanałach rzetelnych i wytrwałych. Kanał nie tworzy samorzutnie wiadomości. Czasami kanały tego typu nazywa się kanałami ostatecznie niezawodnymi. Operacje komunikacyjne Operację wysłania wiadomości przez proces do procesu niezawodnego oznaczad będziemy będziemy jako , gwarantującą własności kanału , a odpowiadające jej zdarzenie zapisywad . Analogicznie, przez oznaczad będziemy operację uaktywniającą zdarzenie i przekazującą wiadomośd do procesu aplikacyjnego lub innego mechanizmu komunikacyjnego (innej warstwy komunikacyjnej). Implementacja kanałów niezawodnych Algorytm implementujący mechanizm kanałów niezawodnych zakłada dostępnośd mechanizmu kanałów wytrwałych. type PACKET extends FRAME is record of : PROCESS_ID : MESSAGE end record : MESSAGE : PACKET : set of MESSAGE 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. /* Po stronie nadawcy implementacja mechanizmu kanałów niezawodnych jest identyczna, co jej odpowiednik dla mechanizmu kanałów wytrwałych */ when do // patrz: Kanały wytrwałe end when /* Wiadomośd jest dostarczana przez monitor procesowi aplikacyjnemu tylko wtedy, gdy nie zawiera się on w zbiorze . Po dostarczeniu procesowi wiadomości jest ona dodawana do zbioru . Zapobiega to tym samym dostarczania wiadomości więcej niż jednokrotnie */ when do if end if end when then Modele systemów rozproszonych w kontekście niezawodności Jak wcześniej wspomniano, ważnym aspektem, charakteryzującym system rozproszony, są przyjęte założenia, dotyczące zachowania procesów i kanałów komunikacyjnych, uwzględniające upływający czas. W zależności od tego, czy istnieją w danym modelu ograniczenia, dotyczące czasu komunikacji i szybkości względnej procesów możemy wyróżnid systemy asynchroniczne (ang. asynchronous), częściowo synchroniczne (ang. partially synchronous) i synchroniczne (ang. synchronous). Systemy asynchroniczne Dla wielu problemów konstrukcja algorytmów rozproszonych w zawodnych systemach asynchronicznych jest trudna, a często nawet niemożliwa bez dodatkowych założeo, dotyczących synchronizmu lub dostępności specyficznych mechanizmów. Przykładem może byd tutaj problem konsensusu (patrz: Wykład #13). Brak ograniczeo na czas transmisji wiadomości (komunikacji) Brak ograniczeo na czas przetwarzania Brak dostępu do globalnego zegara, np. fizycznego zegara czasu rzeczywistego. Jak wiadomo, pomimo braku dostępu do zegara globalnego, nadal możliwy jest pomiar czasu. Będzie to jednak tylko czas logiczny związany z wymianą komunikatów (patrz: Wykład #4: Czas wirtualny) Systemy synchroniczne W przetwarzaniu synchronicznym istnieje i jest znane górne ograniczenie, dotyczące czasu przetwarzania poszczególnych procesów lub inaczej, względnych prędkości wykonywania procesów. Można zatem łatwo określid moment, po którym dane zadanie powinno zostad wykonane przez proces. Takimi zadaniami może byd wysłanie lub odebranie wiadomości lub też przetwarzanie lokalne. W komunikacji synchronicznej natomiast, istnieje znane z góry ograniczenie czasu transmisji wiadomości przez kanały komunikacyjne. Jest to, innymi słowy, czas potrzebny, aby komunikat wysłany przez nadawcę dotarł do adresata w najgorszym możliwym przypadku. Dostępnośd zegara globalnego oznacza możliwośd lokalnego odczytu przez procesy aktualnego stanu wspólnego zegara. Odczyt ten jest precyzyjny, bądź obarczony znanym maksymalnym błędem odczytu lokalnego w stosunku do wartości zegara globalnego. Niestety, z uwagi na silne założenia, dotyczące czasu, konstrukcja systemów synchronicznych jest bardzo trudna. Ponadto, w systemach tego typu trzeba zakładad czasy maksymalne, na ogół znacznie większe niż czasy średnie. Takie założenie prowadzi zwykle- w praktyce- do istotnego zmniejszenia efektywności aplikacji. Synchroniczne komunikacja Synchroniczna przetwarzanie Dostępny zegar globalny Systemy częściowo synchroniczne Rzeczywiste systemy rozproszone zwykle zachowują się jak systemy synchroniczne, tzn. zazwyczaj znane są pewne ograniczenia na czas dostarczenia wiadomości. System tego typu można by więc nazwad systemem zazwyczaj synchronicznym. Istnieją jednak odcinki czasu, w których te znane ograniczenia czasowe przestają obowiązywad i wtedy system taki zachowuje się jak system asynchroniczny, np. w chwili przeciążenia sieci komunikacyjnej, przepełnienia buforów itp. Z powyższych powodów wprowadzono pojęcie systemów częściowo synchronicznych, które można zdefiniowad na kilka sposobów: Mogą to byd systemy, w których po pewnym, nieznanym czasie, zaczynają obowiązywad przyjęte założenia na górne ograniczenia na czas dostarczenia wiadomości. Innymi słowy, systemy takie ostatecznie zaczynają się zachowywad jak systemy synchroniczne, lecz nie wiadomo, od jakiego momentu Można także przyjąd, że w systemach częściowo synchronicznych istnieją odcinki czasu, w których istnieją ograniczenia na czasy dostarczenia wiadomości i odcinki te są wystarczająco długie, by umożliwid zakooczenie algorytmów. Zaprezentowane definicje nie znaczą oczywiście, że system musi byd początkowo asynchroniczny, czy też, że po pewnym, znanym czasie system taki stanie się systemem synchronicznym na zawsze. Można także dokonad klasyfikacji systemów częściowo synchronicznych na podstawie parametrów, dotyczących właściwości procesów i kanałów komunikacyjnych: Synchronicznośd procesów (istnieje stała taka, że jeżeli pewien proces wykona kroków, to każdy inny proces wykona co najmniej krok) Istnienie ograniczeo na czas przesyłania wiadomości (opóźnienie komunikacyjne) Porządek wiadomości (porządek synchroniczny oznacza, że jeżeli proces wysyła wiadomośd do procesu w czasie oraz proces wysyła wiadomośd do procesu w czasie , to wiadomośd zostanie dostarczona do przed wiadomością . Sposób komunikacji (określenie, czy komunikacja odbywa się za pomocą niepodzielnej komunikacji rozgłaszania, czy też za pomocą komunikacji punkt- punkt) Typ operacji / (określenie, czy są one operacjami atomowymi, tzn. czy operacja wysłania wiadomości kooczy się dopiero po zakooczeniu odbioru tej wiadomości przez adresata, czy też są one rozłączne. Innymi słowy, czy komunikacja między procesami jest synchroniczna, czy też nie) Korzystając z powyższych parametrów można wyodrębnid klasy systemów. Podział ten jednakże nie zdobył powszechnego uznania, głównie z uwagi na to, że w rzeczywistych systemach niektóre parametry są do pewnego stopnia równoważne innym. Na przykład, niepodzielne operacja rozgłaszania i / wymagają istnienia ograniczeo na czas przesyłania wiadomości, by można je było zaimplementowad. Detektory awarii Z praktycznego punktu widzenia, zawodny rozproszony detektor awarii (ang. failure detector) można definiowad jako zbiór „wyroczni”, które są powiązane z poszczególnymi procesami, biorącymi udział w przetwarzaniu rozproszonym. Zadaniem tych wyroczni jest dostarczanie listy procesów podejrzewanych o niepoprawne działanie (procesów, które uległy awarii). Wyrocznie te mogą byd omylne, co oznacza, że mogą podejrzewad o awarię procesy poprawne lub też odwrotnie- nie podejrzewad procesów niepoprawnych. Błędne podejrzenia są oczywiście niepożądane, ale w praktyce są akceptowalne, o ile nie powstrzymują poprawnych procesów przed zachowaniem się zgodnie z ich specyfikacją. Dlatego też mówi się, że detektor „podejrzewa”, a nie „wykrywa” proces niepoprawny. Ponadto, w momencie stwierdzenia przez wyrocznię awarii procesu, proces ten powinien znaleźd się na liście procesów podejrzanych. Natomiast w przypadku odwrotnym, gdy wyrocznia stwierdzi, że proces jest poprawny, proces ten powinien byd usunięty z listy procesów podejrzewanych. Informacje dostarczane przez detektor są tym dokładniejsze, im większy synchronizm systemu rozproszonego. Właściwości detektorów możliwych do zaimplementowania w systemie określają stopieo jego synchroniczności. Rozważany model systemu: System składa się ze zbioru procesów, . Kanały komunikacyjne, łączące wybrane, stosownie do topologii przetwarzania, pary procesów, są niezawodne. Zegar globalny jest dyskretny, a jego dziedzina jest zbiorem liczb naturalnych . Zakłada się też ponadto, że czasy komunikacji i przetwarzania są ograniczone, lecz nieznane. Wzorzec awarii Chandra i Toueg wprowadzili pojęcie zawodnego detektora awarii, jako dostępnego dla programisty mechanizmu, który udziela informacji na temat stanu poszczególnych procesów. Niezwykle ważne jest tu określenie „zawodny”, oznaczające tu, że nie spodziewamy się, iż detektor w każdej chwili udzieli odpowiedzi prawidłowej. Może on wskazywad procesy poprawne jako te, które uległy awarii, bądź na odwrót, przy czym może popełniad pomyłki nieskooczenie wiele razy. Nie może to jednak spowodowad naruszenia warunków poprawności, bądź zakooczenia algorytmu. Niech wzorzec awarii będzie funkcją odwzorowującą w , gdzie oznacza zbiór procesów, które uległy awarii do momentu . Po awarii proces nie jest wznawiany, stąd: Ponadto oraz Historia detektora awarii Rozważmy tylko wzorce , w których co najmniej jeden proces jest poprawny, czyli Każdy detektor utrzymuje listę (zbiór) procesów, które podejrzewa. . Historia detektora awarii to funkcja odwzorowująca iloczyn kartezjaoski zbioru procesów i pewnego okresu czasu w rodzinę wszystkich podzbiorów zbioru ( ). Wartośd jest zbiorem procesów podejrzewanych przez detektor procesu w chwili . Jeżeli , to mówimy, że podejrzewa w chwili w . Formalna definicja detektora awarii Zbiór możliwych historii oznacza sumę mnogościową wszystkich możliwych historii detektora awarii dla wzorca . Detektor awarii detektora awarii jest to funkcja, odwzorowująca wzorzec awarii . w zbiór możliwych historii Własności detektorów Detektory awarii charakteryzowane są przez dwie własności: Kompletnośd (ang. completness) opisuje zdolnośd do podejrzewania wszystkich procesów niepoprawnych. Związana jest ona z możliwością popełnienia pomyłek pierwszego rodzaju- tzn. niepodejrzewania procesów niepoprawnych Dokładnośd (ang. accuracy) opisuje zdolnośd do niepodejrzewania procesów poprawnych. Związana jest ona z możliwością popełnienia pomyłki drugiego rodzaju- tj. podejrzewania przez detektor awarii procesów poprawnych. Zauważmy, że branie pod uwagę tylko jednej z tych własności nie jest wystarczające. W przypadku kompletności trywialny w implementacji detektor, podejrzewający zawsze wszystkie procesy spełniałby zawsze własnośd silnej kompletności- podejrzewając wszystkie procesy, gwarantowałby, że podejrzewa również wszystkie procesy niepoprawne. Analogicznie trywialny przykład detektora, niepodejrzewającego żadnego procesu można by przedstawid dla drugiej z własności. Na tej podstawie jasno widad koniecznośd uwzględnienia obu własności. Własność kompletności Silna kompletnośd (ang. strong completeness *SC+) oznacza, że ostatecznie każdy procesy, który jest niepoprawny, będzie trwale podejrzewany przez każdy poprawny proces. Słaba kompletnośd (ang. weak completeness *WC+) oznacza, że ostatecznie każdy proces, który jest niepoprawny, będzie trwale podejrzewany przez niektóre procesy (przynajmniej jeden). Własność dokładności Silna dokładnośd (ang. strong accuracy *SA+) oznacza, że żaden proces nie jest podejrzewany, dopóki nie stanie się niepoprawny. Słaba dokładnośd (ang. weak accuracy *WA+) oznacza, że niektóre poprawne procesy nie są nigdy podejrzewane Można zdefiniowad dwie dodatkowe własności związane z dokładnością, mówiące, że detektor awarii zacznie działad jak detektor, gwarantujący słabą lub silną dokładnośd, ale dopiero po pewnym nieznanym, ale ograniczonym czasie. Definicje tych własności są następujące: Ostatecznie silna dokładnośd (ang. eventual strong accuracy) oznacza, że po upływie pewnego skooczonego czasu żadne poprawne procesy nie są podejrzewane przez żadne poprawne procesy. Ostatecznie słaba dokładnośd (ang. eventual weak accuracy) oznacza, że po upływie pewnego skooczonego czasu niektóre poprawne procesy (co najmniej jeden) nie są podejrzewane przez żaden poprawny proces. Klasyfikacja detektorów Kompletnośd Silna Dokładnośd Słaba Ostatecznie silna Silna Perfect P Strong S Eventually Perfect P Słaba Q Weak W Q Ostatecznie słaba Eventually Strong S Eventually Weak W Kombinacja wszystkich omówionych własności daje nam w sumie klas detektorów, które zostały zaprezentowane powyżej. Istnieje także wiele innych klas detektorów awarii, różniącymi się wymaganiami odnośnie dokładności i kompletności. Relacja redukcji detektorów Pomiędzy różnymi klasami detektorów awarii można wyznaczyd pewną hierarchię, pozwalającą wykorzystywad detektory (określane nieformalnie jako silniejsze) w celu emulowania własności innych (które określa się wtedy jako detektory słabsze). Mówimy, że istnieje algorytm redukcji on przekształcid wyjście detektora błędów , jeżeli dla każdego przebiegu tego algorytmu potrafi w możliwe wyjście detektora . Jeżeli istnieje algorytm redukcji , przekształcający w , to mówi się, że jest redukowalny do lub słabszy niż , co zapisuje się jako . Oznacza to, że problem rozwiązywalny za pomocą da się także rozwiązad za pomocą detektora . Jeżeli redukuje się do oraz równoważne, co zapisuje się jako redukuje się do Wreszcie, jeżeli redukuje się do jest ściśle słabszy niż . , ale , to mówi się, że nie można zredukowad do oraz są , to mówi się, że Jeżeli natomiast dwa detektory nie redukują się do siebie wzajemnie, to detektory te nazywamy nieporównywalnymi. Relacje między detektorami Doskonały detektor awarii może byd scharakteryzowany własnością silnej kompletności (SC) i własnością silnej dokładności (SA). Może się jednak zdarzyd, że nie będziemy potrzebowad detektora z tak silnymi własnościami, które mogą powodowad zwiększenie wymagao, dotyczących synchronizmu systemu. W takim przypadku możemy osłabid jedną lub obie własności w zależności od potrzeb. Na rysunku poniżej przedstawione są wszystkie możliwości „osłabienia” doskonałego detektora awarii. Do wyboru mamy trzy scenariusze: Osłabiona zostanie silna kompletnośd do słabej kompletności (SC -> WC). W wyniku tego działania powstanie detektor klasy Q. Osłabiona zostanie silna dokładnośd do słabej dokładności (SA -> WA). W wyniku tego działania powstanie detektor klasy S. Osłabiona zostanie silna dokładnośd do ostatecznie silnej dokładności (SA -> ESA). W wyniku tego działania powstanie detektor klasy P Hierarchia detektorów Ostatecznie możemy zobrazowad wszystkie zależności pomiędzy poszczególnymi klasami detektorów awarii przedstawiając sześcian, którego wierzchołkami są właśnie poszczególne klasy detektorów. Każda z krawędzi tego sześcianu będzie reprezentowała pewną relację pomiędzy wierzchołkami (klasami detektorów), które łączy. W ten sposób otrzymujemy: Detektorami równoważnymi są następujące pary klas detektorów: , , , . Krawędzie łączące odpowiednie pary zostały zastąpione symbolem dwukierunkowej strzałki rysowanej linią przerywaną. Inne pary detektorów połączone wspólną krawędzią znajdują się w zdefiniowanej wcześniej relacji redukcji. Dla przykładu można wymienid tutaj pary ( jest ściśle słabszy od ), , , czy też . Wierzchołki, znajdujące się po przekątnych, czy to sześcianu, czy też kwadratu (boku) tworzą pary nieporównywalnych klas. Przykładowo mogą to byd pary , czy też . Jakość detekcji- metryki Detektory awarii można oceniad na podstawie jakości ich usług. Właściwośd kompletności i dokładności, chod o bardzo dużym znaczeniu teoretycznym, mają niewielkie znacznie praktyczne. Osoby, korzystające z systemów z detektorami błędów nie oczekują, że w nieskooczonym czasie ich programy będą działad poprawnie- interesują ich raczej bardziej realistyczne kryteria. Dwoma interesującymi własnościami mogłyby byd prędkośd wykrywania awarii (liczba jednostek czasu wymaganych do wykrycia błędnego procesu) oraz dokładnośd, opisująca, jak dobrze detektorowi udaje się unikad pomyłek. Jednym z propozycji oceny jakości detektorów awarii wprowadziła trzy główne oraz cztery dodatkowe metryki jakości. Do głównych metryk jakości należą: Czas wykrycia awarii (ang. detection time)- czas, który upływa od awarii pewnego procesu do chwili, gdy zacznie on byd permanentnie podejrzewany Czas trwania pomyłki (ang. mistake duration)- czas potrzebny detektorowi, by zaprzestał podejrzewad poprawny proces Czas pomiędzy kolejnymi pomyłkami (ang. mistake recurrence time)- czas między dwiema kolejnymi pomyłkami Do czterech dodatkowych metryk jakości zaliczamy: Prawdopodobieostwo trafności zapytania (ang. query accuracy probability)prawdopodobieostwo prawdziwości osądu detektora Średni współczynnik pomyłek (ang. average mistake rate)- średnia liczba pomyłek w jednostce czasu Okres pracy bezbłędnej (ang. good period duration)- określona jako długośd okresów czasu, podczas których detektor nie popełnia pomyłek. Przyszły okres pracy bezbłędnej (ang. forward good period duration)- określona jako oczekiwana długośd okresu czasu, który mija między losowo wybranym momentem czasu, a chwilą, w której detektor popełnia kolejną pomyłkę Wszystkie metryki zdefiniowane są dla pary procesów i , gdzie monitoruje i nie ulega awarii (założenia te nie wpływają na ogólnośd wyników). W zależności od wymagao aplikacyjnych przedstawione metryki mogą okazad się niewystarczające. Algorytmy detekcji są bardzo różnorodne, ze względu na wymagania, dotyczące warstwy komunikacyjnej, złożoności komunikacyjnej i czasowej oraz stopnia zawodności. Wiedząc, iż dla programisty każde z tych kryteriów może okazad się ważne, wskazane wydaje się stworzenie metryk, uwzględniających te kryteria. Pamiętając o tym, zaproponowano ocenę nowego algorytmu, biorąc pod uwagę pesymistyczne zapotrzebowanie na pasmo. Znajomośd tego parametru jest niezwykle cenna, gdy należy liczyd się z ograniczonymi zasobami transmisyjnymi. Określa więc on skalowalnośd algorytmu- cechę niezwykle pożądaną nie tylko w przypadku detektorów, ale każdego algorytmu rozproszonego. Natomiast, w innej pracy, podczas pomiarów uwzględniono obciążenie procesora i zużycie pamięci przez algorytm detekcji. Należy tu jednak zauważyd, iż metryka ta odzwierciedla w rzeczywistości jakośd implementacji algorytmu, a nie jakośd samego algorytmu. Czas wykrycia awarii Metryka ta określa, jak już opisano wcześniej, jak szybko detektor jest w stanie wykryd awarię węzła. Określa ona czas, który upływa od awarii pewnego procesu do chwili, gdy zacznie on byd permanentnie podejrzewany. Jest to jedyna i wystarczająca metryka, określająca kompletnośd detektora. Jej wartością jest średni czas , jaki upływa od awarii pewnego procesu (na rysunku poniżej awaria ta ma miejsce w chwili (w przykładzie jest to chwila ). ), do momentu ostatecznego wykrycia awarii przez detektor Czas trwania pomyłki Metryka ta jest w rzeczywistości zmienną losową, reprezentującą czas potrzebny detektorowi, by zaprzestał podejrzewad poprawny proces. W przykładzie widocznym poniżej jest to czas pomiędzy chwilą , w której detektor popełnia błąd, niesłusznie podejrzewając proces , a chwilą , w której koryguje swoją pomyłkę, przestając podejrzewad proces . Okres między kolejnymi pomyłkami Metryka ta określa okres czasu, jaki upływa między dwiema kolejnymi pomyłkami detektora. W przykładzie poniżej w chwili detektor niesłusznie zaczął podejrzewad proces . Po kilku jednostkach czasu skorygował swoją pomyłkę, jednak w chwili ponownie zaczął podejrzewad poprawny proces . Prawdopodobieństwo dokładności zapytania jest prawdopodobieostwem, że informacja dostarczona przez detektor w losowym momencie jest poprawna (ang. accurate). Jest to miara, dotycząca dokładności detektora. Warto tutaj zwrócid uwagę, że dla detektorów, spełniających warunek silnej dokładności (patrz: Własnośd dokładności), metryka ta zawsze przyjmuje wartośd , jeżeli detektory pytane są o stan procesu, działającego poprawnie. Podobnie, jeżeli detektor spełnia warunek silnej kompletności (patrz: Własnośd kompletności), to ostatecznie metryka ta będzie przyjmowad wartośd , jeżeli detektory pytane są o stan węzła wadliwego. Stąd, jeżeli detektor jest klasy P, to od pewnego momentu (a dokładnie od momentu określonego przez metrykę ) będzie zawsze przyjmowad wartośd . Przykład #1: Metryka Okazuje się jednak, iż wspomniana metryka nie jest wystarczająca do stwierdzenia, który z detektorów jest lepszy, ze względu na dokładnośd detekcji. Na poniższym rysunku widad, że dla obydwu detektorów metryka przyjmuje taką samą wartośd- 0,75 (w ciągu jednostek czasu, przez jedną jednostkę detektor się myli, stąd myli się przez jednostki czasu na jednostek czasu, stąd , natomiast detektor ). Detektor jednak popełnia pomyłki rzadziej (raz na jednostek czasu), w związku z czym jest on lepszy, chod w świetle tej metryki obydwa detektory są równie dobre. Dla określenia dokładności detekcji, konieczne jest zatem zdefiniowanie dalszych metryk. Średni współczynnik pomyłek Metryka ta określa średnią liczbę pomyłek, jakie detektor popełnia w jednostce czasu. Ponownie, okazuje się, że jest to metryka nie zawsze wystarczająca do stwierdzenia, który z detektorów jest lepszy. Na powyższym przykładzie wartośd tej metryki wynosi Przykład #2: Metryki i Na poniższym diagramie widad, iż detektor ( , zaś . ) oraz jest lepszy od ( ze względu na parametry , zaś ). jednak szybciej koryguje swoje pomyłki, co dla niektórych aplikacji może mied zasadnicze znaczenie. Widad wyraźnie, że nawet połączenie tych metryk nie jest w stanie odzwierciedlid jakości detekcji. Implementacja detektora awarii Mechanizm pulsu Implementacja detektora, wykorzystująca mechanizm pulsu (ang. heartbeat) polega na tym, że proces monitorowany , co pewien zdefiniowany czas (ang. pulse) wysyła wiadomośd typu „I’m alive”. Odebranie tego typu wiadomości po drugiej stronie łącza komunikacyjnego przez detektor w czasie (ang. timeout) od ostatnio odebranej wiadomości pozwala uznad proces za poprawny. W przeciwnym wypadku detektor zaczyna podejrzewad proces . Warto podkreślid fakt, że w tym scenariuszu aktywnośd leży po stronie procesu monitorowanego, który musi okresowo wysyład wiadomości. Mechanizm odpytywania Implementacja detektora, wykorzystująca mechanizm odpytywania (ang. rolling, interrogation) jest modyfikacją poprzedniego podejścia. Polega na tym, że proces monitorujący, co pewien zdefiniowany okres czasu wysyła pytanie o status typu: „Are you alive?”. Proces monitorowany po odebraniu tego typu wiadomości odpowiada na niego, wysyłając wiadomośd typu „I’m alive”. Jeśli odpowiedź nie dotrze do procesu monitorującego (detektora awarii ) przez zadany czas , to detektor zacznie podejrzewad proces o awarię. Ten schemat monitorowania umożliwia lepszą kontrolę procesu monitorowania, gdyż aktywnośd leży w tym rozwiązaniu po stronie detektora awarii. Implementacja detektora P: mechanizm pulsu Detektor klasy P (ang. perfect failure detector) jest detektorem, który posiada następujące własności: Silna kompletnośd (SC) (patrz: Własnośd kompletności) Silna dokładnośd (SA) (patrz: Własnośd dokładności) SA P Q SC WC WA S W ESA P Q EWA S W Algorytm, wykorzystujący mechanizm pulsu (ang. heartbeat) w celu implementacji doskonałego detektora awarii zakłada: Dostępnośd niezawodnych kanałów komunikacyjnych łączących procesy (ang. perfect point-to-point links) Synchroniczny model systemu Znany jest maksymalny czas transmisji komunikatu. W porównaniu do tej wartości czasy przetwarzania lokalnego i ewentualnie rozregulowania zegara lokalnego (przesunięcia, ang. drift) są pomijalnie małe Koncepcja algorytmu Algorytm wykorzystuje zegary lokalne procesów, które co stały odcinek czasu inicjują operację wysłania wiadomości do wszystkich procesów. Długośd jest tak dobrana, by wszystkie wysłane wiadomości mogły dotrzed do detektora. Brak wiadomości od pewnego procesu w danym okresie powoduje dodanie go do zbioru , o ile już się w tym zbiorze nie znajduje, co jest określane jako wykrycie awarii przez detektor procesu . Zdarzenia cykliczne Niech: Oznacza zdarzenie cykliczne, zachodzące w procesie w związku z upływem okresu czas o długości czasu lokalnego. Przypisanie nowej wartości zmiennej implikuje odpowiednią zmianę czasu, po którym zajdzie kolejne zdarzenie . W przedstawionym dalej algorytmie używane są dodatkowo dwa oznaczenia: - cykliczne zdarzenie upływu czasu maksymalnego oczekiwania na otrzymanie pulsu - cykliczne zdarzenie upływu czasu wysłania pulsu Algorytm Algorytm używa wiadomości typu HEARTBEAT. Zbiór zawiera identyfikatory procesów, podejrzewanych przez detektor , działający w monitorze . Zbiór ten jest początkowo pusty. Zmienna określa długośd maksymalnego czas oczekiwania na otrzymanie wiadomości typu HEARTBEAT (pulsu). Zmienna określa długośd czasu pomiędzy wysłaniem dwóch kolejnych wiadomości HEARTBEAT (pulsu). type HEARTBEAT extends FRAME : HEARTBEAT : set of PROCESS_ID : set of PROCESS_ID : INTEGER : INTEGER 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. /* Co pewien czas algorytm sprawdza, które procesy należy zacząd podejrzewad. Jeżeli nie otrzymano w ostatnim czasie wiadomości typu HEARTBEAT od danego procesu (nie znajduje się on w zbiorze ) i nie jest on jeszcze podejrzewany, to dołączany on jest do zbioru podejrzewanych procesów. */ when do for all do if then end if end for end when /* Co pewien czas rozsyłane są wiadomości typu HEARTBEAT do wszystkich pozostałych procesów */ when do for all do 12. 13. 14. end for end when /* Otrzymanie wiadomości typu HEARTBEAT od procesu powoduje dodanie go do zbioru procesów poprawnych detektora */ when do 15. 16. end when Implementacja detektora P: mechanizm pulsu Ostatecznie doskonały detektor awarii P (ang. eventually perfect failure detector) posiada następujące własności: silna kompletnośd (SC) (patrz: Własnośd kompletności) ostatecznie silna dokładnośd (ESA) (patrz: Własnośd dokładności) Algorytm, wykorzystujący mechanizm pulsu (ang. heartbeat) w celu implementacji ostatecznie doskonałego detektora awarii P zakłada: dostępnośd niezawodnych kanałów komunikacyjnych częściowo synchroniczny model systemu czasy przetwarzania lokalnego i przesunięcia zegarów lokalnych (ang. drift) są pomijalnie małe w porównaniu do maksymalnego czasu transmisji komunikatu Implementacja będzie wykorzystywała technikę pulsu opartą na okresowym rozsyłaniu wiadomości przez proces monitorowany. Koncepcja algorytmu Algorytm wykorzystuje zegar lokalny procesu Proces , co pewien stały okres czasu o długości , inicjuje operację wysłania wiadomości do wszystkich procesów. Procesy, od których, w pewnym okresie czasu o długości , nie otrzymano wiadomości (pulsu), dodawane są do zbioru procesów podejrzewanych o awarię ( ) przez detektor procesu . W przypadku stwierdzenia pomyłki, długośd okresu jest zwiększana. Podstawowa różnica w stosunku do uprzednio omówionego algorytmu dla doskonałego detektora P polega na zwiększaniu w przypadku wykrycia pomyłki. Z założeo, dotyczących środowiska wynika, że ostatecznie stała ta będzie większa niż maksymalne możliwe opóźnienie transmisji. Algorytm type HEARTBEAT extends FRAME : HEARTBEAT : set of PROCESS_ID : set of PROCESS_ID : INTEGER : INTEGER 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. /* Proces detekcji wywoływany jest co pewien czas . Detektor dołącza wszystkie procesy, które nie należą do zbioru (czyli takie, od których nie otrzymano ostatnio wiadomości typu HEARTBEAT) do zbioru . Jest to równoznaczne z rozpoczęciem podejrzewania tych procesów. Jeśli natomiast proces należy zarówno do zbioru , jak i do zbioru to oznacza to, że detektor popełnił pomyłkę, która powinna byd skorygowana. W takim przypadku proces przestaje byd podejrzewany oraz zwiększany jest czas (o pewną stałą ), po którym procesy zostają uznane za podejrzane, jeśli nie nadejdzie od nich żadna wiadomośd typu HEARTBEAT */ when do for all do if then else if then end if end if end for end when /* Co pewien czas rozsyłane są wiadomości typu HEARTBEAT do wszystkich pozostałych procesów */ when do for all do 19. end for end when /* Otrzymanie wiadomości typu HEARTBEAT od procesu powoduje dodanie go do zbioru procesów poprawnych detektora */ when do 20. 21. end when Problem wyboru lidera W systemach rozproszonych bywają sytuacje, w których problemem nie jest wykrycie, które procesy uległy awarii, ale wspólne uzgodnienie (przez wszystkie poprawne procesy) wyboru jednego procesu, który wciąż jest poprawny, i któremu wszystkie inne procesy ufają (nie podejrzewają). Detektor wspomagający wybór jednego zaufanego procesu określany jest jako detektor lidera . Taki zaufany proces może działad jako koordynator, niezbędny w pewnych rozproszonych algorytmach. Stąd też problem ten nazywa się problemem wyboru lidera (ang. eventual leader election). Wprowadzimy obecnie abstrakcję detektora , inaczej detektora ostatecznego lidera (ang. eventual leader detector), wykonującego algorytm wyboru lidera. Mechanizm ten ma zapewniad, że wszystkie poprawne procesy zgodzą się ostatecznie na wybór tego samego procesu. Mechanizm wyboru ostatecznego lidera posiada następujące własności: ostateczna dokładnośd (ang. eventual accuracy)- oznacza, że istnieje pewna chwila czasu, po której wszystkie poprawne procesy ufają (nie podejrzewają) pewnego poprawnego procesu ostateczna zgodnośd (ang. eventual agreement)- oznacza, że istnieje pewna chwila czasu, po której nie ma dwóch takich poprawnych procesów, które ufałyby dwóm różnym procesom Własności te oznaczają, że chociaż w czasie działania algorytmu lider może się zmieniad w dowolny sposób, jednakże ostatecznie wszystkie procesy zaczynają ufad jednemu liderowi i wyboru swojego już nie zmieniają- wybór lidera stabilizuje się. Algorytm wyboru ostatecznego lidera Rozważad będziemy teraz rozwiązanie problemu wyboru lidera dla klasy awarii powtarzalnych (patrz: Klasy awarii procesów) przy następujących założeniach: Procesy są odtwarzalne, co oznacza dostępnośd procedur i dla każdego procesu, które umożliwiają, odpowiednio, zapamiętanie, a później odtworzenie po ewentualnej awarii, wartości wybranych parametrów Kanały komunikacyjne posiadają własności kanałów rzetelnych (patrz: Kanały rzetelne) System charakteryzuje się częściową synchronicznością Koncepcja W celu implementacji mechanizmu detektora ostatecznego lidera można wykorzystad bezpośrednio uprzednio poznaną implementację ostatecznie doskonałego detektora awarii P (patrz: implementacja detektora P). Istotnie, wystarczające do rozwiązania problemu jest wybieranie jako lidera procesu o najwyższym identyfikatorze spośród wszystkich niepodejrzewanych przez ostatecznie doskonały detektor awarii. Ostatecznie, o ile co najmniej jeden proces jest poprawny, wszystkie procesy będą ufad dokładnie jednemu, poprawnemu procesowi. Ponieważ jednak dalej będziemy rozważad awarie powtarzalne, konieczne jest wprowadzenie dodatkowego warunku, który musi zostad spełniony przez potencjalnego lidera- liczba awarii takiego procesu powinna byd najmniejsza spośród wszystkich procesów. Algorytm Przedstawiony poniżej algorytm używa wiadomości HEARTBEAT, które zawierają numer epoki w polu . Epoką określa się okres poprawnego działania procesu, który może zostad ewentualnie zakooczony awarią procesu. Po awarii następuje odtwarzanie działania procesu (ang. recovery), przy czym każde odtworzenie oznacza początek nowej epoki. Dodatkowo zdefiniowano typ TRUSTED jako rekord, zawierający pole identyfikatora procesu oraz , zawierające numer epoki procesu w chwili, gdy został wybrany jako kandydat na lidera. Podobnie jak w poprzednich algorytmach, stosowany jest mechanizm pulsu (patrz: Mechanizm pulsu): każdy proces wysyła cyklicznie wiadomości typu HEARTBEAT. Inne używane zmienne to: typu PROCESS_ID zawiera identyfikator bieżącego lidera dla procesu . Analogicznie, zmienna zawiera identyfikator poprzedniego lidera dla procesu . Elementy zbioru są parami, składającymi się z identyfikatorów możliwych kandydatów na lidera i numerów epoki. zawiera numer epoki, odzwierciedlający liczbę awarii i wznowieo pracy procesu oraz są wykorzystywane przez funkcję określa długośd czasu pomiędzy wysłaniem dwóch kolejnych wiadomości typu HEARTBEAT (pulsu). Jej wartośd początkowa jest równa stałej określa długośd okresu czasu między kolejnymi wywołaniami wyboru lidera. Jej początkowa wartośd jest równa stałej type HEARTBEAT extends FRAME is record of : INTEGER end record type TRUSTED is record of : PROCESS_ID : INTEGER end record : HEARTBEAT : PROCESS_ID : PROCESS_ID : set of TRUSTED : INTEGER : TRUSTED : TRUSTED : INTEGER : INTEGER 1. 2. 3. 4. 5. 6. 7. /* Funkcja wybiera dla danego zbioru (podanego jako argument) jako lidera proces o najmniejszej liczbie awarii, którego identyfikator jest najmniejszy */ function for do for all do if then else if then 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. end if end if end for end for return end function /* Co pewien czas procesy sprawdzają, czy bieżący lider może nim pozostad. W tym celu wywołują funkcję , która wybiera jeden proces ze zbioru . Jeżeli w wyniku wykonania tego kroku algorytmu lider się zmieni, zwiększane jest opóźnienie między kolejnymi próbami odnalezienia lidera. Jeżeli wybrano nowego lidera, proces zaczyna mu ufad. Symbol oznacza pewną stałą dobraną przez użytkownika */ when do if then if then end if end if end when /* Równolegle do powyższej procedury, co pewien czas wszystkich pozostałych procesów swój bieżący numer epoki */ when do for all proces wysyła do do end for end when /* Po otrzymaniu wiadomości typu HEARTBEAT od procesu , proces sprawdza, czy proces ten znajduje się już w zbiorze . Jeżeli tak, to następuje sprawdzenie, czy przesłana wartośd numeru epoki jest większa niż obecnie przechowywana dla -tego procesu. Jeżeli jest większa, to następuje usunięcie danego elementu ze zbioru , a następnie jego ponowne dodanie z uaktualnioną wartością numeru epoki. Jeżeli zaś warunek pierwszy jest niespełniony, tzn. jeżeli nie ma w zbiorze takiego procesu, to jest on dodawany wraz z przesłaną wartością numeru epoki do zbioru */ when do if then if end if then 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. else end if end when /* Po każdym wznowieniu procesu, wczytany jest numer epoki za pomocą procedury . Wszystkie pozostałe zmienne, wchodzące w skład stanu procesu są inicjowane wartościami początkowymi. Następnie numer ten jest zwiększany o jeden, zapisany do pamięci dyskowej za pomocą procedury oraz rozesłany do wszystkich monitorów */ when do for all do end for end when Modele przetwarzania Złożenie różnych założeo, dotyczących procesów, rodzajów kanałów komunikacyjnych, czy też klas detektorów awarii jest równoznaczne ze zdefiniowaniem specyficznych modeli przetwarzania. Istnieje oczywiście bardzo wiele możliwych kombinacji przyjmowanych założeo, a stąd wiele modeli. W literaturze rozważane są na ogół następujące modele: model z jawnymi awariami (ang. fail-stop) Procesy wykonują deterministyczne algorytmy, chyba że zaprzestaną działania w wyniku awarii Kanały są niezawodne Dostępny jest doskonały detektor awarii Rozwiązywanie problemów w tym modelu jest stosunkowo łatwe model z ukrytymi awariami (ang. fail-silent) Procesy wykonują deterministyczne algorytmy, chyba że zaprzestaną działania w wyniku awarii Kanały są niezawodne Brak dostępu do doskonałego detektora awarii model z ostatecznie jawnymi awariami (ang. fail-noisy) Procesy wykonują deterministyczne algorytmy, chyba że zaprzestaną działania w wyniku awarii Kanały są niezawodne Dostępny jest ostatecznie doskonały detektor awarii lub detektor typu model ze wznowieniami po awariach (ang. fail-recovery) Procesy wykonują deterministyczne algorytmy, chyba że zaprzestaną działania w wyniku awarii Kanały mają własności kanałów wytrwałych (patrz: Kanały wytrwałe) Po awarii działanie procesu jest wznawiane model losowy, probabilistyczny (ang. randomized) Procesom udostępniona jest losowa wyrocznia, dzięki której mogą wybierad jedną z kilku możliwych ścieżek przetwarzania- w tym przypadku algorytmy są niedeterministyczne Wykład #12: Mechanizmy rozgłaszania niezawodnego Plan wykładu: Celem wykładu jest prezentacja zagadnieo związanych z implementacją niezawodnej komunikacji w zawodnym środowisku rozproszonym. a) Podstawowe rozgłaszanie niezawodne b) Zgodne rozgłaszanie niezawodne (algorytm pasywny lub aktywny) c) Jednolite rozgłaszanie niezawodne (algorytm z potwierdzeniami od wszystkich i od większości) d) Probabilistyczne rozgłaszanie niezawodne (algorytm pasywny lub aktywny) e) Zgodne rozgłaszanie niezawodne z przyczynowym uporządkowaniem wiadomości f) Zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości Rozgłaszanie niezawodne Definicja nieformalna Nieformalnie, rozgłaszanie to mechanizm komunikacyjny, za pomocą którego proces może wysład wiadomośd do grupy procesów. Mechanizmy rozgłaszania niezawodnego gwarantują pewne własności, pomimo występowania awarii. Gwarancje te tyczą się przede wszystkim zapewnienia dostarczenia wiadomości do adresatów, identyczności zbioru wiadomości dostarczanych do wszystkich procesów poprawnych, a także kolejności dostarczanych wiadomości. Mechanizmy niezawodnego rozgłaszania mają bardzo wiele zastosowao, stąd wynika ich duże znaczenie teoretyczne i praktyczne. Przykładowymi zastosowaniami mechanizmów niezawodnego rozgłaszania są: Systemy z wieloma uczestnikami (ang. muli-participant systems) W systemach tych działa wiele procesów, współuczestnicząc w skomplikowanych zadaniach. Przykładem są wszelkiego rodzaju wirtualne środowiska z wieloma użytkownikami (na przykład gry MMRPG- massive multiplayer role-playing game). Dostępnośd abstrakcyjnych operacji niezawodnego rozgłaszania jest przydatna dla twórców tego rodzaju systemów. Zwielokrotnianie (replikacja) Często stosowanym rozwiązaniem w celu zwiększenia odporności systemu na awarie lub zwiększenia jego efektywności, jest zwielokrotniania (replikacja) elementów. Pojawia się wówczas jednocześnie problem spójności replik. Konstrukcja protokołów, zapewniających spójnośd replik jest znacząco uproszczone w wypadku możliwości skorzystania z mechanizmów niezawodnego rozgłaszania. Klasy mechanizmów rozgłaszania niezawodnego Podstawowe rozgłaszanie niezawodne (ang. best-effort broadcast) Odpowiedzialnośd za dostarczenie wiadomości spoczywa na nadawcy, o którym zakłada się, że jest poprawny. Zgodne rozgłaszanie niezawodne (ang. regular reliable broadcast) System gwarantuje identycznośd zbioru wiadomości dostarczonych przez wszystkie poprawne procesy. Pasywny algorytm zgodnego rozgłaszania niezawodnego (ang. lazy reliable broadcast) Aktywny algorytm zgodnego rozgłaszania niezawodnego (ang. eager reliable broadcast) Jednolite rozgłaszanie niezawodne (ang. uniform reliable broadcast) System, poza identycznością zbioru wiadomości dostarczonych przez wszystkie poprawne procesy, gwarantuje, że wiadomośd dostarczona przez jeden proces (byd może niepoprawny) zostanie dostarczona przez wszystkie poprawne procesy. Algorytm jednolitego rozgłaszania niezawodnego z potwierdzeniami od wszystkich (ang. all-ack uniform reliable broadcast) Algorytm jednolitego rozgłaszania niezawodnego z potwierdzeniami od większości (ang. majority-ack uniform reliable broadcast) Probabilistyczne rozgłaszanie niezawodne (ang. probabilistic reliable broadcast) Gwarancje, dotyczące dostarczenia wiadomości, są zachowane jedynie z pewnym prawdopodobieostwem. Zgodne rozgłaszanie niezawodne z przyczynowym uporządkowaniem wiadomości (ang. causal reliable broadcast) Gwarantowane jest dodatkowo, że wiadomości przyczynowo zależne będą dostarczone do odbioru zgodnie z relacją poprzedzania. Zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości (ang. total order reliable broadcast) Zapewniona jest natomiast taka sama kolejnośd dostarczania wiadomości do wszystkich poprawnych procesów. Warto zaznaczyd, że własności uporządkowania przyczynowego i globalnego są niezależne. Oznacza to, że uporządkowanie przyczynowe nie implikuje i nie jest implikowane przez uporządkowanie globalne. Nie są to oczywiście jedyne możliwe abstrakcyjne operacje rozgłaszania. Wspomnied warto jeszcze chodby o quasi-niezawodnym rozgłaszaniu. Podstawowe rozgłaszanie niezawodne Specyfikacja Najprostszym rodzajem rozgłaszania jest podstawowe rozgłaszanie niezawodne (ang. best-effort broadcast). Ten podstawowy mechanizm (abstrakcja) komunikacyjny składa odpowiedzialnośd za niezawodnośd na nadawcę. Nie zapewnia przy tym dostarczenia wiadomości do wszystkich procesów, jeżeli nadawca ulegnie awarii. Mechanizm podstawowego rozgłaszania niezawodnego ma następujące własności: Ważnośd (ang. best-effort validity) Jeżeli procesy oraz są poprawne, to każda wiadomośd rozgłaszana przez jest ostatecznie dostarczona do . Ogólnie, jest to własnośd żywotności. Zauważmy, że mimo tej własności zbiory wiadomości dostarczanych przez różne poprawne procesy mogą się różnid. Brak powielania (ang. no duplication) Jeżeli wiadomośd jest dostarczona, to jest dostarczona co najwyżej raz. Jest to ważna gwarancja: jej sens łatwo wyjaśnid za pomocą przykładu, odwołującego się do operacji bankowych. Użytkownik, składający zlecenie przelewu, chciałby mied pewnośd, że zostanie ono wykonane jedynie raz. Brak samogeneracji (ang. no creation) Oznacza, że jeżeli wiadomośd jest dostarczona do procesu , to została ona wcześniej rozgłoszona przez jakiś proces . Innymi słowy, własnośd ta gwarantuje, że kanały nie generują samorzutnie wiadomości. Dwie ostatnie z powyższych cech są czasami w literaturze określane jako integralnośd lub zwartośd (ang. integrity) i są one własnościami bezpieczeostwa. Operacje komunikacyjne Operację podstawowego rozgłaszania niezawodnego wiadomości przez proces do zbioru procesów oznaczad będziemy przez . Zdarzenie, odpowiadające tej operacji, zapisywad będziemy jako . Analogicznie, przez oznaczad będziemy operację, uaktywniającą zdarzenie wiadomośd wysłaną przez proces do procesu aplikacyjnego i przekazującą w efekcie . Algorytm Algorytm podstawowego rozgłaszania niezawodnego zakłada: dostępnośd mechanizmu kanałów niezawodnych (patrz: Wykład 11: Kanały niezawodne) deterministyczne i poprawne działanie procesów do ewentualnego załamania nieodwoływanie się do detektorów awarii, zatem przyjęty jest model przetwarzania z ukrytymi awariami (patrz: Wykład 11: Modele przetwarzania). W rozważanym algorytmie wiadomości aplikacyjne umieszczone są w pakietach typu PACKET. Pakiety te są przesyłane między monitorami. Z odebranych pakietów monitory wyodrębniają wiadomości aplikacyjne i przekazują je procesom aplikacyjnym. type PACKET extends FRAME is record of : MESSAGE end record : MESSAGE : PACKET 1. 2. 3. /* Przypomnijmy, że operacja jest mechanizm kanałów niezawodnych. Operacja ta gwarantuje zatem, że każda wiadomośd wysłana przez poprawnie działający proces, ostatecznie dotrze do adresata i umożliwi wówczas zajście zdarzenia oraz wykonanie dalej operacji */ when do for all do 4. 5. 6. // mechanizm kanałów niezawodnych end for end when /* Warto przypomnied, że w algorytmie, implementującym kanały niezawodne, monitor, otrzymując dowolną wiadomośd, dostarcza ją tylko wtedy, gdy nie była ona już wcześniej dostarczona */ when do 7. 8. 9. 10. end when Złożoność Niech topologią rozważanego przetwarzania rozproszonego jest graf pełny. Przy tym założeniu, rozgłaszanie wiadomości wymaga jednego kroku algorytmu, związanego z wysłaniem wiadomości. Ponieważ algorytm, realizujący podstawowe rozgłaszanie niezawodne, wymaga, by nadawca wysłał wiadomośd do wszystkich procesów (łącznie z samym sobą), jego złożonośd komunikacyjna , gdzie jest liczbą procesów przetwarzania rozproszonego. Złożonośd czasowa wynosi . Przykład: W przedstawionym wyżej przykładzie proces chce rozesład wiadomośd . Podstawowe rozgłaszanie niezawodne polega na wysłaniu tej wiadomości oddzielnie do każdego procesu, należącego do zbioru procesów , korzystając oczywiście z niezawodnych kanałów. Przypomnijmy, że niezawodne kanały autonomicznie ponawiają transmisję, pod warunkiem jednak, że proces nadawcy działa poprawnie. Zgodne rozgłaszanie niezawodne Specyfikacja Mechanizm zgodnego rozgłaszania niezawodnego (ang. regular reliable broadcast) zapewnia dostarczenie wiadomości nawet w przypadku, gdy nadawca ulegnie awarii, jeżeli tylko jakikolwiek proces poprawny odebrał rozgłaszaną wiadomośd. Mechanizm ten ma z definicji następujące własności: Ważnośd (ang. validity) Jeżeli proces jest poprawny, to każda wiadomośd rozgłaszana przez ten proces jest ostatecznie dostarczona do . Warto zauważyd różnicę tej własności w porównaniu z własnością ważności dla podstawowego rozgłaszania niezawodnego (patrz: Podstawowe rozgłaszanie niezawodne) Brak powielania (ang. no duplication) Oznacza, że jeżeli wiadomośd jest dostarczona, to jest dostarczona co najwyżej raz. Brak samogeneracji (ang. no creation) Oznacza, że jeżeli jakaś wiadomośd jest dostarczona do procesu , to została ona wcześniej rozgłoszona przez jakiś proces (kanały nie tworzą wiadomości samorzutnie). Zgodnośd (ang. agreement) Oznacza, że jeżeli jakaś wiadomośd została odebrana przez pewien poprawny proces , to ostatecznie wszystkie poprawne procesy odbiorą tę wiadomośd. Własnośd ta określa podstawową różnicę w stosunku do podstawowego rozgłaszania niezawodnego, gdyż zapewnia, że wiadomości mogą zostad dostarczone nawet w przypadku, gdy ich nadawca uległ awarii. Równocześnie, własnośd ta w połączeniu z własnością ważności oznacza, że wiadomości rozgłaszane przez poprawny proces ostatecznie zostaną odebrane przez wszystkie poprawne procesy. Zgodne rozgłaszanie niezawodne często określane jest jako niepodzielne lub atomowe (ang. atomic broadcast), gdyż gwarantuje, że albo wszystkie poprawne procesy odbiorą rozgłaszaną wiadomośc, albo żaden z nich. Operacje komunikacyjne Operację rozgłaszania, gwarantującą własności zgodnego rozgłaszania niezawodnego oznaczymy przez . Zdarzenie, odpowiadające tej operacji, zapisywad będziemy jako . Analogicznie, przez oznaczad będziemy operację, uaktywniającą zdarzenie przez proces do procesu aplikacyjnego i przekazującą w efekcie wiadomośd wysłaną . Algorytm pasywny Pasywny algorytm zgodnego rozgłaszania niezawodnego (ang. lazy reliable broadcast) zakłada, że dostępne są następujące mechanizmy: doskonały detektor awarii (patrz: Wykład 11: Doskonały detektor awarii) podstawowe rozgłaszanie niezawodne algorytm przeznaczony jest zatem dla modelu przetwarzania z jawnymi awariami (patrz: Wykład 11: Modele przetwarzania) Zagwarantowanie własności zgodności uzyskuje się dzięki retransmisjom wiadomości, dokonywanym w chwili wykrycia awarii nadawcy przez doskonały detektor awarii. W rozważanym algorytmie wiadomości aplikacyjne są umieszczane w pakietach typu PACKET, zawierających dodatkowo identyfikator pierwotnego (oryginalnego) nadawcy wiadomości. Algorytm korzysta również ze zmiennych m.in. - zawiera identyfikatory procesów uznawanych za poprawne przez proces zbiór , złożony z wiadomości, które już zostały odebrane przez tablica zawiera zbiory, których elementami są pary, składające się z identyfikatora pierwotnego nadawcy wiadomości i samej wiadomości aplikacyjnej. Odpowiednio -ty element tej tablicy to wiadomości przekazane przez monitor . oraz procesu są używane lokalnie w programie obsługi zdarzenia wykrycia awarii type PACKET extends FRAME is record of : PROCESS_ID : MESSAGE end record : MESSAGE : PACKET : set of PROCESS_ID : set of MESSAGE : array of set of pair of : PROCESS_ID : MESSAGE 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. /* Monitor procesu , chcącego rozesład wiadomośd , umieszcza ją w pakiecie, zawierającym dodatkowo pole , oznaczającego pierwotnego nadawcę wiadomości i rozsyła otrzymany pakiet za pomocą podstawowego rozgłaszania niezawodnego. Przypomnijmy, że oznacza zbiór monitorów wszystkich procesów, tworzących zbiór */ when do end when /* Odebranie pakietu przez monitor od monitora powoduje sprawdzenie, czy wiadomośd aplikacyjna zawarta w pakiecie nie była już wcześniej dostarczona do . Jeżeli nie, to wiadomośd ta zostaje dostarczona. Następnie wiadomośd zostaje dodana do zbioru, będącego -tym elementem tablicy . Jeżeli proces jest niepoprawny, to monitor rozsyła ponownie otrzymany pakiet za pomocą podstawowego rozgłaszania niezawodnego */ when do if then if end if end if end when then 17. 18. 19. 20. 21. 22. 23. 24. /* W przypadku wykrycia awarii procesu przez doskonały detector awarii P proces ten usuwany jest ze zbioru oraz ponownie są rozsyłane wszelkie pakiety kiedykolwiek otrzymane od tego procesu */ when do for all do end for end when Złożoność Załóżmy, że topologią przetwarzania rozproszonego jest graf pełny. Jeżeli początkowo nadawca wiadomości nie ulega awarii (przypadek optymistyczny), pasywny algorytm rozgłaszania niezawodnego kooczy się w jednym kroku po wysłaniu komunikatów. Stąd złożonośd czasowa dla przypadku optymistycznego wynosi , zaś złożonośd komunikacyjna- . W przypadku, w którym kolejno ulegają awarii wszystkie procesy (przypadek pesymistyczny), odbierające tę wiadomośd, i wiadomośd jest ostatecznie odebrana tylko przez jedyny poprawny proces, złożonośd czasowa wynosi . Ponieważ w każdym kroku komunikaty wysłane są do wszystkich procesów, a każdy z nich retransmituje każdą wiadomośd co najwyżej raz, złożonośd komunikacyjna wynosi . Algorytm aktywny Zgodne rozgłaszanie niezawodne można także zrealizowad za pomocą algorytmu pasywnego (ang. eager reliable broadcast), który ma następujące cechy: nie wymaga użycia doskonałego detektora awarii zakłada istnienie mechanizmu podstawowego rozgłaszania niezawodnego Algorytm został przeznaczony zatem dla modelu ukrytych awarii (patrz: Wykład 11: Modele przetwarzania) Podstawowa różnica w stosunku do poprzedniego algorytmu polega na retransmisji wiadomości przez każdy proces natychmiast po jej dostarczeniu Algorytm używa tylko jednego typu wiadomości- PACKET- o strukturze identycznej, jak w poprzedniej realizacji rozgłaszania niezawodnego. Również znaczenie stosowanych zmiennych nie różni się od analogicznych zmiennych w algorytmie pasywnego rozgłaszania niezawodnego. type PACKET extends FRAME is record of : PROCESS_ID : MESSAGE end record : MESSAGE : PACKET : set of MESSAGE 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. /* W porównaniu z algorytmem pasywnym, rozesłanie wiadomości aplikacyjnej różni się tylko natychmiastowym dostarczeniem jej do lokalnego procesu. Rozgłaszanie rozsyła wiadomości do wszystkich procesów łącznie z nadawcą */ when do end when /* Podczas odbioru pakietu monitor sprawdza, czy zawarta w pakiecie wiadomośd nie została już wcześniej dostarczona. Jeżeli nie, to dostarcza tę wiadomośd do procesu aplikacyjnego i zapamiętuje ten fakt, dodając wiadomośd do zbioru . Następnie, monitor rozsyła otrzymany pakiet za pomocą podstawowego rozgłaszania niezawodnego do wszystkich monitorów ze zbioru */ when do if then end if end when Przykład #1: W pokazanym powyżej przykładzie widad zasadniczą różnicę w stosunku do wcześniej pokazywanego podstawowego rozgłaszania niezawodnego. Jeżeli rozgłosił wiadomośd , to każdy otrzymujący ją proces, zarówno , jak i , natychmiast rozsyłają ją do wszystkich pozostałych procesów. Widad, że nawet gdyby proces uległ awarii przed wysłaniem wiadomości do innych procesów niż , to poprawnośd procesu zapewniłaby ostateczne dostarczenie tej wiadomości do wszystkich innych poprawnych procesów. Przykład #2: W tym przykładzie, procesy oraz ulegają awarii zanim zdążą rozesład wiadomośd do wszystkich procesów. Nie narusza to poprawności algorytmu, gdyż wiadomośd nie została odebrana przez żaden poprawny proces, a więc spełniony jest warunek zgodności. Złożoność Przyjmijmy, że topologia przetwarzania rozproszonego jest reprezentowana przez graf pełny. Jeżeli początkowy nadawca wiadomości nie ulega awarii (przypadek optymistyczny), to aktywny algorytm zgodnego rozgłaszania niezawodnego kooczy się w pojedynczym kroku, zatem ma złożonośd czasową równą , zaś złożonośd komunikacyjna wynosi . Jeżeli wszystkie procesy kolejno ulegają awarii (przypadek pesymistyczny), złożonośd czasowa wynosi . Każdy z procesów, ulegających awarii może wysład wiadomości, ale byd może tylko jedna z nich dotrze do adresata. Złożonośd komunikacyjna jest równa, podobnie jak w przypadku optymistycznym, . Jednolite rozgłaszanie niezawodne Specyfikacja Kolejną z omawianych abstrakcji komunikacyjnych rozgłaszania niezawodnego jest jednolite rozgłaszanie niezawodne (ang. uniform reliable broadcast). Główną różnicą w stosunku do mechanizmów omawianych wcześniej, jest wymóg, by zbiór wiadomości dostarczonych przez procesy niepoprawne zawsze był podzbiorem zbioru wiadomości odebranych przez procesy poprawne. Mechanizm ten ma z definicji następujące własności: Ważnośd (ang. validity) Jeżeli proces jest poprawny, to każda wiadomośd rozgłaszana przez ten proces jest ostatecznie dostarczona do . Własnośd ta jest równoważna jej odpowiednikowi w zgodnym rozgłaszaniu niezawodnym. Brak powielania (ang. no duplication) Jeżeli wiadomośd jest dostarczona, to jest dostarczona co najwyżej raz. Brak samogeneracji (ang. no creation) Jeżeli jakaś wiadomośd jest dostarczona do procesu , to została ona wcześniej rozgłoszona przez jakiś proces . Innymi słowy, kanały nie mogą samorzutnie tworzyd wiadomości. Jednolita zgodnośd (ang. uniform agrement) Jeżeli jakaś wiadomośd została odebrana przez pewien proces (poprawny, bądź niepoprawny), to ostatecznie wszystkie poprawne procesy odbiorą tę wiadomośd. Własnośd ta jest szczególnie ważna, jeżeli proces dokonuje interakcji ze światem zewnętrznym, zwłaszcza, jeżeli efekty tej interakcji są nieodwracalne (np. wydruk dokumentu, przelew bankowy itd.) Operacje komunikacyjne Operację jednolitego rozgłaszania niezawodnego wiadomości przez do zbioru procesów oznaczad będziemy przez . Zdarzenie, odpowiadające tej operacji, zapisywad będziemy jako . Analogicznie, przez oznaczad będziemy operację, uaktywniającą zdarzenie wysłaną przez proces do procesu aplikacyjnego i przekazującą w efekcie wiadomośd . Algorytm z potwierdzeniami od wszystkich Algorytm jednolitego rozgłaszania niezawodnego z potwierdzeniami od wszystkich (ang. all-ack uniform reliable broadcast) ma następujące cechy: Realizuje mechanizm jednolitego rozgłaszania niezawodnego w modelu jawnych awarii (patrz: Wykład 11: Modele przetwarzania) Wykorzystuje on podstawowe rozgłaszanie niezawodne Zakłada istnienie niezawodnych kanałów komunikacyjnych (patrz: Wykład 11: Kanały niezawodne) Dostępny jest doskonały detektor awarii (patrz: Wykład 11: Klasyfikacja detektorów) W algorytmie tym wiadomośd jest odbierana przez proces tylko wtedy, gdy proces ten zaobserwował retransmisję tej wiadomości przez wszystkie poprawne procesy. Większośd zmiennych używanych przez prezentowany niżej algorytm ma znaczenie identyczne, jak w przypadku pasywnego algorytmu zgodnego rozgłaszania niezawodnego. Dwie nowe zmienne to: , zawierający pakiety z wiadomościami, które oczekują na dostarczenie , zawierający pary: pakiet, zbiór identyfikatorów procesów Dalej omawiana funkcja używa lokalnych zmiennych , będącej zbiorem identyfikatorów procesów, typu PACKET oraz zmiennej typu PROCESS_ID. Zmienne typu PACKET używana jest lokalnie podczas próby odnalezienia pakietów, które mogą zostad dostarczone do procesu aplikacyjnego type PACKET extends FRAME is record of : PROCESS_ID : MESSAGE end record : MESSAGE : PACKET : set of PROCESS_ID : set of MESSAGE : set of PACKET : set of pair of : set of PROCESS_ID : PACKET : PROCESS_ID : PACKET 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. /* Funkcja zwraca identyfikatory wszystkich procesów, które dokonały już retransmisji pakietu */ function do for all do end for return end function /* Wysyłając wiadomośd , monitor umieszcza ją w pakiecie , który jest dodany do zbioru , po czym zostaje rozgłoszony za pomocą podstawowego rozgłaszania niezawodnego */ when do end when /* Obsługa awarii procesu odbywa się w tradycyjny sposób, jako efekt działania detektora awarii */ when do end when /* Odbierane pakiety monitor dodaje do zbioru wraz z informacją o identyfikatorze nadawcy. Nadawca pakietu może się różnid od pierwotnego nadawcy, będąc jedynie pośrednikiem w przekazaniu wiadomości. Jeżeli dostarczony pakiet nie zawiera się jeszcze w zbiorze , to jest do niego dodawany, a następnie rozsyłany za pomocą podstawowego rozgłaszania niezawodnego */ when do if then end if end when /* Wiadomośd jest dostarczana do procesu aplikacyjnego dopiero wtedy, gdy monitor otrzyma tę wiadomośd w wyniku retransmisji od wszystkich poprawnych procesów */ when do 26. 27. end when Przykład #1: W podanym przykładzie wiadomośd jest rozgłaszana przez proces ( ), który następnie ulega awarii. Dla zwiększenia czytelności, pominięto strzałki, oznaczająec fakt wysłania przez proces wiadomości do samego siebie oraz od procesów i . W nawiasach klamrowych podano zawartośd zbioru procesów. Zauważmy, że wiadomośd dotarła jedynie do monitora , który przesłał ją dalej do pozostałych procesów, ale nie dostarczył do . Po otrzymaniu wiadomości od , monitor rozsyła ją ponownie. Wiadomośd ta dociera do , w wyniku czego do zbioru dodawany jest proces . Monitor postępuje identycznie: odbierając wiadomośd od , rozsyła ją, wstrzymując jednak dostarczenie do procesu aplikacyjnego . Gdy wiadomośd dotarła do monitora od i , zbiór został powiększony o identyfikatory i . W tym momencie monitor może już dostarczyd wiadomośd do procesu aplikacyjnego , gdyż wie, że dotarła do monitorów wszystkich poprawnych procesów. Analogicznie postępują monitory i . Algorytm z potwierdzeniami od większości Rozważany algorytm zakłada: dostępnośd podstawowego rozgłaszania niezawodnego nie jest wymagany detektor awarii, zatem przyjęty jest model przetwarzania z ukrytymi awariami (patrz: Wykład 11: Modele przetwarzania). Wymagane jest jednak, by większośd procesów nie ulegała awarii Przy powyższych założeniach jednolite rozgłaszanie niezawodne można zaimplementowad za pomocą algorytmu z potwierdzeniami od większości. Różni się on od poprzednio omawianego tylko tym, że nie jest używany doskonały detektor awarii, a także warunkiem dostarczenia wiadomości sformułowanym w wierszu 24. algorytmu z potwierdzeniami od wszystkich. Pozostałe kroki są identyczne. Warunek, odróżniający algorytm od poprzednio przedstawionego, oznacza tutaj oczekiwanie na nadejście wiadomości od większości procesów, w tym od co najmniej jednego poprawnego. 1. … 2. when 3. 4. 5. end when do Złożoność Zarówno w przypadku algorytmu z potwierdzeniami od wszystkich, jak i od większości ich złożoności są identyczne. Jak zwykle, rozważając złożonośd czasową i komunikacyjną przyjmiemy, że topologia przetwarzania rozproszonego ma postad grafu pełnego. Jeżeli początkowy nadawca wiadomości nie ulega awarii (przypadek optymistyczny), to algorytm jednolitego rozgłaszania niezawodnego z potwierdzeniami od wszystkich kooczy się w ciągu kroków, po wysłaniu komunikatów przez oryginalnego nadawcę i ich retransmisję przez wszystkie pozostałych procesów, z których każdy wysyła komunikatów. Złożonośd czasowa wynosi więc , a złożonośd komunikacyjna- . W przypadku pesymistycznym, w którym kolejno ulegają awarii wszystkie procesy, złożonośd czasowa wynosi n+1, a komunikacyjna- . Probabilistyczny algorytm rozgłaszania niezawodnego Problem implozji potwierdzeń Jak widad z wcześniej przedstawionych algorytmów, implementacja niezawodnego rozgłaszania w zawodnym środowisku, w którym zarówno łącza, jak i procesy mogą ulegad awariom, może wymagad zbierania potwierdzeo od wielu procesów. Staje się to problematyczne w przypadku, gdy liczba procesów, biorących udział w przetwarzaniu rozproszonym rośnie. Zadanie zebrania potwierdzeo od dużej grupy procesów może w efekcie zajmowad poważną częśd zasobów (pamięci, czasu procesora) węzłów systemu rozproszonego. Tym samym, im więcej uczestników rozgłaszania, tym więcej potwierdzeo do zebrania- problem implozji potwierdzeo (ang. ack implosion problem). Problem implozji potwierdzeo można rozwiązad za pomocą grupowania procesów w hierarchiczne struktury, na przykład drzewa binarne. Dzięki temu obciążenie każdego procesu ulega zmniejszeniu, kosztem jednak zwiększenia czasu potrzebnego na zebranie wszystkich potwierdzeo. Niestety, w przypadku awarii któregoś z procesów, pojawia się potrzeba często czasochłonnej rekonfiguracji używanych struktur. Specyfikacja Problem implozji potwierdzeo wymusił poszukiwanie rozwiązao lepiej skalowalnych niż rozważane poprzednio. Interesującą propozycją jest podejście probabilistyczne, oparte na przykładach zaczerpniętych z rzeczywistości- takich jak szerzenie się chorób zakaźnych albo rozpowszechnianie plotek. Stąd tego typu mechanizmy (algorytmy) nazwany algorytmami epidemicznymi (ang. epidemic), czy też plotkarskimi (ang. gossiping, rumor mongering). Korzystają one z abstrakcji komunikacyjnej określanej jako probabilistyczne rozgłaszanie niezawodne (ang. probabilistic reliable broadcast). Mechanizmy probabilistycznego rozgłaszania niezawodnego charakteryzują się następującymi własnościami: Ważnośd (ang. probabilistic validity) Określone jest prawdopodobieostwo takie, że jeżeli procesy oraz są poprawne, to każda wiadomośd rozgłaszana przez proces jest ostatecznie dostarczona do z tym prawdopodobieostwem. Dopuszczalne, chod oczywiście niepożądane, są zatem sytuacje, w których wiadomośd rozgłaszana nie jest dostarczona do wszystkich poprawnych procesów, nawet jeżeli nadawca wiadomości był poprawny. Widad tutaj podobieostwo, do podstawowego rozgłaszania niezawodnego. W pewnym sensie podstawowe rozgłaszanie niezawodne również można by określid mianem probabilistycznego. W przypadku probabilistycznego rozgłaszania niezawodnego prawdopodobieostwo nie jest jednak bezpośrednio związane z możliwością awarii procesu. Brak powielania (ang. no duplication) Jeżeli wiadomośd jest dostarczona, to jest dostarczona co najwyżej raz. Brak samogeneracji (ang. no creation) Jeżeli jakaś wiadomośd jest dostarczona do procesu , to została ona wcześniej rozgłoszona przez jakiś proces . Operacje komunikacyjne Operację probabilistycznego rozgłaszania niezawodnego wiadomości przez do zbioru procesów oznaczad będziemy przez . Zdarzenie, odpowiadające tej operacji, zapisywad będziemy jako . Analogicznie, przez oznaczad będziemy operację, uaktywniającą zdarzenie wysłaną przez proces do procesu aplikacyjnego i przekazującą w efekcie wiadomośd . Idea algorytmu plotkowania Ogólna idea algorytmu, wykorzystującego mechanizm plotkowania przedstawiona jest na rysunku. Każdy proces wybiera losowo procesów, do których następnie wysyła wiadomośd. Identycznie postępuje każdy proces po odebraniu wiadomości. Im większe , tym więcej wymienianych wiadomości, ale zarazem mniejsza liczba rund potrzebna, by wiadomośd dotarła do wszystkich poprawnych procesów z danym prawdopodobieostwem. Algorytm aktywny W przeciwieostwie do dotychczas przedstawianych algorytmów, aktywny algorytm niezawodnego rozgłaszania probabilistycznego (ang. eager probabilistic reliable broadcast) nie posiada żadnych szczególnych wymagao. W istocie, każde rzeczywiste użyteczne łącze komunikacyjne powinno spełniad warunki, pozwalające uznad je za kanał rzetelny (patrz: Wykład 11: Kanały rzetelne). Algorytm składa się z co najwyżej rund, przy czym w każdej rundzie rozsyłane jest co najwyżej wiadomości, gdzie oraz są liczbami dobranymi przez użytkownika. W zapisie algorytmu będą one reprezentowane odpowiednio przez zmienne oraz . Struktura wiadomości PACKET używana przez aktywne probabilistyczne rozgłaszanie niezawodne różni się od dotychczasowych dodatkowym polem , zawierającym licznik pozostałego czasu życia pakietu. Znaczenie niektórych zmiennych jest następujące: oznacza, ilu adresatów ma zostad wylosowanych przy rozsyłaniu wiadomości. Im większa jej wartośd, tym większe obciążenie procesów i większa liczba nadmiarowo przesyłanych wiadomości- ale zarazem, tym większe prawdopodobieostwo dostarczenia wiadomości do wszystkich procesów w określonej maksymalnej liczbie rund (kroków). oznacza czas życia wiadomości wyróżniony maksymalną liczbą kolejnych jej przesłao. Zbiór używany lokalnie w procedurze , oznaczad będzie zbiór procesów, które zostały wybrane jako adresaci rozsyłanych wiadomości. Zbiór jest używany lokalnie w przedstawionej dalej funkcji type PACKET extends FRAME is record of : PROCESS_ID : INTEGER : MESSAGE end record : MESSAGE : PACKET : INTEGER : INTEGER : set of PROCESS_ID : set of MESSAGE : set of PROCESS_ID 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. /* W procedurze najpierw dokonywany jest wybór adresatów rozsyłanych wiadomości. Są oni wybierani losowo ze zbioru wszystkich procesów. Używana jest tu funkcja , która dokonuje losowego wyboru jednego elementu z podanego zbioru. Następnie pakiet jest wysyłany do wszystkich wybranych procesów z użyciem mechanizmu kanałów rzetelnych */ procedure while do if end if end while for all then do end for end procedure /* Kiedy proces aplikacyjny chce rozgłosid wiadomośd , monitor wypełnia pole wysyłanego pakietu, wstawiając tam identyfikator procesu , ustawia wartośd pola na maksymalny czas życia i wysyła pakiet za pomocą procedury */ when do end when /* Każdy monitor, odbierając wiadomośd sprawdza, czy nie została ona przedtem dostarczona. Jeżeli nie, to wiadomośd jest dostarczana. Równocześnie, jeżeli pole 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. nadesłanego pakietu jest większe od zera, to monitor dekrementuje to pole i rozsyła ten pakiet dalej za pomocą procedury */ when do if end if if then then end if end when Algorytm pasywny Wadą rozgłaszania opartego o mechanizm plotkowania jest duża liczba potencjalnie nadmiarowych wiadomości. Sposobem, pozwalającym na ominięcie tego problemu i zmniejszenie zużycia zasobów systemu jest wykorzystanie pewnego istniejącego, zawodnego mechanizmu rozgłaszania. Na początku wiadomośd jest rozsyłana za pomocą dowolnej (byd może zawodnej) operacji rozgłaszania, a następnie dodatkowo używany jest mechanizm plotkowania za pomocą zawodnych operacji komunikacyjnych łączy rzetelnych w celu retransmisji zagubionych wiadomości. Retransmisje takie mogłyby byd oczywiście wykonywane jedynie przez oryginalnego nadawcę. Aby jednak zwiększyd prawdopodobieostwo dostarczenia zagubionych wiadomości, przyjmuje się, że retransmisji mogą byd wykonywane także przez inne procesy. Rezultatem tego jest wymóg czasowego przechowywania przez każdy proces pewnej liczby odebranych wiadomości (proces, który otrzymuje wiadomośd, z pewnym prawdopodobieostwem, zapamiętuje ją w celu ewentualnej późniejszej retransmisji). Fakt zagubienia wiadomości (dopuszczalny z powodu przyjętej zawodności mechanizmu rozgłaszania) można wykryd za pomocą utrzymywanych przez każdy proces liczników wysłanych wiadomości. Liczniki te są dołączane do każdej wiadomości jako jej numer sekwencyjny. Proces podejrzewa zagubienie wiadomości jeżeli numer sekwencyjny aktualnie dostarczonej wiadomości od procesu różni się o więcej niż jeden od numeru sekwencyjnego wiadomości uprzednio otrzymanej od . W takim wypadku proces może rozgłosid prośbę o nadesłanie brakujących wiadomości za pomocą mechanizmu plotkowania. Proces, odbierający prośbę o retransmisję wiadomości spełnia ją, jeżeli wiadomośd ta znajduje się w zbiorze wiadomości przechowywanych przez ten proces. W przeciwnym wypadku używa mechanizmu plotkowania, by przesład tę prośbę do innych procesów. Pasywny algorytm probabilistycznego rozgłaszania niezawodnego (ang. lazy probabilistic broadcast) realizuje przedstawioną wyżej ideę. Wymagania pasywnego algorytmu probabilistycznego rozgłaszania niezawodnego wynikają z podziału rozgłaszania na dwie fazy. Na początku wiadomości jest rozsyłana za pomocą dowolnej (byd może zawodnej) operacji rozgłaszania, a następnie dodatkowo używany jest mechanizm plotkowania za pomocą zawodnych operacji komunikacyjnych kanałów rzetelnych w celu retransmisji zagubionych wiadomości. Ponieważ na operacje rozgłaszania nie są narzucone żadne wymagania, będziemy je oznaczad przez , a odpowiadające jej zdarzenie wysłania . Analogicznie, zdarzenie odebrania wiadomości oznaczad będziemy przez . Mechanizmowi temu może odpowiadad pewien dowolny mechanizm rozgłaszania oparty o rzetelne kanały komunikacyjne. Algorytm używa trzech typów wiadomości. Wiadomości aplikacyjne są przesyłane za pomocą wiadomości typu PACKET, które poza polem , określającym identyfikator pierwotnego (oryginalnego) nadawcy komunikatów, zawierają też numer sekwencyjny wiadomości w polu . Typ REQUEST zawiera wszystkie pola takie same jak PACKET (dziedziczy po strukturze PACKET) oraz dodatkowo posiada pole , określające maksymalny czas życia wiadomości. Wreszcie typ ANSWER służy do dostarczania brakujących wiadomości. Znaczenie niektórych wiadomości jest następujące: przechowuje ostatni numer sekwencyjny wysyłanej wiadomości. (ang. store threshold) jest parametrem, określającym prawdopodobieostwo zapamiętania otrzymanej wiadomości (w celu jej ewentualnej retransmisji). Zbiór zawiera pakiety przechowywane w celu ewentualnej retransmisji. Pakiety te powinny byd po pewnym czasie usunięte z tego zbioru, co zostało pominięte dla prostoty prezentacji. Zbiór zawiera pakiety otrzymane, których wiadomości aplikacyjne jeszcze nie zostały dostarczone do procesów aplikacyjnych. Tablica zawiera numery sekwencyjne ostatnio dostarczonych wiadomości tak, że -ty element określa numer sekwencyjny ostatnio dostarczonej wiadomości od . Zmienna , typu PACKET, jest używana lokalnie w funkcji . type PACKET extends FRAME is record of : PROCESS_ID : INTEGER : MESSAGE end record type REQUEST extends PACKET is record of : INTEGER end record type ANSWER extends PACKET : MESSAGE : PACKET : REQUEST : ANSWER : INTEGER : INTEGER : INTEGER : INTEGER : array of INTEGER : set of PROCESS_ID : set of PACKET : set of PACKET : PACKET : set of PROCESS_ID : INTEGER : INTEGER 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. /* W procedurze najpierw dokonywany jest wybór adresatów rozsyłanych wiadomości. Są oni wybierani losowo ze zbioru wszystkich procesów. Używana jest tu funkcja , która dokonuje losowego wyboru jednego elementu z podanego zbioru. Następnie pakiet jest wysyłany do wszystkich wybranych procesów z użyciem mechanizmu kanałów rzetelnych. Procedura ta jest identyczna jak w poprzednim algorytmie */ procedure while do if end if end while for all then do end for end procedure /* Procedura przegląda zbiór sprawdzając, czy może dostarczyd do kolejną wiadomośd wysłaną pierwotnie przez proces . Warunkiem dostarczenia jest, by pakiet ze zbioru , pochodzący od posiadał numer sekwencyjny o jeden większy od numeru sekwencyjnego ostatnio dostarczonej wiadomości od . Jeżeli dostarczenie jest możliwe, to odpowiednio uaktualniona jest tablica oraz zmienna . Warto zaznaczyd, że dostarczenie jednej wiadomości może pozwolid do dostarczenia kolejnej */ procedure while do end while end procedure /* Kiedy proces aplikacyjny chce rozgłosid wiadomośd , monitor zwiększa licznik wysłanych wiadomości i rozsyła następnie pakiet za pomocą zawodnej operacji rozgłaszania */ 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. when do end when /* Monitor , odbierając pakiet, po pierwsze z pewnym prawdopodobieostwem zapamiętuje go w zmiennej , umożliwiając tym samym późniejszą jego retransmisję. Następnie monitor sprawdza, czy numer sekwencyjny pakietu jest równy numerowi następnego oczekiwanego pakietu od . Jeżeli tak, to dostarcza wiadomośd do procesu aplikacyjnego . W przeciwnym wypadku, wstawia pakiet do zbioru i, używając procedury , wysyła prośbę do wszystkich procesów o przysłanie mu brakujących pakietów. Istnieje pewne prawdopodobieostwo, że żaden z procesów, do których dotrą prośby, nie posiada tego pakietu, gdyż został zagubiony w czasie rozgłaszania i nie dotarł do żadnego monitora, lub prośby o retransmisję nie dotarły do właściwych monitorów. W takim wypadku, po jakimś czasie monitor zwiększa numer sekwencyjny następnej oczekiwanej wiadomości od , akceptując utratę jednej wiadomości (dla uproszczenia prezentacji, ta funkcjonalnośd została tu pominięta). Niezdefiniowana funkcja użyta w zapisie algorytmu oznacza funkcję, zwracającą losową liczbę z określonego przedziału liczb naturalnych */ when do if then end if if then else for all end for end if end when /* Monitor , otrzymując prośbę o retransmisję pakietu, spełnia ją, jeżeli posiada poszukiwany pakiet od określonego nadawcy i o wymaganym numerze sekwencyjnym. W przeciwnym wypadku, jeżeli pole otrzymanej prośby jest większe od zera, monitor rozsyła tą prośbę dalej za pomocą procedury . Dla uproszczenia zapisu, zastosowano tu funkcję , która zwraca indeks procesu o identyfikatorze */ 45. when 46. do if then 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. else if then end if end if end when /* Po otrzymaniu odpowiedzi na wysłaną prośbę, monitor sprawdza, czy może dostarczyd odebraną wiadomośd, a jeśli tak, czy może dostarczyd któreś z wiadomości umieszczonych w zbiorze . W przeciwnym wypadku dołącza pakiet do zbioru */ when do if then else end if end when Zgodne rozgłaszanie niezawodne z przyczynowym uporządkowaniem wiadomości Specyfikacja Mówimy, że wiadomośd poprzedza przyczynowo , jeżeli zdarzenie wysłania zależy przyczynowo od zdarzenia wysłania . Innymi słowy, oznacza to, że zachodzi któryś z poniższych przypadków: obie wiadomości zostały rozgłoszone przez ten sam proces i wiadomośd została rozgłoszona przed wiadomośd została odebrana przez pewien proces , a została rozgłoszona przez po odebraniu istnieje wiadomośd taka, że dla i oraz i zachodzi jeden z dwóch powyższych warunków Relacja przyczynowego porządku między wiadomościami jest zachowana przez kolejny omawiany w ramach wykładu mechanizm niezawodnego rozgłaszania, mianowicie zgodnego rozgłaszania niezawodnego z przyczynowym uporządkowaniem wiadomości (ang. causally ordered reliable broadcast). Mechanizm ten posiada wszystkie własności zgodnego rozgłaszania niezawodnego i dodatkowo własnośd przyczynowego uporządkowania (ang. causal delivery) wiadomości: Ważnośd Brak powielania Brak samogeneracji Zgodnośd Przyczynowe uporządkowanie Jeżeli procesowi dostarczone są wiadomości oraz , przy czym zdarzenie wysłania wiadomości przyczynowo zależy od zdarzenia wysłania wiadomości , to jest odebrana przed . Własnośd ta oznacza, że przed dostarczeniem dowolnej wiadomości , proces musi dostarczyd wszystkie wiadomości, od których przyczynowo zależy. Operacje komunikacyjne Operację zgodnego rozgłaszania niezawodnego wiadomości przez do zbioru procesów , z zachowaniem przyczynowego uporządkowania wiadomości oznaczad będziemy przez . Zdarzenie, odpowiadające tej operacji, zapisywad będziemy jako . Analogicznie, przez oznaczad będziemy operację, uaktywniającą zdarzenie przez proces do procesu aplikacyjnego i przekazującą w efekcie wiadomośd wysłaną . Algorytm Algorytm, realizujący mechanizm zgodnego rozgłaszania niezawodnego z przyczynowym uporządkowaniem wiadomości (ang. no-waiting causal broadcast), cechuje się: Dostępnością mechanizmu zgodnego rozgłaszania niezawodnego Brakiem wymogu dostępności detektora awarii Na podstawie powyższej charakterystyki łatwo zauważyd, że algorytm jest odpowiedni dla modelu przetwarzania z ukrytymi awariami (patrz: Wykład 11: Modele przetwarzania). Wiadomości aplikacyjne przesyłane są w komunikatach typu PACKET. Pakiety te mają dodatkowo pole , zawierające zbiór informacji o wiadomościach poprzedzających przyczynowo wiadomośd aplikacyjną przesyłaną w tym pakiecie. Zbiór dla każdego procesu zawiera zbiór informacji o wiadomościach, które poprzedzają przyczynowo wysłaną przez proces wiadomośd aplikacyjną, natomiast zbiór zawiera wiadomości dostarczone do procesu . type PACKET extends FRAME is record of : set of pair of : MESSAGE end record : MESSAGE : PACKET : set of pair of : set of MESSAGE 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. /* Wysyłając pakiet z wiadomością aplikacyjną , monitor procesu inicjuje odpowiednio pola pakietu, dołączając do niego wiadomości, od których wiadomośd jest przyczynowo zależna. Następnie wysyłana wiadomośd aplikacyjna jest dołączana do zbioru wraz z identyfikatorem nadawcy- . Pakiet jest rozgłaszany z użyciem mechanizmu zgodnego rozgłaszania niezawodnego */ when do end when /* Wiadomośd aplikacyjna przenoszona przez pakiet jest dostarczana tylko i wyłącznie wtedy, jeżeli zostaną dostarczone wszystkie wiadomości, od których jest ona przyczynowo zależna. W tym celu monitor przegląda i ewentualnie dostarcza wiadomości zawarte w polu otrzymanego pakietu. Dla uproszczenia zapisu przyjmuje się, że zbiór jest uporządkowany i wchodzące w jego skład wiadomości są dostarczane w poprawnej kolejności. Każda dostarczona wiadomośd dołączana jest przy tym do zbioru */ when do if then for all if do then end if end for end if end when Złożoność Złożonośd komunikacyjna pakietowa i czasowa tego algorytmu jest identyczna jak stosowanego mechanizmu zgodnego rozgłaszania niezawodnego. Poważną wadą algorytmu jest jednak rosnący rozmiar zbioru . Potrzeba dołączania zbioru do wysyłanych wiadomości powoduje wzrost złożoności komunikacyjnej bitowej. W efekcie algorytm ten nie ma większego znaczenia w rzeczywistych zastosowaniach. W praktyce, zgodne rozgłaszanie niezawodne z przyczynowym uporządkowaniem wiadomości można jednak łatwo uzyskad, modyfikując stosownie przedstawione wcześniej mechanizmy komunikacji punkt- punkt, zachowujące uporządkowanie przyczynowe wiadomości. Zgodne rozgłaszanie wiadomości niezawodne z globalnym uporządkowaniem Specyfikacja Mechanizm zgodnego rozgłaszania niezawodnego z globalnym (całkowitym) uporządkowaniem wiadomości (ang. total order broadcast), nazywany też czasem rozgłaszaniem atomowym (ang. atomic broadcast), ma następujące własności: Ważnośd Brak powielania Brak samogeneracji Zgodnośd Globalne uporządkowanie wiadomości (ang. total order) Wszystkie procesy odbierają wiadomości w tym samym porządku Operacje komunikacyjne Operację zgodnego rozgłaszania niezawodnego wiadomości przez do zbioru procesów , z zachowaniem globalnego uporządkowania wiadomości oznaczad będziemy przez . Zdarzenie, odpowiadające tej operacji, zapisywad będziemy jako . Analogicznie, przez oznaczad będziemy operację, uaktywniającą zdarzenie przez proces do procesu aplikacyjnego i przekazującą w efekcie wiadomośd wysłaną . Algorytm Przedstawiony algorytm zgodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości zakłada: Dostępnośd niezawodnych kanałów FIFO (patrz: Wykład 11: Kanały niezawodne) Dostępnośd mechanizmu zgodnego rozgłaszania niezawodnego z zachowaniem porządku FIFO wiadomości przesyłanych między każdą parą procesów- Poprawnośd wszystkich procesów Algorytm używa dwóch typów wiadomości. Wiadomości aplikacyjne są przesyłane w pakietach typu PACKET, które zawierają dodatkowo numer sekwencyjny w polu oraz identyfikator pierwotnego nadawcy wiadomości w polu . Wiadomości typu SNUPDATE (ang. sequence number update) służą do aktualizacji numerów sekwencyjnych (znaczników czasowych) i zawierają pole numeru sekwencyjnego . Zmienne oraz są używane lokalnie podczas rozstrzygania o globalnej kolejności odebranych wiadomości. Wiadomości oraz są typu SNUPDATE. Zbiór zawiera otrzymane pakiety, w których zawarte są wiadomości aplikacyjne jeszcze nie dostarczone do procesu aplikacyjnego. Tablica zawiera numery sekwencyjne pakietów otrzymanych i jest swego rodzaju zegarem wektorowym. type PACKET extends FRAME is record of : PROCESS_ID : INTEGER : MESSAGE end record type SNUPDATE extends FRAME is record of : INTEGER end record : MESSAGE : PACKET : PACKET : SNUPDATE : SNUPDATE : array of INTEGER : set of PACKET 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. /* Wysyłając wiadomośd monitor procesu zwiększa licznik , a następnie inicjuje odpowiednio pola pakietu. Pakiet jest także dołączony do zbioru pakietów */ when do end when /* Odbierając wiadomośd od monitora , monitor ustawia wartośd -tego elementu tablicy na wartośd numeru sekwencyjnego przysłanego pakietu. Następnie dodaje go do zbioru . Jeżeli -ty wpis w tablicy jest mniejszy niż numer sekwencyjny odebranego pakietu, monitor zmienia wartośd elementu na wartośd numeru sekwencyjnego z pola odebranego pakietu, i następnie informuje o tym fakcie pozostałe monitory, rozgłaszając wiadomośd */ when do if end if end when /* Odbierając wiadomośd wartośd -tego elementu tablicy pakietu */ then typu SNUPDATE od monitora , monitor ustawia na wartośd numeru sekwencyjnego przysłanego 18. 19. 20. 21. when do end when /* Wiadomośd jest dostarczana, jeżeli posiada najmniejszy licznik (znacznik czasowy) spośród wszystkich otrzymanych wiadomości (w przypadku konfliktów rozstrzyga identyfikator procesu) oraz jeżeli ten licznik jest nie większy od wszystkich elementów tablicy */ when do 22. 23. 24. 25. end when Przykład #1: Początkowo wszystkie pozycje wszystkich tablic są wyzerowane. Monitor procesu wysyła pakiet z wiadomością i . W wyniku tego wartośd jego tablicy , a pakiet z wiadomością dołączana jest do zbioru . Analogicznie, monitor procesu wysyła pakiet z wiadomością i , przypisując , a pakiet z wiadomością dołączana jest do zbioru . Monitor po otrzymaniu pakietu z wiadomością modyfikuje tablicę , wykonując przypisanie . Ponieważ nadesłany pakiet posiada licznik sekwencyjny większy niż licznik lokalny zawarty w , więc dodatkowo wykonuje operację przypisania oraz rozsyła wiadomości SNUPDATE do pozostałych monitorów. Odpowiada to wierszom 12-16 z przedstawionego algorytmu. Pozostałe monitory, otrzymując tę wiadomośd, aktualizują odpowiednie pozycje lokalnej tablicy . Załóżmy, że pakiet od monitora dociera do oraz . Powoduje to odpowiednią modyfikację tablic . W tej chwili dla obu monitorów zachodzi warunek z 21. wiersza algorytmu- numer sekwencyjny pakietu z wiadomością jest równy wszystkim pozycjom tablicy ,a identyfikator jej nadawcy jest mniejszy od identyfikatorów nadawców wszystkich pozostałych wiadomości. Po dostarczeniu i usunięciu odpowiedniego pakietu ze zbioru , oba monitory oraz mogą następnie dostarczyd wiadomośd . Wreszcie, kiedy pakiet z wiadomością dotrze ostatecznie do , zostanie ona uznana za możliwą do dostarczenia (znowu zajdzie warunek z wiersza 21-szego algorytmu), i będzie można następnie dostarczyd również . Przykład #2: Rozważmy teraz przykład, w którym jeden proces ulegnie awarii. Załóżmy, że początkowo wszystko działa podobnie jak w poprzednim przykładzie, lecz tym razem proces , a tym samym monitor uległ awarii po otrzymaniu pakietu z wiadomością . Po pewnym czasie pakiet z wiadomością od procesu dociera do monitora . Powoduje to oczywiście odpowiednią modyfikacje tablic y . Analogicznie, gdy pakiet z wiadomością dotrze do , ten zmodyfikuje odpowiednio tablicę . Żaden proces nie jest w stanie odebrad wiadomości, gdyż oba czekają na zwiększenie drugiej pozycji tablicy (odpowiadającej procesowi ). Zwiększenie to może jednak nastąpid tylko w wyniku otrzymania pakietu od - co nigdy nie nastąpi z powodu awarii i . Widzimy tutaj, że w przypadku możliwości awarii chod jednego procesu przedstawione rozwiązanie jest niepoprawne. Złożoność Załóżmy, że topologia przetwarzania rozproszonego ma postad grafu pełnego. Jak łatwo zauważyd, w przedstawionym algorytmie rozgłoszenie wiadomości wymaga dwóch kroków (złożonośd czasowa wynosi ): w pierwszym nadawca rozgłasza wiadomośd, w drugim otrzymuje komunikaty typu SNUPDATE. W pierwszym kroku wysłanych jest komunikatów, zaś w drugim co najwyżej komunikatów. Stąd, złożonośd komunikacyjna wynosi . Wykład #13: Problem konsensusu Plan wykładu: a) b) c) d) e) Problem konsensusu- wprowadzenie Konsensus podstawowy Konsensus jednolity Konsensus probabilistyczny Konsensus a inne problemy Konsensus- wprowadzenie Nieformalnie, konsensusem nazywa się problem uzgadniania przez zbiór procesów jednej wartości spośród zbioru wartości zaproponowanych wstępnie przez te procesy. Algorytm rozwiązywania tego problemu będziemy nazywad mechanizmem konsensusu. W systemach rozproszonych mechanizm konsensusu jest oczywiście pewnym specyficznym przetwarzaniem rozproszonym. Należy zauważyd, że konsensus jest szczególnym przypadkiem problemów uzgadniania, w których zbiór procesów podejmuje decyzje powiązane pewnymi zależnościami. Innymi przykładami takich problemów są: Problem elekcji Problem zatwierdzania Aproksymowany konsensus W przypadku konsensusu, relacja między decyzjami różnych procesów jest bardzo prosta: wymaga się, by wszystkie procesy decydowały się na tę samą wartośd. W przypadku problemów elekcji jeden proces musi zdecydowad, że został wybrany, a wszystkie pozostałe, że zostały pokonane (niewybrane). W problemach zatwierdzania (ang. commit-abort) procesy decydują, czy należy zatwierdzid, czy też odrzucid transakcję- przy czym transakcja nie może byd zatwierdzona przy sprzeciwie chod jednego procesu (jest to szczególny przypadek konsensusu binarnego). W konsensusie aproksymowanym, inaczej problemie przybliżonej zgody (ang. approximate agreement), wszystkie procesy podejmują decyzję, których wartości nie mogą się różnid więcej niż o pewną stałą i muszą należed do zbioru wartości wejściowych. Problem konsensusu jest trudny do rozwiązania w systemie rozproszonym, ale jednocześnie jest on problemem bardzo ważnym. Mając do dyspozycji mechanizm konsensusu można znaleźd rozwiązanie wielu innych zagadnieo, między innymi takich jak: Zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości Jak przedstawiono na poprzednim wykładzie, zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości (patrz: Wykład 12) polega na zapewnieniu w systemie rozproszonym, dostarczenia rozgłaszanych wiadomości w takim samym porządku do wszystkich odbiorców, mimo potencjalnych awarii i nieprzewidywalnych opóźnieo komunikacyjnych. Komunikacja zsynchronizowana z obrazami grup Problem komunikacji zsynchronizowanej z obrazami grup (ang. view synchronous multicast) polega na rozgłaszaniu tej samej sekwencji wiadomości do wszystkich procesów, należących do określonego obrazu (widoku) grupy. Nieblokujące zatwierdzanie atomowe Problem nieblokującego zatwierdzania atomowego (ang. non- blocking atomic commitment) polega na zatwierdzeniu lub odrzuceniu transakcji przez grupę procesów, przy czym transakcja może byd zatwierdzona tylko w przypadku, w którym wszystkie procesy głosowały za jej zatwierdzeniem. Uzgadnianie składu grupy Problem składu grupy (ang. group membership) polega na uzgodnieniu przez zbiór procesów spójnego obrazu składu grupy, zmieniającej się w czasie. Obraz składu grupy, identyczny dla wszystkich procesów będących jej członkami, nazywa się widokiem grupy. Możliwośd rozwiązania wymienionych problemów z użyciem mechanizmu konsensusu nie oznacza, że problemy te są łatwiejsze. Konsensus można bowiem rozwiązad mając na przykład do dyspozycji mechanizm niezawodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości. Konsensus a zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości Konsensus można łatwo sprowadzid do problemu zgodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości (patrz: Wykład 12). Aby rozwiązad konsensus z wykorzystaniem istniejącej abstrakcji rozgłaszania, wystarczy wykonad następujące kroki: Wszystkie procesy rozsyłają proponowaną wartośd za pomocą zgodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości Procesy decydują się na pierwszą dostarczoną wiadomośd. Z właściwości użytego mechanizmu rozgłaszania wynika, że wiadomości są dostarczone do wszystkich procesów w tym samym porządku, zatem ta sama wiadomośd zostanie dostarczona jako pierwsza, tym samym wszystkie procesy zdecydują się na tę samą wartośd. Problem zgodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości można z kolei sprowadzid do konsensusu, wymagając, aby dostarczenie -tej wiadomości było decydowane w wyniku kolejnego, -tego konsensusu. W koocowej części wykładu (patrz: Algorytm) zostanie przedstawiony algorytm, implementujący zgodne rozgłaszanie niezawodne z globalnym uporządkowaniem wiadomości za pomocą zgodnego rozgłaszania niezawodnego i wybranego mechanizmu konsensusu. Konsensus w systemach w pełni asynchronicznych W 1985r. zostało udowodnione (Michael Fisher, Nancy Lynch, Michael Paterson) fundamentalne twierdzenie o nierozwiązywalności konsensusu w pełni asynchronicznym środowisku rozproszonym, o ile jest możliwe załamanie (awaria) chociaż jednego procesu. Innymi słowy, jeżeli nie ma ograniczeo na maksymalny czas przesyłania wiadomości i prędkośd procesów, to problem konsensusu nie można w ogólności rozwiązad. Twierdzenie 22 (Fisher- Lynch- Paterson) Nie istnieje algorytm (mechanizm), rozwiązujący problem konsensusu w środowisku w pełni asynchronicznym, jeżeli istnieje możliwośd załamania (awarii) chodby jednego procesu. Dowód powyższego twierdzenia opiera się na wykazaniu, że nie jest możliwe odróżnienie procesu niepoprawnego od takiego, który po prostu jest bardzo wolny lub jest połączony bardzo wolnymi łączami. Konsensus w systemach częściowo synchronicznych Twierdzenie 23 Nie istnieje algorytm, rozwiązujący problem konsensusu w środowisku (modelu) z synchronicznymi procesami i asynchronicznymi kanałami, jeżeli istnieje możliwośd załamania (awarii) chodby jednego procesu. Powyższe twierdzenie wynika z braku ograniczeo na czas przesyłania wiadomości, co powoduje, że nie można odróżnid procesu niepoprawnego od takiego, który połączony jest wyjątkowo wolnymi łączami. Twierdzenie 24 Nie istnieje algorytm, rozwiązujący problem konsensusu w środowisku (modelu) z asynchronicznymi procesami i kanałami o znanych maksymalnych opóźnieniach, jeżeli istnieje możliwośd załamania (awarii) chodby jednego procesu. Powyższe twierdzenie wynika oczywiście z braku ograniczeo na różnice prędkości między procesami, co powoduje, że nie można odróżnid procesu niepoprawnego od takiego, który jest bardzo wolny. Detektory awarii a konsensus Konsensus posiada rozwiązanie dla systemów, w których dostępne są doskonałe detektory awarii. Wystarczającym warunkiem jest dostępnośd detektora klasy S (patrz: Wykład 11: Klasyfikacja detektorów), a w niektórych rodzajach systemów rozproszonych nawet detektora ostatecznie słabego- W. Należy zwrócid uwagę, że jeżeli można rozwiązad konsensus z użyciem pewnego detektora awarii, to oznacza to, że detektora tego nie da się zaimplementowad w pełni asynchronicznym systemie rozproszonym. Problem konsensusu można rozwiązad w systemach asynchronicznych: z dostępem do doskonałego detektora awarii P z użyciem detektora awarii klasy S pod warunkiem jednak, że większośd procesów jest poprawna, tzn. dla , gdzie oznacza liczbę wszystkich procesów, a jest maksymalną liczbą procesów niepoprawnych. Konsensus podstawowy Specyfikacja Mechanizm konsensusu podstawowego charakteryzują następujące własności: Ważnośd (ang. validity) Jeżeli proces decyduje się na wartośd , to wartośd ta została wcześniej zaproponowana przez pewien proces. Innymi słowy, procesy nie mogą decydowad się na dowolną wartośd, lecz muszą zgodzid się na którąś z przedstawionych propozycji. Zakooczenie (ang. termination) Wszystkie poprawne procesy ostatecznie decydują się na jakąś wartośd. W systemie asynchronicznym, czas podejmowania decyzji jest przy tym skooczony, ale nieznany. Integralnośd (ang. integrity) Każdy proces decyduje się tylko raz. Procesy nie mogą zatem zmieniad raz podjętych decyzji. Zgodnośd (ang. agreement) Nie istnieją dwa poprawne procesy, które zdecydowały się na inne wartości. Tym samym, poprawne procesy uzgadniają wspólną wartośd. Dodatkowo, wymagane jest, by mechanizm konsensusu miał własnośd nietrywialności rozwiązania (ang. non-triviality), którą zazwyczaj pomija się, definiując konsensus z uwagi na jej oczywistośd. Własnośd ta mówi, że wartośd decyzji nie może byd ustalona z góry. Operacja propose Proponowana do uzgodnienia przez proces wartośd określana jest w wyniku wykonania operacji . Operacja ta inicjuje mechanizm konsensusu. Zdarzenie, zachodzące w procesie . Operacja decide Określenie przez proces (monitor w wyniku wykonania operacji konsensusu. Zdarzenie wartości w wyniku wykonania tej operacji zapisywane będzie jako ) decyzji, co do ostatecznie uzgodnionej wartości następuje . Wykonanie tej operacji kooczy mechanizm , zachodzące w procesie w wyniku wykonania operacji , oznacza osiągnięcie przez proces aplikacyjny konsensusu, a więc uzgodnienia z wszystkimi pozostałymi procesami. Schematycznie, miejsce mechanizmu konsensusu ilustruje poniższy rysunek. Mechanizm jest inicjowany zajściem zdarzeo w procesach aplikacyjnych . Jego efektem jest natomiast podjęcie przez każdy monitor decyzji, dotyczącej ostatecznej wybranej wartości . Podjęcie tej decyzji odpowiada wykonaniu operacji i zajściu zdarzenia , oznaczającego osiągnięcie konsensusu przez , a więc uzgodnienia wartości z wszystkimi procesami. Należy pamiętad oczywiście, że zgodnie z własnością ważności, . Algorytm rozgłoszeniowy Rozgłoszeniowy algorytm konsensusu podstawowego (ang. flooding consensus) zakłada dostępnośd: Mechanizmu podstawowego rozgłaszania niezawodnego (patrz: Wykład Podstawowe rozgłaszanie niezawodne) Doskonałego detektora awarii (patrz: Wykład 11: Klasyfikacja detektorów) 12: Z powyższych założeo wynika, że algorytm przeznaczony jest dla modelu jawnych awarii (patrz: Wykład 11: Modele przetwarzania). Koncepcja algorytmu przedstawia się następująco: Algorytm działa w rundach, zaś każda wiadomośd jest oznaczona numerem rundy. Decyzja podejmowana jest, gdy proces otrzyma wiadomości od wszystkich poprawnych procesów i nie wykrył żadnej nowej awarii, a więc ma pewnośd, że otrzymał wszystkie propozycje, które będą wzięte pod uwagę przez wszystkie pozostałe procesy. Jeżeli wykryta została awaria, to proces nie ma pewności, czy posiadany przez niego zbiór wartości-propozycji- jest taki sam, jak widziany przez wszystkie pozostałe procesy. Różnica może mied na przykład miejsce, jeżeli jakiś błędny proces zdążył przesład wiadomośd tylko do części pozostałych procesów. W takim wypadku rozpoczynana jest kolejna runda. Do podjęcia decyzji używana jest dowolna deterministyczna funkcja, znana wszystkim procesom, np. wybierana może byd najmniejsza wartośd spośród zaproponowanych. W algorytmie przesyłane są wiadomości dwóch typów. Typ MYPROP zawiera pole , które jest zbiorem wartości zaproponowanych w danej rundzie przez poszczególne procesy, a także pole , określające numer rundy. Typ DECIDED natomiast, zawiera pole , określające decyzję podjętą przez nadawcę wiadomości oraz pole , mówiące, w której rundzie podjęta została decyzja. Wiadomości typu DECIDED wysyłane są w momencie podjęcia decyzji przez proces (monitor). Znaczenie niektórych zmiennych jest następujące: zawiera wartośd, na którą chce się zdecydowad proces , początkowo równa pewnej wyróżnionej wartości pustej. to zbiór, zawierający zestaw wszystkich widzianych przez proces (monitor ) propozycji. to numer bieżącej rundy. to zbiór, początkowo obejmujący identyfikatory wszystkich procesów, oznaczający procesy, które według wiedzy dostępnej dla są poprawne. zawiera identyfikatory procesów poprawnych w obecnej rundzie. Początkowo jest on pusty. type MYPROP extends FRAME is record of : set of INTEGER : INTEGER end record type DECIDED extends FRAME is record of : INTEGER : INTEGER end record : DECIDED : MYPROP : INTEGER : array of set of INTEGER : INTEGER : set of PROCESS_ID : array of set of PROCESS_ID 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. /* Zainicjowanie rozgłoszeniowego algorytmu konsensusu podstawowego związane jest z zajściem zdarzenia w procesie aplikacyjnym . W efekcie tego zdarzenia, monitor rozpoczyna wymianę wiadomości z innymi monitorami w celu uzgodnienia wspólnej decyzji. Uzgodnienie to prowadzi do zajścia zdarzenia */ when do for all do end for end when /* W wyniku wykrycia awarii z użyciem detektora awarii P, proces poprawnych procesów widzianych przez dowolny proces when do jest usuwany ze zbioru */ end when /* W przypadku otrzymania propozycji od monitora , wartośd pola z pola otrzymanej wiadomości MYPROP dodawana jest do zbioru propozycji . Sam proces dodawany jest do zbioru procesów poprawnych w obecnej rundzie */ when do end when 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. /* W przypadku, gdy monitor otrzyma wiadomości od monitorów wszystkich poprawnych procesów i dotąd nie podjął decyzji, sprawdza, czy w obecnej rundzie zbiór poprawnych procesów nie uległ zmianie, tzn. czy zbiór identyfikatorów procesów z poprzedniej rundy jest taki sam, co w bieżącej rundzie. Jeżeli ten warunek jest spełniony, to monitor podejmuje decyzję, wykonując operację . Prowadzi to do zajścia zdarzenia w procesie . Po wykonaniu operacji , monitor rozgłasza swoją decyzję, korzystając z mechanizmu podstawowego rozgłaszania niezawodnego */ when do if then // zwraca najmniejszą liczbę ze zbioru else end if end when /* W przypadku, gdy monitor otrzyma powiadomienie o decyzji pewnego monitora, natychmiast podejmuje identyczną decyzję i rozgłasza ten fakt wszystkim pozostałym monitorom */ when do if then end if end when Przykład #1: Przykład przedstawia cztery procesy, uzgadniające wspólną decyzję za pomocą rozgłoszeniowego algorytmu konsensusu podstawowego. Wszystkie procesy proponują pewną wartośd, a odpowiadające im monitory rozsyłają ją za pomocą podstawowego rozgłaszania niezawodnego. Załóżmy, że proces ulega awarii w trakcie rozgłaszania, w wyniku czego jego propozycję otrzymuje jedynie monitor . Ponieważ monitor zebrał wiadomości od wszystkich monitorów, więc może podjąd decyzję, wybierając minimalną wartośd, na przykład , a następnie rozgłosid ją w systemie. Monitory, otrzymując wiadomośd o decyzji, podporządkowują się jej, podejmując identyczną decyzję. Należy zauważyd, że monitory i nie mogą same podjąd decyzji, gdyż nie otrzymały wiadomości od wszystkich monitorów procesów, który były uznawane za poprawne na początku tej rundy. Co więcej, po wykryciu awarii procesu znane sobie propozycje. monitory mogą rozpocząd nową rundę, rozgłaszając wszystkie Fakty wykrycia awarii procesu nie wpływa na decyzję monitora , gdyż otrzymał on już wcześniej wiadomośd od tego procesu, dodając go do zbioru . Proces usunięty jest więc wprawdzie ze zbioru , ale ponieważ zbiór zawiera się w zbiorze , zachodzi warunek konieczny tego algorytmu do podjęcia decyzji. Przykład #2: W kolejnym przykładzie dochodzi w pierwszej rundzie do dwóch awarii. Proces ulega awarii zaraz po przesłaniu swojej propozycji do monitora , natomiast ulega awarii po wysłaniu wiadomości do monitorów oraz . Żaden więc z dwóch pozostałych monitorów nie może podjąd decyzji, gdyż żaden z nich nie otrzymał wiadomości od wszystkich monitorów. Następuje zatem kolejna runda, w której ulega awarii. Tym samym, po wykryciu awarii procesu , monitor przechodzi do kolejnej rundy i podejmuje wreszcie decyzję. Złożoność Załóżmy, jak zwykle, że topologię przetwarzania reprezentuje graf pełny. Jeżeli żaden proces nie ulega awarii (przypadek optymistyczny), procesy podejmują decyzję w pierwszej rundzie. Wymaga ona wymiany wiadomości typu MYPROP przed osiągnięciem decyzji i drugie tyle wiadomości typu DECIDED. Złożonośd czasowa wynosi zatem , natomiast złożonośd komunikacyjna. W przypadku, w który kolejno ulegają awarii wszystkie procesy (przypadek pesymistyczny), algorytm wymaga kroków (rund), a więc złożonośd czasowa wynosi . W każdej dodatkowej rundzie wymienianych jest dodatkowe wiadomości, z czego wynika, że złożonośd komunikacyjna w przypadku pesymistycznym wynosi . Algorytm hierarchiczny Kolejnym rozwiązaniem problemu konsensusu jest algorytm hierarchiczny, w którym kolejno każdy proces (monitor) pełni rolę lidera rundy. Przyjęto przy tym, że hierarchia procesów jest zdefiniowana przez uporządkowanie procesów według indeksów. Lider rundy rozgłasza swoją decyzję, która jest przejmowana przez pozostałe procesy, po czym zaczyna się kolejna runda z nowym liderem. Jeżeli lider ulegnie awarii, jego rolę przejmuje kolejny proces itd. Algorytm hierarchiczny konsensusu podstawowego (ang. hierarchical consensus) zakłada dostępnośd: mechanizmu podstawowego rozgłaszania (patrz: Wykład 12: Podstawowe rozgłaszanie niezawodne) doskonałego detektora awarii (patrz: Wykład 11: Klasyfikacja detektorów) Z powyższych założeo wynika, że algorytm przeznaczony jest dla modelu jawnych awarii (patrz: Wykład 11: Modele przetwarzania). Jedynym używanym typem wiadomości jest typ DECIDED, niosący wartośd podjętej decyzji w polu oraz numer rundy, w której podjęto decyzję, w polu . Algorytm używa następujących zmiennych: Wiadomośd jest wiadomością, powiadamiającą inne procesy o podjętej decyzji przez lidera. zawiera propozycję procesu . (ang. proposer round number) zawiera identyfikator procesu, który zaproponował bieżącą wartośd zmiennej . Tablica zawiera wartośd , jeżeli proces (monitor) otrzymał powiadomienie o decyzji lidera. Tablica zainicjowana jest identyfikatorami wszystkich procesów, będących kolejnymi kandydatami na lidera. Identyfikator lidera -tej rundy jest zapisany w -tym elemencie tej tablicy. Tablica ta posiada identyczną zawartośd dla wszystkich procesów, biorących udział w algorytmie. Tablica zawiera wartośd , jeżeli monitor podjął już decyzję i rozgłosił ją wśród procesów. zawiera numer kolejnej rundy. reprezentuje zbiór procesów podejrzewanych o to, że są niepoprawne. Zmienna jest używana lokalnie w obsłudze zdarzenia odbioru wiadomości DECIDED. type DECIDED extends FRAME is record of : INTEGER : INTEGER end record : DECIDED : INTEGER : INTEGER : array of BOOLEAN : array of PROCESS_ID : array of BOOLEAN : INTEGER : set of PROCESS_ID : INTEGER 1. 2. 3. /* Monitor when end when zapisuje propozycję procesu do w zmiennej */ 4. 5. 6. 7. /* W przypadku wykrycia awarii jakiegoś procesu jest on dołączany do zbioru . Z własności silnej dokładności doskonałego detektora awarii P (patrz: Wykład 11: Własnośd dokładności) wynika, że żaden poprawny proces nigdy nie będzie podejrzewany */ when do end when /* Jeżeli monitor stwierdza, że zostaje liderem bieżącej -tej rundy (co dzieje się wtedy, gdy jego identyfikator jest równy identyfikatorowi zapisanemu w -tym elemencie tablicy ) oraz, jeżeli zmienna nie jest pusta, a także jeszcze nie podejmował decyzji, to decyduje się na wartośd zapisaną w zmiennej , zapamiętuje ten fakt i powiadamia o tym pozostałe monitory. Z własności ważności podstawowego rozgłaszania niezawodnego wynika, że każdy proces (monitor) poprawny otrzyma rozgłoszoną wiadomośd, o ile rozgłaszający proces (monitor) również jest poprawny. Jeżeli więc monitor podejmuje decyzję i jest poprawny, to wszystkie inne poprawne monitory otrzymają wiadomośd o podjętej przez niego decyzji */ when do 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. end when /* Jeżeli monitor podejrzewa lidera bieżącej rundy lub już otrzymał od niego wiadomośd, zwiększa numer rundy. Z własności dokładności doskonałego detektora awarii P wynika, że jest niemożliwe, by poprawny proces był kiedykolwiek podejrzewany. Z własności kompletności (patrz: Wykład 11: Własnośd kompletności) detektora awarii wynika natomiast, że niepoprawny proces będzie podejrzewany */ when do end when /* Jeżeli monitor otrzymuje powiadomienie o decyzji, to ignoruje ją, gdy pochodzi ona od monitora skojarzonego z procesem, znajdującym się niżej w hierarchii procesów niż lub gdy numer rundy nadesłanej wiadomości jest mniejszy niż największy numer rundy, w której monitor otrzymał decyzję. Może to bowiem oznaczad, że wiadomośd ta została wysłana przez niepoprawny monitor tuż przed jego awarią (warunek w wierszu 18). W przeciwnym wypadku, monitor zapisuje otrzymaną propozycję decyzji do zmiennej oraz zapamiętuje, że w rundzie, zapisanej w polu odebranego komunikatu, otrzymał decyzję od lidera */ when do if then end if 22. 23. 24. end when Przykład #1: W przedstawionym poniżej przykładzie liderem pierwszej rundy jest monitor . Rozgłasza on swoją decyzję, po czym proces , a tym samym monitor ulegają awarii. Liderem nowej rundy zostaje . Nowa runda zaczyna się w każdym monitorze, albo w momencie otrzymania wiadomości od , albo w momencie wykrycia jego awarii. Monitor rozgłasza wartośd, na którą chce się zdecydowad i podejmuje decyzję. Wartością tą jest albo , jeżeli otrzymał wiadomośd od przed wykryciem awarii (tak jak w przykładzie), albo . Monitory oraz po otrzymaniu tej wiadomości od rozpoczynają nową rundę, której liderem jest . Monitor rozgłasza tę wiadomośd, a więc wysyła ją również do . Ponieważ monitor podjął już decyzję, wiadomośd otrzymana od jest przez niego ignorowana- została ona pominięta na slajdzie. Po wysłaniu wiadomości monitor podejmuje decyzję- w rozważanym przykładzie . Monitor , otrzymując wiadomośd przechodzi do nowej rundy, stwierdza następnie, że jest jej liderem i podejmuje decyzję, rozsyłając ją do wszystkich monitorów. Pozostałe monitory ignorują tę wiadomośd, gdyż podjęły już decyzję. Przykład #2: Kolejny przykład zaczyna się podobnie jak poprzednio. Monitor rozgłasza proponowaną wartośd do wszystkich, jednakże, ponieważ ulega awarii, z własności podstawowego rozgłaszania niezawodnego, że wiadomośd może nie dotrzed do monitora . Po wykryciu awarii procesu , monitor decyduje o rozpoczęciu rundy, której jest liderem. Pozostałe monitory również przechodzą do nowej rundy, po otrzymaniu wiadomości od . Monitor decyduje się na , gdyż nigdy nie widział wartości , a następnie rozsyła tę wartośd do pozostałych monitorów. Odebranie tej wiadomości powoduje, że zarówno , jak i przyjmują wartośd jako nową propozycję decyzji (por. wiersz 18 algorytmu). Powoduje to przejście do rundy trzeciej, której liderem ma byd . Ponieważ jednak ulega on awarii, przechodzi do nowej rundy i podejmuje decyzję, wybierając wartośd . Złożoność W przypadku, gdy początkowy lider nie ulega awarii (przypadek optymistyczny), algorytm kooczy się po pierwszym kroku. Złożonośd czasowa wynosi zatem , a złożonośd komunikacyjna jest równa . W przypadku pesymistycznym, w którym wszystkie procesy po kolei ulegają awarii, algorytm kooczy się po co najwyżej krokach, przy czym w każdym kroku jest wysłanych wiadomości. Złożonośd czasowa wynosi więc , zaś złożonośd komunikacyjna- . Konsensus jednolity Specyfikacja Mechanizm konsensusu jednolitego posiada następujące własności: Ważnośd (ang. validity) Jeżeli proces decyduje się na wartośd , to wartośd ta została wcześniej zaproponowana przez pewien proces. Zakooczenie (ang. termination) Wszystkie poprawne procesy ostatecznie decydują się na jakąś wartośd. Integralnośd (ang. integrity) Każdy proces decyduje się tylko raz. Jednolita zgodnośd (ang. uniform agreement) Żadne dwa procesy, niekoniecznie poprawne, nie decydują się na inne wartości. Innymi słowy, jeżeli jakikolwiek proces podejmie decyzję- nawet jeżeli jest on niepoprawny- to wszystkie inne procesy muszą podjąd identyczną decyzję. Pierwsze trzy własności są identyczne jak w konsensusie podstawowym (patrz: Konsensus podstawowy), zaś różnią się własnością ostatnią. W przypadku konsensusu podstawowego własnośd zgodności dotyczyła tylko poprawnych procesów, zaś jednolita zgodnośd wymaga zgodności między wszystkimi procesami niezależnie od tego, czy są poprawne, czy nie. Operacja propose Proponowana do uzgodnienia przez proces wartośd określana jest w wyniku wykonania operacji . Operacja ta inicjuje mechanizm konsensusu jednolitego. Zdarzenie, zachodzące w procesie . Operacja decide Określenie przez proces (monitor w wyniku wykonania operacji konsensusu jednolitego. Zdarzenie wartości w wyniku wykonania tej operacji zapisywane będzie jako ) decyzji, co do ostatecznie uzgodnionej wartości następuje . Wykonanie tej operacji kooczy mechanizm , zachodzące w procesie w wyniku wykonania operacji , oznacza osiągnięcie przez proces aplikacyjny konsensusu, a więc uzgodnienia z wszystkimi pozostałymi procesami. Algorytm rozgłoszeniowy Niżej przedstawiony algorytm będzie modyfikacją rozgłoszeniowego algorytmu konsensusu podstawowego, dzięki której algorytm ten rozwiązuje problem konsensusu jednolitego. Nowy algorytm, podobnie jak poprzednio, zakłada: Dostępnośd mechanizmu podstawowego rozgłaszania niezawodnego (patrz: Wykład 12: Podstawowe rozgłaszanie niezawodne) Dostępnośd doskonałego detektora awarii (patrz: Wykład 11: Klasyfikacja detektorów) Zasadniczą różnicą między tymi algorytmami jest fakt wstrzymania się wszystkich procesów z decyzją do -tej rundy, gdzie oznacza liczbę procesów. W przeciwieostwie do algorytmu, rozwiązującego konsensus podstawowy, w prezentowanej wersji używany jest tylko jeden typ wiadomości- MYPROP. Jego struktura jest identyczna jak poprzednio. Wszystkie zmiennej używane przez wersję algorytmu rozgłoszeniowego dla jednolitego konsensusu są identyczne jak dla wersji podstawowej. Dodana jest jedynie tablica , zawierająca identyfikatory procesów, od których w danej rundzie otrzymano wiadomośd, natomiast zmienna jest zmienną logiczną, określającą, czy proces podjął już decyzję. type MYPROP extends FRAME is record of : set of INTEGER : INTEGER end record : MYPROP : BOOLEAN : set of INTEGER : INTEGER : set of PROCESS_ID : array 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. of set of PROCESS_ID /* Zainicjowanie rozgłoszeniowego algorytmu konsensusu jednolitego związane jest z zajściem zdarzenia w procesie aplikacyjnym . W efekcie tego zdarzenia, monitor rozpoczyna wymianę wiadomości z innymi monitorami w celu uzgodnienia wspólnej decyzji. Uzgodnienie to prowadzi do zajścia zdarzenia */ when do end when /* W wyniku wykrycia awarii z użyciem detektora awarii P, proces poprawnych procesów widzianych przez dowolny proces when do jest usuwany ze zbioru */ end when /* W przypadku otrzymania propozycji od monitora , wartośd pola z pola otrzymanej wiadomości MYPROP dodawana jest do zbioru propozycji . Sam proces dodawany jest do zbioru identyfikatorów procesów, od których w rundzie otrzymano wiadomośd z proponowanym zbiorem wartości */ when do end when /* W rozgłoszeniowy algorytmie konsensusu jednolitego, w porównaniu do algorytmu konsensusu podstawowego, inny jest warunek podjęcia decyzji. Mianowicie, decyzja podejmowana jest dopiero w -tej rundzie, pod warunkiem oczywiście, że monitor nie podjął jeszcze decyzji oraz otrzymano wiadomośd od wszystkich monitorów skojarzonych z niepodejrzewanymi w tej rundzie procesami. Monitor decyduje się na minimalny element ze zbioru wszystkich nadesłanych propozycji. Jeżeli natomiast , to następuje przejście do następnej rundy oraz rozesłanie zbioru wartości proponowanych w kolejnej rundzie */ when do if then else 23. 24. end if end when Złożoność Rozgłoszeniowy algorytm konsensusu jednolitego kooczy się w krokach, wymieniając wiadomości. Złożonośd czasowa wynosi więc , a złożonośd komunikacyjna wynosi i nie rozróżnia się tutaj dwóch przypadków- optymistycznych i pesymistycznych. Algorytm hierarchiczny Obecnie przedstawiony algorytm, rozwiązujący problem konsensusu jednolitego, jest modyfikacją algorytmu hierarchicznego konsensusu podstawowego. Założenia poprawności algorytmu są nadzbiorem założeo dla wersji algorytmu dla problemu konsensusu podstawowego i są następujące: dostępny jest mechanizm podstawowego rozgłaszania niezawodnego (patrz: Wykład 12: Podstawowe rozgłaszanie niezawodne) dostępny jest doskonały detektor awarii (patrz: Wykład 11: Klasyfikacja detektorów) dostępny jest mechanizm zgodnego rozgłaszania niezawodnego (patrz: Wykład 12: Zgodne rozgłaszanie niezawodne) dostępnośd mechanizmu kanałów niezawodnych (patrz: Wykład 11: Kanały niezawodne) Podobnie jak poprzednio przyjmuje się, że hierarchia procesów jest zdefiniowana przez uporządkowanie procesów wg ich indeksów. Zasadnicza różnica w algorytmach hierarchicznych konsensusu podstawowego i jednolitego związana jest z podziałem każdej rundy na dwa etapy: w pierwszym etapie lider wysyła propozycję decyzji (propozycja), a w drugim używa zgodnego rozgłaszania niezawodnego do rozesłania podjętej decyzji (potwierdzanie). Przejście do nowej rundy następuje tylko wówczas, gdy lider jest podejrzewany. Hierarchiczny algorytm konsensusu jednolitego używa trzech typów wiadomości. Typ PROPOSE przechowuje wartośd proponowanej decyzji w polu oraz numer rundy (pole ), w której tę propozycję wysłano. Typ DECIDE zawiera wartośd decyzji w polu . Typ ACK zawiera numer rundy w polu . Wyjaśnienia wymaga użycie zmiennych, które nie występowały w wersji algorytmu dla konsensusu podstawowego. Oprócz wiadomości typu ACK oraz typu PROPOSE pojawia się dodatkowo zbiór , zawierający identyfikatory procesów, od których otrzymano potwierdzenia propozycji, a także tablica , zawierająca wszystkie propozycje, gdzie -ty element oznacza propozycję, nadchodzącą w -tej rundzie. type PROPOSE extends FRAME is record of : set of INTEGER : INTEGER end record type DECIDE extends FRAME is record of : INTEGER end record type ACK extends FRAME is record of : INTEGER end record : DECIDE : ACK : PROPOSE : INTEGER : INTEGER : INTEGER : array of PROCESS_ID : set of PROCESS_ID : set of PROCESS_ID : array of INTEGER /* Monitor 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. zapisuje propozycję procesu when w zmiennej */ do end when /* W przypadku wykrycia awarii jakiegoś procesu jest on dołączany do zbioru . Z własności silnej dokładności doskonałego detektora awarii P (patrz: Wykład 11: Własnośd dokładności) wynika, że żaden poprawny proces nigdy nie będzie podejrzewany */ when do end when /* Jeżeli monitor odkrywa, że ma byd liderem rundy i nie podjął dotąd jeszcze decyzji, rozsyła swoją propozycję za pomocą podstawowego rozgłaszania niezawodnego */ when do end when /* Otrzymanie propozycji o numerze rundy powoduje zapamiętanie jej w -tym elemencie tablicy . Jeżeli numer rundy zawarty w polu odebranej wiadomości typu PROPOSE jest niemniejszy od numeru bieżącej rundy, wysyłane jest potwierdzenie do nadawcy. Warunek ten oznacza, że odebrana wiadomośd nie pochodzi od niepoprawnego procesu. Przejście do nowej rundy następuje bowiem tylko wtedy, gdy lider jest niepoprawny. Z własności doskonałego detektora awarii wynika, że lider nie byłby podejrzewany, gdyby był poprawny */ when do if end if then 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. end when /* Jeżeli lider bieżącej rundy jest podejrzewany, rozpoczynana jest nowa runda */ when do if then end if end when /* W przypadku otrzymania potwierdzenia, dołączane jest ono do zbioru when do */ end when /* Jeżeli lider otrzymał potwierdzenia od wszystkich poprawnych monitorów, rozsyła swoją decyzję za pomocą niezawodnego rozgłaszania */ when do end when /* Po otrzymaniu wiadomości typu DECIDE od lidera, każdy monitor również podejmuje identyczną decyzję */ 56. when 57. 58. 59. end when do Złożoność Algorytmy, rozwiązujące problem konsensusu jednolitego mają większą złożonośd niż rozwiązujące problem konsensusu podstawowego. Odnosi się to również do algorytmów rozgłoszeniowych. Jeżeli lider nie ulegnie awarii (przypadek optymistyczny), algorytm hierarchiczny kooczy się po krokach: kroki w pierwszej rundzie i dodatkowy na niezawodne rozgłaszanie, wymieniając przy tym wiadomości. Złożonośd czasowa w przypadku optymistycznym wynosi zatem , a złożonośd komunikacyjna- . Każda awaria lidera dodaje dwa dodatkowe kroki i wiadomości. Maksymalna liczba awarii wynosi oczywiście , a więc w przypadku pesymistycznym, złożonośd czasowa jest równa , a złożonośd komunikacyjna wynosi . Konsensus probabilistyczny Specyfikacja Poprzednio omawiane algorytm wymagały spełnienia dośd silnego założenia dostępności doskonałego detektora awarii. Mechanizm konsensusu probabilistycznego (ang. randomized consensus, probabilistic consensus), który nie ma tak silnych wymagao, charakteryzuje się następującymi własnościami: Ważnośd (ang. validity) Jeżeli proces decyduje się na jakąś wartośd, to wartośd ta została wcześniej zaproponowana przez pewien proces. Zgodnośd (ang. agreement) Żadne dwa poprawne procesy nie decydują się na inne wartości. Integralnośd (ang. integrity) Każdy proces decyduje się tylko raz. Zakooczenie probabilistyczne (ang. probabilistic termination) Wszystkie poprawne procesy, z prawdopodobieostwem równym 1, ostatecznie decydują się na jakąś wartośd. Jak łatwo zauważyd, konsensus probabilistyczny odróżnia się od poprzednich sformułowaniem warunku zakooczenia (własnośd zakooczenia probabilistycznego). Operacja propose Proponowana do uzgodnienia przez proces wartośd określana jest w wyniku wykonania operacji . Operacja ta inicjuje mechanizm konsensusu jednolitego. Zdarzenie, zachodzące w procesie . Operacja decide Określenie przez proces (monitor w wyniku wykonania operacji konsensusu probabilistycznego. Zdarzenie wartości w wyniku wykonania tej operacji zapisywane będzie jako ) decyzji, co do ostatecznie uzgodnionej wartości następuje . Wykonanie tej operacji kooczy mechanizm , zachodzące w procesie w wyniku wykonania operacji , oznacza osiągnięcie przez proces aplikacyjny konsensusu, a więc uzgodnienia z wszystkimi pozostałymi procesami. Algorytm Poniższy algorytm jest modyfikacją dobrze znanego probabilistycznego algorytmu, rozwiązującego konsensus binarny. Zakłada on: Dostępnośd mechanizmu podstawowego rozgłaszania niezawodnego Dostępnośd mechanizmu zgodnego rozgłaszania niezawodnego Poprawnośd większości procesów Zauważmy, że algorytm nie wymaga obecności detektora awarii. Każda runda podzielona jest na dwie fazy. W pierwszej fazie korzysta się z podstawowego rozgłaszania niezawodnego, a w drugiej ze zgodnego rozgłaszania niezawodnego do rozsyłania decyzji. W każdej rundzie istnieje prawdopodobieostwo większe od zera, że algorytm się zakooczy, tak więc ostatecznie prawdopodobieostwo zakooczenia wynosi 1. Algorytm używa czterech typów wiadomości. Typ INIVAL służy do przesyłania wartości proponowanych przez procesy, która to wartośd przenoszona jest w polu . Typ DECIDE posiada pole , zawierające decyzję oraz numer rundy w polu , w której decyzję tę podjęto. Pozostałe typy posiadają pole , zawierające propozycję decyzji oraz numer w polu , oznaczający numer rundy, w czasie której wysłano wiadomośd. Znaczenie niektórych zmiennych jest następujące: zawiera przybliżenie decyzji, zaś zawiera decyzję procesu , przy czym zmienne te są zainicjowane specjalnymi wyróżnionymi wartościami pustymi. Tablica zawiera wartości początkowe nadesłane przez pozostałe procesy. Tablice zbiorów oraz zawierają propozycje nadesłane przez procesy w odpowiednio, pierwszej i drugiej fazie danej rundy. type INIVAL extends FRAME is record of : INTEGER end record type DECIDE extends FRAME is record of : INTEGER : INTEGER end record type PHASE1 extends FRAME is record of : INTEGER : INTEGER end record type PHASE2 extends FRAME is record of : INTEGER : INTEGER end record : DECIDE : PHASE1 : PHASE2 : INIVAL : INTEGER : INTEGER : INTEGER : array : array : array 1. 2. 3. of INTEGER of set of INTEGER of set of INTEGER /* Proponując daną wartośd, monitor rozsyła ją za pomocą podstawowego rozgłaszania niezawodnego, zapamiętuje swoją propozycję, przypisuje ją do zmiennej , zwiększa numer rundy oraz następnie rozsyła swoją propozycję ponownie jako wiadomośd typu PHASE1 */ when do 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. end when /* Otrzymując wartośd początkową zaproponowaną przez inny monitor dodaje ją do zbioru wartości początkowych */ when do , monitor end when /* Otrzymując wiadomośd typu PHASE1, pochodzącej z -tej rundy, monitor dodaje przenoszoną przez nią wartośd do zbioru, będącego -tym elementem tablicy */ when do end when /* W przypadku, gdy monitor otrzymał od większości procesów wiadomości typu PHASE1 oraz jeszcze do tej pory nie podejmował decyzji, to sprawdza on, czy wszystkie wartości w zbiorze dla tej rundy są identyczne- równe . Jeżeli tak, przyjmuje jako właśnie . Jeżeli nie, jako przyjmuje wartośd pustą. Następnie wartośd jest rozsyłana za pomocą podstawowego rozgłaszania niezawodnego, rozpoczynając drugą fazę rundy */ when if do then else end if end when /* Otrzymując wiadomośd typu PHASE2, pochodzącej z -tej rundy, monitor dodaje przenoszoną przez nią wartośd do zbioru, będącego -tym elementem tablicy */ when do end when /* Po otrzymaniu wiadomości PHASE2 w -tej rundzie od większości procesów, monitor , o ile jeszcze nie podjął decyzji, sprawdza najpierw, czy istnieje taka wartośd , różna od wartości pustej, że wszystkie propozycje ze zbioru, będącego -tym elementem tablicy równają się . Jeżeli tak, to monitor decyduje się na tą wartośd i decyzję tę rozsyła za pomocą zgodnego rozgłaszania niezawodnego. W przeciwnym razie, to znaczy, jeżeli wartości należące do tablicy są różne, monitor wybiera jako swoją nową propozycję w zmiennej dowolną, różną od wartości pustej, propozycję ze zbioru, będącego -tym elementem tablicy . Jeżeli taka wartośd propozycji nie istnieje (wszystkie elementy tego zbioru równają się wartości pustej), to monitor losuje wartośd ze zbioru otrzymanych propozycji początkowych i rozpoczyna fazę pierwszą nowej rundy, rozsyłając wiadomośd PHASE1, zawierającą nową propozycję monitora */ 30. when do 31. if 32. 33. 34. 35. 36. else 37. if 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. then then else end if end if end when /* Po otrzymaniu wiadomości typu DECIDE, monitor podejmuje decyzję, wykonuje operację , I tym samym inicjuje zdarzenie */ when do end when Potrzeba randomizacji Można zadad pytanie, dlaczego w wierszu 40-tym występuje losowe wybranie wartości, zamiast dokonanie wyboru za pomocą ściśle określonej deterministycznej funkcji. Uzasadnienie przedstawione jest na rysunku poniżej, który obrazuje przykładowe wykonanie algorytmu. Wyobraźmy sobie, że każdy monitor, zamiast w wierszu 40-tym losowad wartośd, wybiera pierwszą wartośd różną od wartości pustej. Monitor dostaje wartośd od . Ponieważ obie wartości się różnią ( ), więc , zgodnie z wierszem 21-szym, wybierze wartośd pustą jako propozycję wartości do uzgodnienia. Identyczna sytuacja zajdzie w monitorze , natomiast monitor otrzyma propozycję wartości , i ponieważ wszystkie otrzymane wartości są identyczne, zaproponuje dalej . W drugiej fazie może z kolei zajśd sytuacja, w której otrzymałby wartośd pustą od i dlatego deterministycznie (zamiast losowo) wybrałby wartośd . Monitor natomiast otrzymałby wartośd od , i ponieważ jest ona różna od wartości pustej, przyjąłby ją jako swoją propozycję. z kolei otrzymuje od wartośd pustą, ale ponieważ sam wcześniej zaproponował wartośd różną od wartości pustej, przyjmuje ją jako podstawę do kolejnej rundy. Jak widad, w kolejnej rundzie wszystkie procesy proponują dokładnie takie same wartości jak poprzednio- a ponieważ taka sytuacja może się powtarzad, skutkuje to niebezpieczeostwem, że algorytm nigdy by się nie skooczył. Stąd właśnie wynika potrzeba randomizacji. Algorytm zgodnego rozgłaszania uporządkowaniem wiadomości niezawodnego z globalnym W poprzedniej części wykładu zostały przedstawione różne algorytmy, implementujące mechanizm konsensusu. Zostało już wcześniej wspomniane (patrz: Konsensus- wprowadzenie), że dostęp do takich mechanizmów umożliwia łatwe skonstruowanie mechanizmu (abstrakcji) zgodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości. Obecnie zostanie przedstawiony algorytm, zakładający dostępnośd: mechanizmu rozgłaszania niezawodnego mechanizmu konsensusu podstawowego, zapewniający dostęp do operacji rozgłaszania o własnościach zgodnego rozgłaszania niezawodnego z globalnym uporządkowaniem wiadomości. Wiadomości typu PACKET zawierają wiadomości aplikacyjne w polu oraz identyfikator pierwotnego nadawcy wiadomości w polu . Zbiór zawiera wiadomości dostarczone już do procesu aplikacyjnego, zaś zbiór otrzymane pakiety, zawierające wiadomości oczekujące na dostarczenie. Zbiór zawierad będzie efekt decyzji podjętej w wyniku konsensusu- posortowany zbiór pakietów o identycznym składzie dla każdego procesu. type PACKET extends FRAME is record of : INTEGER : MESSAGE end record : PACKET : MESSAGE : set of MESSAGE : ordered set of PACKET : ordered set of PACKET : BOOLEAN 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. /* Jeżeli proces aplikacyjny chce rozgłosid wiadomośd, monitor z nim skojarzony buduje pakiet, zawierający tę wiadomośd i rozgłasza ją z użyciem mechanizmu zgodnego rozgłaszania niezawodnego */ when do end when /* Monitor, otrzymujący pakiet dodaje go do zbioru wiadomości niedostarczonych, czekających na kolejny konsensus */ when do if end if end when then 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. /* Jeżeli zbiór wiadomości jest niepusty i monitor nie jest w trakcie uzgadniania kolejności wiadomości do odebrania, to proponuje on własny zbiór jako zbiór wiadomości do dostarczenia, na przykład w porządku, w jakim sam je otrzymał */ when do end when /* W ramach konsensusu monitory decydują się na zbiór wiadomości przeznaczonych do dostarczenia. Po uzyskaniu konsensusu każdy monitor dostarcza wiadomości z tego zbioru w uzgodnionym porządku */ when do for all do end for end when when end when /* W momencie aktywacji procesu */ when do do zmiennej przypisywana jest wartośd end when Złożoność Przedstawiony algorytm wymaga kroków i wymiany wynosi zatem , natomiast złożonośd komunikacyjna- . komunikatów. Jego złożonośd czasowa