Programowanie Równoległe i Rozproszone

Podobne dokumenty
SOP2 - semafory. grudzień

WYKŁAD 4 SEMAPHORES (CIĄG DALSZY) Przykład 6 Problem czytelników i pisarzy. Wykład 4 strona 1/24

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Systemy operacyjne. Zajęcia 11. Monitory

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Mechanizmy komunikacji. spotkania symetryczne (język CSP) spotkania asymetryczne (Ada) przestrzenie krotek (Linda) potoki, komunikaty i kanały (Unix)

Monitory. Jarosław Kuchta

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Klasyczne problemy współbieżności. Problem producenta i konsumenta Problem czytelników i pisarzy Problem pięciu filozofów

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Problemy czytelników i pisarzy oraz 5 ucztujących filozofów

Klasyczne problemy synchronizacji

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Monitory. Wady semafora

3URJUDPRZDQLHZVSyáELH*QHZVWS

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Równoległość i współbieżność

Równoległość i współbieżność

Programowanie wspóªbie»ne

synchronizacji procesów

Komunikacja asynchroniczna w modelu rozproszonym

synchronizacji procesów

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

Problemy współbieżności

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Proces z sekcją krytyczną. Synchronizacja procesów. Synchronizacja procesów, cd. Synchronizacja procesów, cd. Synchronizacja procesów, cd

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Programowanie współbieżne Wykład 5. Rafał Skinderowicz

Programowanie - wykład 4

Systemy operacyjne III

