Programowanie Współbieżne. Monitory

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

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)

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

Monitory. Jarosław Kuchta

Systemy operacyjne. Zajęcia 11. Monitory

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

Monitory. Wady semafora

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

Semafory. - aktywne oczekiwanie =GRGDWNRZ\PZVSDUFLHPVSU]WRZ\P 6SHFMDOQDLQVWUXNFMDPDV]\QRZDUHDOL]XMFDDWRPRZ\]DSLVL odczyt, np.

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

SOP2 - semafory. grudzień

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

synchronizacji procesów

synchronizacji procesów

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

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

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

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Programowanie Równoległe i Rozproszone

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

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

Wprowadzenie do programowania współbieżnego

Programowanie współbieżne Zadanie numer 3 Monitory

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

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

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

Synchronizacja procesów

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

Programowanie wspóªbie»ne

Synchronizacja procesów

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

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

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

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Zagadnienia zaawansowane. Lech Kruś,

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

Pascal - wprowadzenie

Synchronizacja procesów i wątków

Informatyka 1. Przetwarzanie tekstów

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

Programowanie współbieżne Zadanie nr 4 Spotkania

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

Systemowe mechanizmy synchronizacji procesów

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowanie w Turbo Pascal

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

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Mechanizmy pracy równoległej. Jarosław Kuchta

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

Systemy Operacyjne synchronizacja i komunikacja procesów

Problemy współbieżności

Semafor ustaw_semafor(key_t nazwa, int start); Semafor usun_semafor(semafor sem); void signal(semafor sem); void wait(semafor sem);

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

Programowanie wspóªbie»ne

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

Modelowanie procesów współbieżnych

Wstęp do programowania 2

Programowanie systemów czasu rzeczywistego laboratorium. Ćwiczenie 2. Temat zajęć: pakiety, zadania, synchronizacja czasowa, mechanizm spotkań

Systemy operacyjne III

Proces y i y w i ąt ą ki

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Synchronizacja procesów

Systemy operacyjne Wzajemne wykluczanie i synchronizacja

Podstawy współbieżności

TEMAT: Podejmowanie decyzji w programie instrukcja warunkowa (IF).

Wstęp do programowania. Różne różności

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Przykład wystąpienia wyścigu. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.4/33. Wyścigi w systemie operacyjnym.

Algorytmy i struktury danych

Mikroprocesor Operacje wejścia / wyjścia

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

Detekcja zakleszczenia (1)

Pojedyncze wartości zadeklarowanego typu Ustawiane przed rozpoczęciem symulacji bez moŝliwości

Porządek dostępu do zasobu: procesory obszary pamięci cykle procesora pliki urządzenia we/wy

Klasyczne problemy synchronizacji

Podstawy programowania skrót z wykładów:

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

Komunikacja asynchroniczna w modelu rozproszonym

1. Działania na procesach

dr inż. Grażyna KRUPIŃSKA D-10 pokój 227 WYKŁAD 12 WSTĘP DO INFORMATYKI

Zasady Programowania Strukturalnego

Wrocław, dn. 19 kwietnia 2006 roku. Anna Kaleta Piotr Chojnacki IV rok, informatyka chemiczna Liceum Ogólnokształcące nr 10 we Wrocławiu

Zapis algorytmów: schematy blokowe i pseudokod 1

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

Problem detekcji zakończenia

Instrukcje cykliczne (pętle) WHILE...END WHILE

Informatyka 1. Wyrażenia i instrukcje cd., ręczna symulacja, operacje wejścia/wyjścia

Struktury. Przykład W8_1

Wstęp do programowania

Opis implementacji: Implementacja przedstawia Grę w życie jako przykład prostej symulacji opartej na automatach.

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Wstęp do programowania

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Składowane procedury i funkcje

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

Materiały do laboratorium MS ACCESS BASIC

Transkrypt:

Programowanie Współbieżne Monitory

Monitory Monitory są połączeniem dwóch idei. Monitor jako Wielki Brat. Stara koncepcja, gdzie system operacyjny był jednym programem i pełnił funkcję nadzorcy pośredniczącego między poszczególnymi procesami. Jedynie Monitor ma dostęp do pewnych obszarów pamięci Jedynie Monitor może wykonać pewne funkcje np. WE/WY Jeżeli proces 1 chce przekazać procesowi 2 to przekazuje to przez Monitor, albo pyta o możliwość bezpośredniej transmisji

Monitory strukturalizacji danych Pascal był pierwszym językiem zaprojektowanym z myślą o strukturalizacji danych poprzez mechanizm określania typów. Można określić że operacje mogą być wykonywane np. tylko z określonymi typami. Zabezpieczenie danych przed łączeniem ich kiedy nie były do tego przeznaczone. Określenie typów za pomocą operacji. Pomysł zastosowany w języku Simula 67 nosił nazwę klasy. Był to zbiór deklaracji danych wraz ze zbiorem operacji dozwolonych na nich

