Distribuovaná synchronizace Využití kritické sekce při vzájemném vyloučení v distribuovaném systému Paralelní a distribuované systémy 11. Přednáška Vzájemné vyloučení Logicky distribuovaný systém s vlákny Semafory, zámky yzicky distribuovaný systém? Procesy běží na různých procesorech Distribuované algoritmy vzájemného vyloučení: Lenka Carr Motyčková! Algoritmy: Centralizované Lamportův Ricart-Agrawala Maekewa Suzuki-Kasami Raymondův DM: Centralizovaný algoritmus Centralizovaný algoritmus - fronta procesů Jeden z procesů je vybrán jako koordinátor, např. proces nejvyšším ID Proces, který chce vstoupit do KS pošle koordinátorovi zprávu request Koordinátor rozhodne, který proces vstoupí do KS jako další a pošle tomuto procesu zprávu reply Proces, který přijme zprávu reply vstoupí do KS Po opuštění KS pošle proces zprávu release koordinátorovi a pokračuje ve své činnosti Algoritmus potřebuje pro vstup do KS tři zprávy: request reply release Centralizovaný algoritmus Centralizovaný algoritmus req server busy: boolean queue reply clients release Client do true send request; reply received enter CS; send release; <other work> od Server do request received and not busy send reply; busy:= true request received and busy enqueue sender release received and queue is empty busy:= false release received and queue not empty send reply to the head of the queue od Správnost: Vzájemné vyloučení: proces musí opustit KS předtím, než do ní vstoupí další érovost: procesy vstupují do KS v pořadí, ve kterém požadovaly vstup Uváznutí: koordinátor vydá další povolení ke vstupu do KS, pokud předchozí proces z KS vystoupí Nevýhody: Vznik bottlenecku Algoritmus selže, když se proces - koordinátor zastaví 1!
Distribuovaný algoritmus Distribuovaný algoritmus Centralizovaný koordinátor Distribuovaný koordinátor - množina arbitrů = quorum S i P i S i Každá dvojice procesů má alespoň jednoho společného arbitra : quorum - množina arbitrů: S i S j Každý proces má stejnou odpovědnost v roli člena quora (D) počet quor S k, pro která P i S k je D Každý proces musí vynaložit stejné úsilí při vstupu do KS: S i = K Síť musí být úplně propojená Kanály jsou IO a jsou spolehlivé P i P j S i S j Předpoklady: Velikost quora je N (D = K = N) Síť musí být úplně propojená: rozeslání = broadcast Kanály jsou IO Zpráva je doručená v konečném čase Request (T i,i) - zpráva obsahuje časová razítka Každý proces si vytváří uspořádanou frontu zpráv Request(s) Vstup do KS: P i uloží zprávu Request(T i,i) do své vlastní fronty a rozešle ji P j uloží zprávu Request(T i,i) do své vlastní fronty a odpoví procesu i : Reply(T j,j) Pi vstoupí do KS právě, když A) jeho vlastní požadavek je na začátku jeho vlastní fronty a B) P i přijal zprávy Reply s časovým razítkem starším než (T i, i) od všech ostatních procesů =>! Právě jeden proces je v KS:! P i musel také dostat všechny požadavky Request s časovými razítky menšími než (T i, i) (P i už dostal všechny požadavky starší než je jeho vlastní) Výstup z KS: P i odstraní svůj požadavek ze své fronty P i rozešle Release (T i, i) P j odstraní Request (T i,i) ze své fronty reply(t k ) Komunikační složitost: 3(N - 1) req(t s, P o ) req(t m, P i ) 2!
Princip: P j odešle zprávu Reply(T j,j) právě když nežádá o vstup do KS nebo jeho žádost má časové razítko (T j, j) > (T i,i) Jinak je zpráva Reply odložena na pozdější dobu P i vstoupí do KS až potom, co přijme zprávy Reply od všech ostatních procesů 2(N-1) zpráv Algoritmus: Když chce proces P i vstoupit do KS, vygeneruje nové časové razítko, (T i,i), a pošle zprávu Request (T i,i) všem ostatním procesům Když proces P j přijme zprávu Request (T i,i), buď okamžitě odpoví nebo odpověď odloží Když proces P i přijme zprávy Reply od všech ostatních procesů může vstoupit do KS Po opuštění KS proces pošle zprávy Reply(T i,i) všem odloženým procesům Algoritmus pokrač.: Rozhodnutí, zda proces P j odpoví na zprávu Request (T i,i) okamžitě nebo odloží odpověď, záleží na třech faktorech : jestliže je P j v KS, potom odpověď procesu P i odloží jestliže P j nechce vstoupit do KS, potom pošle procesu P i odpověď okamžitě jestliže chce proces P j vstoupit do KS, ale ještě tak neučinil, potom srovná časové razítko svého vlastního požadavku s časovým razítkem (T i,i) jestliže je časové razítko vlastního požadavku větší než (T i,i), potom pošle okamžitě zprávu Reply(T j,j) procesu P i (proces P i požádal o vstup do KS dříve) jinak je odpověď Reply odložena or each process requesting an access to CS:! my-request := true; #rec :=0;! broadcast <Request, Ti, i>;! while #rec < N - 1 do receive <Reply, Tj, j>; #rec ++; enter CS;! my-request := false;! k := 1;! while (k < N) do if Postponed[k]! then begin send <Reply, Ti, i> to k;! Postponed[k] := false; k++;! : příklad or each process upon receipt of receive <Request, Tj, j>:! if (my_request and (Ti,i) < (Tj,j) )! //pokud je v KS, tak podmínka vždy platí! then Postponed [j] := true! else send <Reply, Ti, i> to j;! 3!
: správnost : nedostatky Absence uváznutí je zaručena, protože vstup do KS je řízen pořadím časových razítek Proces musí znát identitu všech ostatních procesů v systému, což komplikuje dynamické přidávání a odstraňování procesů do/ze systému Absence stárnutí je zaručena, (žádosti posouvají časová razítka) Jestliže jeden z procesů přestane pracovat celý systém se zhroutí Pořadí časových razítek zaručuje že procesy jsou obslouženy způsobem firstcome, first served Počet zpráv nutných ke vstupu do KS Problém může být vyřešený kontinuálním monitorováním stavu všech procesů v systému Tento algoritmus je vhodný pro malé a stabilní systémy spolupracujících procesů 2(N 1) Ricarto Agrawalův algoritmus je symetrický Maekavův algoritmus tento požadavek uvolňuje quorum - množina arbitrů: S 1 = = S N = K Každý proces musí vynaložit stejné úsilí při vstupu do KS (K požadavků) Každá dvojice procesů má alespoň jednoho společného arbitra: S i S j P i S i S i vždy obsahuje proces P i N počet quor (podmnožin) = počet uzlů D.. P i je členem D quor = počet duplikací K.. počet procesů v každém quoru # quor N * # členů K = # uzlů N # duplikací D N * K / D = N => D = K v quoru je K procesů, každý je členem D quor j: P j je členem D quor S k tj. každý proces má stejnou odpovědnost jako člen různých quor Je potřeba přesně N quor: N = (D - 1) K + 1 N = (K - 1) K + 1 => K N Algoritmus s předáváním příznaku <Request, i > z procesu P i všem členům S i Jestliže člen quora není zamčený, odpoví YS a zamče se (odpovídá na první požadavek) Jestliže je proces už zamčený, uloží požadavek do uspořádané fronty a na požadavek neodpoví Když proces P i vstoupí do KS, všichni členové jeho quora S i musí být zamčení Když proces P i přijme zprávy YS od všech procesů P k S i P i vstoupí do KS Když proces P i opustí KS rozešle zprávy Release všem členům quora S i a odemče je Komunikační složitost O(K) = O( N ) Příznak obíhá mezi procesy Příznak je zvláštní typ zprávy Jestliže proces drží příznak, může vstoupit do KS Procesy jsou logicky uspořádané do kruhu, stromu nebo úplného grafu Jednosměrný kruh zaručuje absenci stárnutí procesů Algoritmus může mít dva typy poruch: Ztráta příznaku musí se zvolit jeden proces, který vlastní příznak Nefunkční proces musí se vytvořit nový logický kruh 4!
Suzuki - Kasami algoritmus Příznak = obsahuje pole token[n] časových razítek, které označují kdy naposled proces Pi přijal příznak a vstoupil do KS token [ ] 1 2 n Lokální pole requests[n] časových razítek, které označují kdy naposled proces Pi požadoval vstup do KS requests [ ] 1 2 n Zprávy jsou doručené v konečném čase Síť je úplně propojená (mesh) Nejsou potřeba IO kanály Komunikační složitost : n - 1 Suzuki - Kasami algoritmus or each process requesting an access to CS:! if!have_token! then begin broadcast <Request, Ti, i>;! receive <Token>; have_token := true; using_token := true;! enter CS;! token[i] := local_time T;! using_token := false;! k := i +1;! while (k i) do if (requests[k] > token [k] and have_token)! then begin have_token := false;! send <Token> to k; (k++) mod N; Suzuki - Kasami algoritmus or each process upon receipt of <Request,Tj,j>:! requests[j] := max(requests[j], Tj);! if have_token and!using_token! then k := i +1;! while (k i) do if (requests[k] > token [k]) and! have_token! then begin have_token := false;! send <Token> to k; end;! (k++) mod N;! end;! Raymondův algoritmus Logická stromová topologie Zprávy se posílají jenom ve stromu Komunikační složitost odpovídá ~ výšce stromu = log N Proces, který vlastní příznak smí vstoupit do KS Požadavky jsou ukládány do fronty v každém uzlu podle časových razítek HOLDR A = D HOLDR D = A D A D B C B C Raymond s algorithm Distribuované algoritmy vzájemného vyloučení A D A D B C B C HOLDR B = A HOLDR C = A HOLDR = self HOLDR = D HOLDR A = D HOLDR D = A žádá o vstup do KS -> HOLDR A = D D žádá o příznak : HOLDR D = opustil KS a předá příznak žádajícímu sousedovi, nastaví HOLDR = D D : HOLDR D = A: pošle příznak uzlu A 5!