Ingerencja w kod systemu operacyjnego (przerwania) Programowanie na niskim poziomie (instrukcje specjalne) Trudności implementacyjne (alg.

Proces z sekcją krytyczną. Synchronizacja procesów. Synchronizacja procesów, cd. Synchronizacja procesów, cd. Synchronizacja procesów, cd

Wstęp do programowania 2

Wprowadzenie do programowania współbieżnego

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Semafory. // G - globalna dla wszystkich. // Wada - aktywne oczekiwanie Test_and_Set(Li); exit when Li = 0; end loop sekcja_krytyczna(i); G := 0;

Programowanie wielowątkowe. Tomasz Borzyszkowski

Gdy kilka procesów czyta a przynajmniej jeden dokonuje zapisu wynik odczytu zależeć może od sposobu realizacji przeplotu.

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Metody Metody, parametry, zwracanie wartości

Systemy Operacyjne synchronizacja i komunikacja procesów

Programowanie Równoległe i Rozproszone. Algorytm Kung a. Algorytm Kung a. Programowanie Równoległe i Rozproszone Wykład 8. Przygotował: Lucjan Stapp

Przeplot. Synchronizacja procesów. Cel i metody synchronizacji procesów. Wątki współbieżne

Struktury. Przykład W8_1

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Sortowanie przez wstawianie Insertion Sort

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wydział Fizyki i Informatyki Stosowanej, Uniwersytetu Łódzkiego Łódź. Java podstawy języka, wykład 4 1

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Synchronizacja procesów

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Programowanie Równoległe i Rozproszone

Synchronizacja procesów i wątków

Podstawy Programowania

Wstęp do programowania

Programowanie współbieżne Wykład 4. Rafał Skinderowicz

Podstawy Programowania Obiektowego

Wykład 4: Klasy i Metody

Wykład 8: klasy cz. 4

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Wykład 3 Składnia języka C# (cz. 2)

Programowanie wspóªbie»ne

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Programowanie współbieżne i rozproszone w języku Java

KOLEJKA (QUEUE) (lista fifo first in, first out)

Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

Programowanie komputerowe. Zajęcia 7

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

PARADYGMATY PROGRAMOWANIA Wykład 4

Języki programowania obiektowego Nieobiektowe elementy języka C++

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Jerzy Nawrocki, Wprowadzenie do informatyki

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Język Java wątki (streszczenie)

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie współbieżne Zadanie nr 4 Spotkania

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Synchronizacja procesów

Podstawy Programowania C++

Jerzy Nawrocki, Wprowadzenie do informatyki

Klient-Serwer Komunikacja przy pomocy gniazd

C++ Przeładowanie operatorów i wzorce w klasach

Język C++ wykład VIII

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Strategia "dziel i zwyciężaj"

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Systemowe mechanizmy synchronizacji procesów

Programowanie w Ruby

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Transkrypt:

Programowanie Równoległe i Rozproszone Lucjan Stapp Wydział Matematyki i Nauk Informacyjnych Politechnika Warszawska (l.stapp@mini.pw.edu.pl) 1/30 PRiR MONITOR klasa z następującymi właściwościami: wszystkie zmienne, typy, funkcje, deklaracje procedur znajdujące się w monitorze są prywatne (tzn. niepubliczne) z jednym wyjątkiem: funkcje (procedury) wejściowe (ang. entry) są publiczne. w dowolnym momencie co najwyżejjedna funkcja wejściowa danej instancji monitora może być wykonywana 2/30 PRiR Są dwa stany monitora: wolny (ang. free) żadna funkcja wejściowa (entry) nie jest wykonywana zajęty (ang. busy) dokładnie jedna funkcja wejściowa (entry) jest wykonywana 3/30 PRiR Przygotował: Lucjan Stapp 1

predefiniowany typ QUEUE typ danych (FIFO) z dwiema operacjami: void delay() jeśli proces wykonuje operację delay(), jego wykonywanie jest wstrzymywane i jest umieszczany na końcu kolejki q, monitor staje się wolny; delay() jest wykonywana wewnątrz funkcji wejściowej, więc monitor jest zajęty, gdy ta akcja się rozpoczyna. 4/30 PRiR predefiniowany typ QUEUE typ danych (FIFO) z dwiema operacjami (cd): void continue() proces P, który wykonuje q.continue() kończy swoje operacje wewnątrz monitora. Jeśli QUEUE q jest niepusta, pierwszy proces (P ) znajdujący się w QUEUE q wznawia swoje wykonywanie od pierwszej operacji po tym wywołaniu delay(), które umieściło P w q. Monitor jest cały czas zajęty. Jeśli QUEUE q jest pusta, monitor staje się wolny. 5/30 PRiR Schemat producent konsument z jednoelementowym buforem: 6/30 PRiR Przygotował: Lucjan Stapp 2

class buffer: public monitor int full = 0; /*full==0 wtw bufor jest pusty */ QUEUE qp, qc; /* qp kolejka producentów, qc - kolejka konsumentów */ product b; /* miejsce w buforze */ void entry::put(product S ); /*umieszczanie w buforze */ if (full) qp.delay(); /*bufor pełny, producent musi czekać*/ b=s; full=1; /*teraz bufor jest pełny */ qc.continue(); /* jeżeli czeka konsument..*/ void entry::get(product *S); /*pobieranie z bufora */ if (!full) qc.delay(); /*bufor jest pusty, konsument musi czekać */ S=b; full=0; /* teraz bufor jest pusty */ qp.continue(); /*jeżeli czeka producent. */ /* koniec monitora */ 7/30 PRiR process::producer (buffer B); product x; product production()...; void main() while(1) x = production(); B.put(x); process::consumer (buffer B); product x; void consumption()...; void main() while(1) B.get(&x); Consumption(); 8/30 PRiR Schemat producent konsument z jednoelementowym buforem, n producentów, m konsumentów Kod dla producenta, konsumenta i bufora nie ulega zmianie. 9/30 PRiR Przygotował: Lucjan Stapp 3

Schemat producent konsument, każdy proces działa jako producent i konsument: 10/30 PRiR Kod monitora buffer nie zmienia się.. process::prod_cons (buffer BL,BR); product x,y; product production()...; void consumption(product y)...; void main() while(1) x=production(); BR.put(x); BL.get(&y); consumption(y); 11/30 PRiR UWAGA (ZŁE ROZWIĄZANIE - deadlock): void main() while(1) x=production(); BL.get(&y); BR.put(x); consumption(y); 12/30 PRiR Przygotował: Lucjan Stapp 4

Schemat producent konsument z k - elementowym buforem, n producentami, m konsumentami: 13/30 PRiR Schemat producent konsument z k - elementowym buforem, n producentami, m konsumentami: Kod dla procesu jest taki sam jak dla jednoelementowego bufora, tylko kod monitora ulega zmianie. 14/30 PRiR class buf_k: public monitor (int k); /* k the size of buffer */ int first_free=0; /* wskaźnik do pierwszej wolnej komórki w buforze b*/; int first_occ=0; /* wskaźnik do pierwszej zajętej komórki w buforze b */; int no_of_elem = 0; /* liczba zajętych elementów w buforze*/ product b[]; /* bufor */ QUEUE qp, qc; /* qp kolejka producentów, qc kolejka konsumentów */ 15/30 PRiR Przygotował: Lucjan Stapp 5

void entry::put(product S ); /* umieszczenie w buforze */ if (no_of_elem==k) qp.delay(); /*bufor jest pełny, producent musi czekać */ no_of_elem++; b[first_free]=s; first_free+++; /* first_free=(first_free+1)%k; */ qc.continue(); /* jeżeli czeka konsument */ void entry::get(* product S); /*pobieranie z bufora */ if (no_of_elem==0) qc.delay(); /*bufor jest pusty, konsument musi czekać */ S=b[first_occ]; no_of_elem --; first_occ+++; /* first_occ=(first_occ+1)%k; */ qp.continue(); /*jeżeli czeka producent */ /* koniec kodu monitora buf_k */ 16/30 PRiR Czytelnicy i pisarze z priorytetem dla pisarzy Przypomnijmy sobie opis problemu: 1. Jest n czytelników i m pisarzy oraz jedna wspólna strona do komunikacji. 2. Każdy czytelnik czyta ze strony, każdy pisarz może pisać na stronie. 3. Wielu czytelników może naraz czytać stronę. 4. Pisarz zajmuje stronę na wyłączność (żaden inny proces pisarz czy czytelnik - nie może używać w tym czasie strony). 5. Pisarze są uprzywilejowani, co oznacza, że jeśli pisarz chce pisać, żaden czytelnik nie może zacząć czytać. 6. Nie ma priorytetów wśród pisarzy. 7. Nie ma ograniczeń czasowych na czytanie i pisanie, ale operacje te są skończone. 17/30 PRiR Czytelnicy i pisarze z priorytetem dla pisarzy: 18/30 PRiR Przygotował: Lucjan Stapp 6

Czytelnicy i pisarze z priorytetem dla pisarzy: Rozwiązanie: Pisarz: Robi coś; Chce pisać; Pisze; Informuje, że skończył pisać; Czytelnik: Robi coś; Chce czytać; Czyta; Informuje, że skończył czytać; 19/30 PRiR class reader_writer: public monitor int n_of_readers = 0; /* liczba aktualnie czytających procesów */ int n_of_ writers = 0; /* liczba aktualnie czekających pisarzy */ int writing = 0; /*writing > 0 pisarz pisze */ QUEUE q_of_r, q_of_w; /* q_of_r kolejka czytelników, q_of_w kolejka pisarzy */ 20/30 PRiR void entry::start_of_reader (); if (n_of_writers > 0 writing > 0) q_of_r.delay(); n_of_readers + + ; q_of_r.continue(); void entry::end_of_reader (); n_of_readers --; if (n_of_readers ==0) q_of_w.continue(); /* koniec kodu monitora */ void entry::start_of_writer (); if (writing >0 n_of_readers > 0) n_of_writers ++; q_of_w.delay (); n_of_writers--; writing = 1; void entry::end_of_writer (); writing = 0; if ( n_of_writers > 0) q_of_w.continue (); q_of_r. continue( ); 21/30 PRiR Przygotował: Lucjan Stapp 7

n filozofów jedzących rybę: 22/30 PRiR n filozofów jedzących rybę: Opis problemu: Jest n filozofów siedzących dookoła okrągłego stołu, każdy na swoim miejscu. Jest n talerzy i n widelców na stole. Talerze znajdują się na wprost filozofów, widelce leżą pomiędzy talerzami. Do jedzenia ryby filozof potrzebuje obu widelców leżących obok niego. 23/30 PRiR Czynności filozofa: loop Myśli Chce podnieść widelce - Try_to_take_his_forks Je rybę posługując się dwoma widelcami Odkłada widelce - Put_down_forks 24/30 PRiR Przygotował: Lucjan Stapp 8

Rozwiązanie Procedura Try_to_take_his_forks Czekaj, aż oba widelce będą wolne Podnieś oba widelce Procedura Put_down_forks: Odłóż widelce - w dowolnej kolejności. Obudź sąsiada, który czeka na widelec (tylko, gdy jego drugi widelec jest wolny): Musimy tu być bardzo ostrożni, gdy obaj sąsiedzi czekają i oba odpowiednie widelce są wolne. 25/30 PRiR class TABLE: public monitor (int n); /* w poniższych operacjach +1,-1, +2, -2 są liczone modulo n */ int Fork [n]=0, WaitPh[n]=0, Wait=0; /*WaitPh[i] == 1 wtw i-ty filozof czeka*/ QUEUE qph[n]; void entry::trytotakeforks(int NofPh); if(fork[nofph]>0 Fork[NofPh-1]>0) WaitPh[NofPh]=1; qph[nofph].delay( ); WaitPh[NofPh]=0; ; Fork[NofPh]=1; Fork[NofPh-1]=1; if (Wait>0) Wait=0; qph[nofph+2].continue(); ; ; /* end of monitor TABLE */ void entry::putdownforks(int NofPh); Fork[NofPh]=0; Fork[NofPh-1]=0; if (WaitPh[NofPh+1]>0 && Fork[NofPh+1]==0) Wait = 1; if (WaitPh[NofPh-1]>0 && Fork[NofPh-2]==0) qph[nofph - 1 ].continue(); if (Wait) Wait = 0; qph[nofph + 1 ].continue(); ;; 26/30 PRiR process::phil (int NofPh, table TABLE); thinking(); table.trytotakeforks(nofph); eating(); table.putdownforks(nofph); 27/30 PRiR Przygotował: Lucjan Stapp 9

Jedzący filozofowie: szarzy filozofowie kontra biali filozofowie 28/30 PRiR Czynności filozofa nie zmieniają się. Proces podnoszenia widelców jest taki sam. Proces odkładania (putting_down_forks) filozofa z grupy szarych filozofów jest następujący: Zaczekaj, aż obaj sąsiedzi z grupy szarych filozofów zaczną jeść, Odłóż widelce. Efekt: Biali filozofowie nigdy nie jedzą zostaną zagłodzeni. 29/30 PRiR Definicja: Zagłodzenie(ang. starvation) występuje, gdy proces (albo grupa procesów) czeka w nieskończoność na wspólny zasób. Uwaga: Istnieje możliwość zagłodzenia w przypadku problemu czytelników i pisarzy z priorytetem dla pisarzy: czy to błąd? 30/30 PRiR Przygotował: Lucjan Stapp 10