Monitory Klasy teraz są znane i używane. Słowo kluczowe synchronized w javie powoduje że klasa staje się monitorem. Bufor jako przykład monitora. Mamy tylko dwie operacje: Włożenie elementu Wyjęcie elementu

Monitory Definicja: Definiuje się podając zbiór deklaracji zmiennych i procedur Monitor ma też treść (w pascalu Begin i End) coś jak konstruktor. Wywoływana jest w chwili startu programu. Służy do nadania wartości początkowych. Na zewnątrz monitor jawi się jako pakiet danych i procedur Zmienne monitora są dostępne bezpośrednio tylko przez jego procedury (zmienne prywatne). Komunikacja ze światem zewnętrznym tylko przez te procedury. Zasięgiem zmiennych monitora jest sam monitor

Monitory producent konsument program producentkonsument; const rozmiarbufora = 64; monitor buforograniczony; niepusty,niepelny:condition; b:array [0..rozmiarbufora] of integer; in, out: integer; n: integer; procedure wloz(v:integer); if n = rozmiarbufora + 1 {bufor jest pelny } then {czekaj, aż nie będzie pełny} wait(niepelny); b[in]:=v; in: = in + 1; if in = rozmiarbufora + 1 then in:=0; n:=n+1; {zasygnalizuj że bufor nie jest pusty} signal(niepusty);

Monitory producent konsument procedure pobiez(var v:integer); if n=0 {bufor jest pusty } then {czekaj, az nie będzie pusty} wait(niepusty); v := b[out]; out := out + 1; if out = rozmiarbufora + 1 then out:=0; n:=n-1; {zasygnalizuj, że bufor nie jest pełny} signal(niepelny); {tresc monitora} in:=0; out:=0; n:=0; {koniec monitora buforograniczony}

Monitory producent konsument procedure producent; var v:integer; repeat produkuj(v); wloz(v) until false; procedure konsument; var v:integer; repeat pobierz(v); konsumuj(v); until false; BEGIN co; producent;konsument; coend END.

Zmienna warunkowa Zmienna warunkowa nie ma wartości w zwykłym tego słowa znaczeniu i nie wymaga inicjacji. Każdej zmiennej warunkowej jest nadawana wartość początkowa w postaci pustej kolejki procesów zatrzymanych na danym warunku. wait(c) wywołujący proces zostaje zatrzymany i umieszczony w kolejce procesów zatrzymanych na tym warunku (zakładamy że jest to FIFO). Proces czeka na spełnienie warunku c. signal(c) jeżeli kolejka nie jest pusta to reaktywujemy 1 proces z kolejki, jeżeli jest pusta to nic się nie dzieje (w semaforze zwiększaliśmy zmienną semaforową). Proces informuje że warunek c został spełniony.

Analogia do Igloo: Zmienna warunkowa procesy które czekają na zajście warunku c są zamrażane w wielkiej zamrażarce gdzie z jednej strony wchodzą z drugiej wychodzą. Wejście i wyjście zamrażarki jest w igloo, do którego najpierw procesy wchodzą. Proces opuszczający igloo tuż przed wyjściem włącza rozmrażanie. Zanim się nie rozmrozi proces czekający to żaden inny nie może wejść do igloo. Czyli realizowane jest: wymaganie natychmiastowego wznowienia Czynimy też zastrzeżenie że proces opuszczający igloo może wywołać signal tylko jeden raz

Symulacja semafora za pomocą Monitora Definicja semafora nie przewiduje kolejki FIFO ale też i nie zabrania. Każdy algorytm działający na semaforach ze słabszymi założeniami (brak FIFO) będzie działał przy mocniejszych założeniach.

Symulacja semafora za pomocą Monitora program wzajemne_wykluczanie; monitor symulacja_semafora; var zajety:boolean; niezajety:condition; Procedure P; if zajety then wait(niezajety); zajety:=true Procedure V; zajety:=false; signal(niezajety); {monitor} zajety:=false; Procedure P1; repeat P; kryt1; V; lok1; until false Procedure P2; repeat P; kryt2; V; lok2; until false; BEGIN co; P1;P2; co END.

Problem Czytelników i Pisarzy Jeżeli istnieją czekający pisarze to nowo przybyły czytelnik musi czekać na zakończenie pisania Jeżeli istnieją czytelnicy czekający na zakończenie pisania to mają oni pierwszeństwo przed następnymi pisarzami.

