Programowanie Równoległe i Rozproszone Lucjan Stapp Wydział Matematyki i Nauk Informacyjnych Politechnika Warszawska (l.stapp@mini.pw.edu.pl) 1/40 PRiR SYSTEMY ROZPROSZONE Powody użycia systemów rozproszonych: dzielenie obciążenia (ang. load sharing) lepsze użycie dostępnej mocy obliczeniowej; dzielenie zasobów (ang. resource sharing) wspólne użycie (dostęp) drogich zasobów albo rzadko używanych urządzeń; dzielenie danych (ang. data sharing) dostęp do rozproszonych baz danych; struktura geograficzna może być rozproszona; struktura logiczna może być prostsza; niezawodność systemu może zostać zwiększona przez swą strukturę; elastyczność systemu jest zwiększona, zyskuje możliwość dodawania usuwania pojedynczych jednostek (np. procesora); 2/40 PRiR SYSTEMY ROZPROSZONE Charakterystyka systemów rozproszonych kryterium logiczne: zwielokrotnienie zasobów współ-używanych; elementy odpowiedzialne za komunikację posiadają widoczne bądź ukryte poziomy kontroli; kontrola wykonywania jest przeprowadzana na całym systemie przez kilka procesów bez połączeń hierarchicznych i nie mających spójnego poglądu na cały system; procesy mają rozłączne przestrzenie adresowe i komunikują się przez jawne przekazywanie komunikatów. 3/40 PRiR Przygotował: Lucjan Stapp 1
SYSTEMY ROZPROSZONE RODZAJE ARCHITEKTUR ROZPROSZONYCH jednokierunkowy pierścień (ang. ring) dwukierunkowy pierścień (ang. bi-directional ring) 4/40 PRiR SYSTEMY ROZPROSZONE RODZAJE ARCHITEKTUR ROZPROSZONYCH drzewa 5/40 PRiR SYSTEMY ROZPROSZONE RODZAJE ARCHITEKTUR ROZPROSZONYCH gwiazda pełne połączenie bardzo kosztowne, bardzo trudne do zaprojektowania 6/40 PRiR Przygotował: Lucjan Stapp 2
Modele są używane do dokładnego zdefiniowania żądanych charakterystyk systemu: co nie jest zdefiniowane -nie może być zweryfikowane, a co nie jest zweryfikowane może być błędem. Zadania modelu to: dokładne zdefiniowanie specyficznych własności i charakterystyk budowanego lub analizowanego systemu; dostarczenie podstaw do zweryfikowania tych własności. 7/40 PRiR Różne modele są stosowane do określania różnych właściwości. Aby wyrazić konkretną cechę systemu trzeba wybrać z klasy modeli te, które reprezentują tę właściwość. 8/40 PRiR Rodzaje właściwości niezbędnych do rozwoju systemu rozproszonego: zbiory, sekwencje, struktury danych; przekształcanie jednego zbioru danych w inny i zrozumiałe relacje wejścia/wyjścia pomiędzy przekształceniami i zbiorami danych; sekwencyjność i wielobieżność zbiorów danych, które są dostarczane albo generowane w różnych momentach czasu; przekształcanie jednej sekwencji czasowej w drugą. 9/40 PRiR Przygotował: Lucjan Stapp 3
Rodzaje właściwości niezbędnych do rozwoju systemu rozproszonego (c.d.): sekwencje przekształceń; przepływ danych pomiędzy przekształceniami; wielobieżność transformacji; kontrola interakcji pomiędzy równoległymi przekształceniami; czas potrzebny na wykonanie przekształceń; niezawodność/osiągalność wykonania przekształcenia w środowisku (generowanie i rodzaje błędów). 10/40 PRiR Diagram przepływu (ang. flow chart) zazwyczaj opisuje sekwencje, wybory i poszczególne kroki przetwarzania. Charakterystyka przepływu danych, równoległość i sprawność nie są reprezentowane. Jest to istotne dla reprezentowania sekwencyjnych programów, ale niewystarczające dla problemów rozproszonego programowania. 11/40 PRiR Modele systemów rozproszonych: graf zależności; sieci Petri; algebra procesów; modele aktorów (ang. actor model); teoria śladów (ang. theory of traces). 12/40 PRiR Przygotował: Lucjan Stapp 4
Graf zależności to skierowany acykliczny graf reprezentujący relację zależności (skończona, symetryczna, zwrotna). Diagram zależności to wizualna reprezentacja grafu zależności. W tym diagramie krawędzie prowadzą od każdego modułu do wszystkich modułów, które są od niego (modułu wyjściowego) zależne. 13/40 PRiR Sieci Petri Sieci Petri zostały zdefiniowane w latach 60. XX wieku przez Carla Adama Petriego. Sieć Petri (zwana także siecią miejsce/ tranzycja (place/transition) lub P/T net) to matematyczna reprezentacja dyskretnych systemów rozproszonych. Przez swoją zdolność do wyrażania współbieżnych zdarzeń uogólniają one teorię automatów Sieć Petriego w najprostszej wersji składa się z "miejsc", "tranzycji" oraz krawędzi skierowanych. Taką siecią można jedynie opisać układ jako statyczne połączenie możliwych do osiągnięcia stanów. 14/40 PRiR Sieć Petri Sieć Petriego w najprostszej wersji składa się z "miejsc", "tranzycji" oraz krawędzi skierowanych. Taką siecią można jedynie opisać układ jako statyczne połączenie możliwych do osiągnięcia stanów. Aby opisać konkretny stan układu, potrzebne są "żetony", które można przemieszczać pomiędzy miejscami poprzez przejścia - po krawędziach grafu. http://pl.wikipedia.org/wiki/sie%c4%87_petriego 15/40 PRiR Przygotował: Lucjan Stapp 5
Sieć Petri Tradycyjnie miejsce oznacza się okręgiem, w którym można umieścić żeton prezentowany przez koło. W jednym miejscu może znajdować się dowolna, nieujemna liczba żetonów. Tranzycje oznacza się prostokątami lub kreskami, a krawędzie to strzałki. Krawędzie mogą mieć wagi większe lub równe 1. Wagi równej 1 nie oznacza się, tak jak pokazano na rysunku. Waga określa, ile dokładnie żetonów przechodzi po krawędzi. http://pl.wikipedia.org/wiki/sie%c4%87_petriego 16/40 PRiR Sieć Petri Przejście może być aktywne lub nie. Przejście aktywne to takie, którego wszystkie krawędzie wejściowe połączone są z miejscami mającymi żetony w takiej ilości, że jest ona większa lub równa wadze odpowiednich krawędzi. http://pl.wikipedia.org/wiki/sie%c4%87_petriego 17/40 PRiR Sieć Petri Tylko przejście aktywne może być odpalone. Odpalenie przejścia to zabranie z wszystkich miejsc wejściowych tylu żetonów, ile wynika z wag krawędzi łączących miejsca z przejściem. Następnie na miejscach wyjściowych połączonych z przejściem pojawiają się żetony. Ilość żetonów "wchodzących" i "wychodzących" z przejścia nie musi być taka sama. W jednym ruchu można odpalić tylko jedno przejście. http://pl.wikipedia.org/wiki/sie%c4%87_petriego 18/40 PRiR Przygotował: Lucjan Stapp 6
Sieć Petri Wykonanie sieci Petri jestniedeterministyczne, co oznacza: Wielokrotne tranzycje mogą być możliwe do odpalenia w tym samym czasie, ale nie muszą odpalić; Być może żadna nie odpali odpalanie jest na życzenie, w czasie pomiędzy 0 a nieskończonością (a możliwe jest też, że nie odpali w ogóle). Ponieważ odpalanie jest niedeterministyczne, sieci Petri są dobrym narzędziem do modelowania systemów rozproszonych. 19/40 PRiR Algebra procesów (ang. processalgebralub process calculi) Algebra procesów dostarcza narzędzi do wysokopoziomowego opisu interakcji, komunikacji i synchronizacji na zbiorze niezależnych agentów (procesów). Algebra procesów dostarcza także praw algebraicznych umożliwiających opis procesów. Umożliwia to ich analizę, dostarcza także narzędzi do formalnego analizowania równoważności procesów. 20/40 PRiR Algebra procesów Najbardziej znane przykłady algebry procesów to: Communicating Sequential Processes CSP to formalny język dla opisu wzorców interakcji w systemach współbieżnych. CSP zaproponował w 1978 C. A. R. Hoare. Calculus of Communicating Systems (CCS) to algebra procesów stworzona przez Robina Milnera. Umożliwia modelowanie nieprzerywalnej komunikacji pomiędzy dokładnie dwoma uczestnikami. Język formalny umożliwia opis takich działań jak złożenie równoległe, wybór akcji i ograniczenie zakresu operacji równoległej. 21/40 PRiR Przygotował: Lucjan Stapp 7
Algebra procesów Najbardziej znane przykłady algebry procesów to: Algebra of Communicating Processes (ACP) nie do końca wykorzystana metoda wnioskowania o systemach współbieżnych π calculus rozszerzenie CCS. 22/40 PRiR Algebra procesów Najbardziej znane przykłady algebry procesów to: ambient calculus jest używany do opisu i wnioskowania o własnościach systemów współbieżnych, których cechą podstawową jest mobilność (mobility). Mobilność oznacza tu zarówno obliczenia na ruchomych urządzeniach (sieć ma zmienną, dynamiczną topologię), jak też mobilne obliczenia (tzn. kod wykonalny może być przemieszczany na sieci do różnych węzłów). Ambient calculus dostarcza jednorodnego środowiska do modelowania obu tych rodzajów mobilności. Jest to dziś podstawowe narzędzie do modelowania zachowań w Internecie. 23/40 PRiR Algebra procesów Najbardziej znane przykłady algebry procesów to: PEPA (Performance Evaluation Process Algebra) to stochastyczna algebra procesów stworzona do modelowania systemów komunikacyjnych ze szczególnym uwzględnieniem roli poszczególnych węzłów (komputerów) komunikacyjnych. Jest to rozszerzenie klasycznych algebr procesów takich jak CCS i CSP. Z każdą aktywnością związana jest zmienna losowa oznaczająca oczekiwany zakres wykonania tej aktywności. 24/40 PRiR Przygotował: Lucjan Stapp 8
Programy rozproszone charakteryzują się przez: brak globalnej kontroli; brak globalnej pamięci; niezależność prędkości wykonywania od równoległych procesów; niedeterminizm wykonywania. 25/40 PRiR Algorytmy rozproszone składają się z 2 części. Są to: wiadomości (struktura wiadomości i sposób ich wysyłania); procesy (algorytmy równoległe). Dawniej algorytmy rozproszone były implementowane w systemach operacyjnych. 26/40 PRiR Link jest ścieżką komunikacyjną (ang. communication path) pomiędzy dwoma komputerami. W obszarze zasobów programy rozproszone są nazywane protokołami (ang. protocols). Kontrolują przesyłanie informacji i procesy powiązane z zasobami. 27/40 PRiR Przygotował: Lucjan Stapp 9
Protokoły dzielą się na uzgodnienia i konwencje. Definicja protokołu określa standardowy kanał komunikacji (wirtualną ścieżkę) pomiędzy łączącymi się urządzeniami. Typowe zagadnienia, które trzeba brać pod uwagę: Elementy danych bity, zmienne znakowe, pakiety, komunikaty, pliki, zadania; Uzgodnienia kod konwencji, formaty, szybkość ścieżki, kontrola sekwencji; Wirtualna ścieżka struktury adresowe, priorytety, sekwencyjność, kontrola błędów, kontrola wykonywania, itd.; 28/40 PRiR Warstwy protokołów i ich funkcje: warstwa aplikacji (ang. application layer) transfer pieniędzy, poczta elektroniczna, edycja tekstu itd.; warstwa prezentacji (ang. presentation layer) różnice pomiędzy węzłami w tej samej sieci; warstwa sesji; warstwa transportowa (ang. transport layer) przesyłanie plików, wsparcie dla wirtualnych terminali; końcowa warstwa odbiorcy (ang. subscriber end-to-end layer) komunikacja międzyprocesowa (np. virtual circuit, czas rzeczywisty, transmitowanie); warstwa dostępu do sieci (ang. network access layer) usługa dostępu do sieci (np. virtual circuit, transmisja itd.); 29/40 PRiR Warstwy protokołów i ich funkcje: warstwa intranetu (ang. intranet layer) - end-to-end - kontrola wykonywania, sekwencjalizacja; warstwa intranetu węzeł do węzła kontrola zatorów, wyznaczanie trasy; warstwa połączeń (ang. link control level) zarządzanie błędami, kontrola połączeń. Protokół połączeń jest najniższą warstwą funkcyjną, poniżej znajdują się fizyczne/elektroniczne warstwy. 30/40 PRiR Przygotował: Lucjan Stapp 10
W systemach rozproszonych programy działające rozproszenie nazywane są programami rozproszonymi. Najważniejsze problemy związane z zarządzaniem systemem rozproszonym to: wzajemne wykluczanie (ang. mutual exclusion); wybór koordynatora; zakleszczenia (deadlock) - zapobieganie i wykrywanie; wyłączenie działającego systemu; zarządzanietransferami (by bipoints and multipoint); zarządzanie zdublowanymi zadaniami (affords). 31/40 PRiR Stopień podziału niesymetrycznie każdy proces wykonuje swój własny algorytm symetrycznie: symetria kodu (każdy proces ma swoją nazwę i procedura zależy od nazwy); silna symetria procedura nie zależy od nazwy, ale od typu wiadomości; pełna symetria wszystkie procesy wykonują tę samą procedurę. 32/40 PRiR Pisanie algorytmów rozproszonych jest łatwiejsze, jeśli mamy do dyspozycji monitor rozwiązujący ten problem. Zostanie to pokazane na przykładzie problemu producent - konsument. 33/40 PRiR Przygotował: Lucjan Stapp 11
class buffer : public monitor; { message box [n]; /* bufor składa się z n komórek */ int first_free, first_occ = 0; /* first_free numer pierwszej wolnej komórki */ /* first_occ numer pierwszej zajętej komórki */ int begprod, endprod, begcons, endcons = 0; queue p,c; void put (message m); { if (begprod-endcons >=n ) p.delay(); begprod ++ ; box [first_free] = m; first_free=(first_free + 1)%n ; endprod ++; if (begcons - endprod < 0) c.continue(); } /* end of buffer */ /*początki produkcji, końce produkcji */ /*początki konsumpcji, końce konsumpcji */ void get (message * m); { if (begcons-endprod >= 0) c.delay(); begcons ++ ; m = box [first_occ]; first_occ = (first_occ + 1 ) % n ; endcons ++; if (begprod endcons<n) p.continue(); 34/40 PRiR process::producer (buffer B); message m; message production () {... void main() { while(1) { m=production(); B.put(m); process::consumer (buffer B); message m; void consuption (message m) {... void main() { while(1) { B.get(&m); consuption (m); 35/40 PRiR ROZPROSZONE ROZWIĄZANIE PROBLEMU PRODUCENT -KONSUMENT n - elementowy bufor jest w posiadaniu konsumenta PRODUCENT WIADOMOŚĆ przyrost bufor KONSUMENT 36/40 PRiR Przygotował: Lucjan Stapp 12
Algorytm producenta: process::producer (); type message; /* typ produktu */ type incrementation; /* typ dodatkowej informacji wysyłanej przez konsumenta */ message m; int begprod, c_endcons = 0,0; /*początek produkcji, koniec konsumpcji konsumenta */ message production () {... 37/40 PRiR Algorytm producenta(cd.): void produce_and_send (message * m) { if (begprod-c_endcons <n) { begprod ++ ; m=production (); send (m) ; void acceptation ( incrementation i) { c_endcons ++; void main() { while(1) { if (incrementation_received ) acceptation (i); produce_and_send (message * m); 38/40 PRiR Algorytm konsumenta: process::consumer (); type message; /* typ produktu */ type incrementation; /* typ dodatkowej informacji wysyłanej przez konsumenta */ message m; incrementation i; message box [n]; int first_free, first_occ = 0; /*first_free numer pierwszej wolnej komórki */ /*first_occ numer pierwszej zajętej komórki */ int begcons, endprod = 0; /*początki konsumpcji, końce produkcji */ 39/40 PRiR Przygotował: Lucjan Stapp 13
Algorytm konsumenta(cd): void consumption () { if (begcons-endprod < 0) { begcons ++ ; m = box [first_occ] ; first_occ = ( first_occ + 1 ) % n; send (i); /* incrementation */; } void acceptation ( message m) { box [first_free ] = m; first_free = (first_free + 1 ) % n; endprod ++; } void main() { while(1) { if (message_received ) acceptation (m); consumption (); } 40/40 PRiR Przygotował: Lucjan Stapp 14