Problem Czytelników i Pisarzy Zastosowanie nowej procedury pierwotnej nonempty Zwraca true wtedy i tylko wtedy gdy, kolejka związana ze zmienną warunkową jako parametr zawiera inne procesy. (jeżeli jest pisarz w kolejce lub pisze to czytelnicy czekają) Monitorowe wymaganie natychmiastowego reaktywowania gwarantuje że wszyscy czekający czytelnicy będą reaktywowani zanim kolejny czytelnik będzie dopuszczony do monitora

Problem Czytelników i Pisarzy program czytelnicy_i_pisarze; monitor czytajpisz; var czytelnicy:integer; pisanie:boolean; gotowy_do_czytania:condition; gotowy_do_pisania:condition; Procedure zacznij_czytanie; if pisanie or nonempty(gotowy_do_pisania) then wait(gotowy_do_czytania); czytelnicy:czytelnicy+1; signal(gotowy_do_czytania); {kaskadowe wpuszczenie wszystkich czyt} Procedure zakoncz_czytanie; czytelnicy:czytelnicy-1; if czytelnicy=0 then signal(gotowy_do_pisania); Procedure zacznij_pisanie; if czytelnicy<>0 or pisanie then wait(gotowy_do_pisania); pisanie:=true; Procedure zakończ_pisanie; pisanie:=false; if nonempty(gotowy_do_czytania) {jeżeli są w kolejce czytelnicy to zostaną obudzeni} then signal(gotowy_do_czytania) else signal(gotowy_do_pisania) czytelnicy:=0; pisanie:=false;

Problem Czytelników i Pisarzy procedure czytelnik; repeat zacznij_czytanie; czytaj_dane; zakoncz_czytanie; until false procedure pisarz; repeat zacznij_pisanie; pisz_dane; zakoncz_pisanie; until false BEGIN co; czytelnik;pisarz;czytelnik;czytelnik;czytelnik;pisarz;... co END.

Symulacja Monitorów za pomocą Semaforów Wzajemne wykluczanie procedur monitorowych można łatwo osiągnąć używając semafora binarnego s na początku =1 Procedury monitorowe zaczynają się od wait(s) i kończą signal(s) Dla każdego warunku war potrzebujemy liczwar aby zapamiętać liczbę procesów czekających na ten warunek. Początkowo liczwar=0; Używając binarnego semafora semwar aby wstrzymać takie procesy, na początku =0;

Symulacja Monitorów za pomocą Semaforów Każdy proces wykonujący procedurę monitorową wait zawiesza swoje działanie wait(war) = liczwar:=liczwar+1; signal(s); wait(semwar); liczwar:=liczwar-1; signal(war) = zwolnienie dostępu do monitora jest po to by umożliwić wejście innym. Realizacja założenia, że procesy czekające na warunek, mają pierwszeństwo przed procesami, które zamierzają dopiero wejść do monitora. If liczwar > 0 then signal (semwar) else signal(s);

Symulacja Monitorów za pomocą Semaforów Program producent_konsument; const rozmiar_bufora=64; var b:array[0..rozmiarbufora] of integer; in,out:integer; n:integer; s:semaphore;{binarny do wzajemnego wykluczania} niepusty_sem,niepelny_sem:semaphore;{binarny} niepusty_licznik,niepelny_licznik:integer; Procedure wloz(v:integer); wait(s); if n=rozmiar_bufora+1 then niepusty_licznik:=niepusty_licznik+1; signal(s); wait(niepusty_sem); niepusty_licznik:=niepusty_licznik_1;...wkładanie... if niepelny_licznik > 0 then signal (niepelny_sem) else signal(s)

Symulacja Monitorów za pomocą Semaforów Procedure pobierz(var v:integer); wait(s); if n=0 then niepelny_licznik:=niepelny_licznik+1; signal(s); wait(niepelny_sem); niepelny_licznik:=niepelny_licznik-1;...pobieranie... if niepusty_licznik > 0 then signal(niepusty_sem) else signal(s)

Symulacja Monitorów za pomocą Semaforów Procedure producent; produkuj, włóż itd... Procedure konsument; pobierz; konsumuj; itd... BEGIN in:=0;out:=0;n:=0; s:=1; niepusty_licznik:=0;niepelny_licznik:=0; niepusty_sem:=0;niepelny_sem:=0; co; producent;konsument; co END.

Sygnały swobodne symulacja za pomocą semaforów Dotychczas było założenie że ostatnią instrukcją w monitorze był signal(zezwalający na wejście do monitora innym. teraz signal może być dowolnie wykonywany potrzeba wstrzymać proces w monitorze

Sygnały swobodne symulacja za pomocą semaforów W modelu igloo wyglądało by to tak: oprócz zamrażarki stoi szafa z automatycznymi drzwiami proces który wykonał signal wszedł by do tej szafy w szafie jest stos czyli ostatni który wszedł pierwszy wypadnie gdy proces opuści pomieszczenie to drzwi szafy automatycznie się otwierają i wypada ostatni proces. ogólnie dbamy o to by w igloo nie przebywał więcej niż 1 proces. W szczególności sygnały swobodne mogą się sprowadzić do sygnału na końcu monitora, gdy po wyjściu z szafy od razu wyjdzie z igloo. nowa zmienna pilne i nowy semafor psem do liczenia i zawieszania procesów sygnalizujących.

Sygnały swobodne symulacja za pomocą semaforów wejście: wait(s); wait(war): liczwar:=liczwar:=liczwar+1; if pilne > 0 {jeżeli po signal czekają procesy } then signal(psem) {zwolnij taki proces} else signal(s); {wpuść nowy proces} wait(semwar); liczwar:=liczwar-1; signal(war): pilne:=pilne+1; if liczwar > 0 then {jeżeli ktoś czeka} signal(semwar); {to wpuść go} wait(psem); {i zawieś swoje działanie } pilne:=pilne-1; wyjście: if pilne > 0 {jeżeli po signal czeka proces } then signal (psem) {zwolnij taki proces} else signal(s); {wpuść nowy proces}

Problem 5 filozofów Ma wielkie znaczenie w badaniach nad programowaniem współbieżnym Może być wyzwaniem dla wszystkich tych którzy tworzą narzędzia pierwotne

Problem 5 filozofów Założenia 5 filozofów żyło sobie 5 filozofów a filozofowie jak to na nich przystało myślą, a jak już się namyślą to jedzą. jedzenie mają przy jednym stole gdzie jest 5 nakryć, a pomiędzy nimi 5 pałeczek ale do jedzenia potrzebne są dwie pałeczki bo to filozofowie z dalekiego wschodu.

Problem 5 filozofów Program pieciu_filozofow; var paleczka:array[0..4] of semaphore; {b} i:integer; Procedure filozof (i:integer); repeat mysl; wait(paleczka[i]); wait(paleczka[(i+1) mod 5]); jedz; signal(paleczka[i]); signal(paleczka[i+1) mod 5]); until false; BEGIN for i:=0 to 4 do palkeczka[i] := 1; co filozof(0);filozof(1);...;filozof(4); co END. To rozwiązanie dopuszcza blokadę. Przy nieszczęśliwym zbiegu okoliczności gdy wszyscy filozofowie wezmą pałeczki z jednej strony i będą czekać na drugie

Problem 5 filozofów program pieciu_filozofow_v2; monitor monitor_paleczka; var paleczka:array[0..4] of integer; moznajesc:array[0..4] of condition; i:integer; Procedure wezpaleczke (i:integer); if paleczka[i] <> 2 then wait (moznajesc[i] ); paleczka[(i+1) mod 5] := paleczka[(i+1) mod 5] - 1; paleczka[(i-1) mod 5] := paleczka[(i-1) mod 5] - 1;

Problem 5 filozofów Procedure odloz_paleczke; paleczka[(i+1) mod 5]:=paleczka[(i+1) mod 5] +1; paleczka[(i-1) mod 5]:=paleczka[(i-1) mod 5] +1; if paleczka[(i+1) mod 5 ] = 2 then signal (moznajesc[(i+1) mod 5]); if paleczka[(i-1) mod 5 ] = 2 then signal (moznajesc[(i-1) mod 5]); {monitor} for i:= to 4 do paleczka[i]:=2;

Problem 5 filozofów Procedure filozof (i:integer); repeat mysl; wezpaleczke(i); jedz; odlozpaleczke(i); until false To rozwiązanie dopuszcza zagłodzenie, gdy na przemian to jeden to drugi proces dochodzą do zasobów a 3 tylko czeka. BEGIN co filozof(0);filozof(1); ;filozof(4); co END.

Problem 5 filozofów Program pieciu_filozofow; var paleczka:array[0..4] of semaphore; {b} pokoj: semaphore; i:integer; Procedure filozof(i:integer); repeat mysl; wait(pokoj); wait(paleczka[i]); wait(paleczka[(i+1) mod 5]); jedz; signal(paleczka[i]); signal(paleczka[(i+1) mod 5]); signal(pokoj); until false Wprowadzamy dodatkowy semafor pokój, który gwarantuje że przy stole w jednej chwili może się znajdować co najwyżej 4 filozofów. Z prostej zasady szufladkowej wynika że w jakiejkolwiek konfiguracji przynajmniej jeden filozof dostanie obie pałeczki. BEGIN pokoj:=4; for i:=0 to 4 do paleczka[i]:=1; co filozof(0);filozof(1);...;filozof(4); co END.