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

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

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

Monitory. Jarosław Kuchta

Systemy operacyjne. Zajęcia 11. Monitory

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

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

Język Java wątki (streszczenie)

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

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

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

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

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

Monitory. Wady semafora

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

Język Java wątki (streszczenie)

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

Współbieżność w środowisku Java

Programowanie wielowątkowe. Tomasz Borzyszkowski

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

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

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

Programowanie Równoległe i Rozproszone

Wątki w Javie. Piotr Tokarski

Synchronizacja procesów i wątków

synchronizacji procesów

Podstawy współbieżności

synchronizacji procesów

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

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

Programowanie współbieżne Zadanie numer 3 Monitory

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

Model pamięci. Rafał Skinderowicz

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

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

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

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

Współbieżność w Javie

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

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

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

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Programowanie wspóªbie»ne

Programowanie Współbieżne. Monitory

4. Procesy pojęcia podstawowe

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie współbieżne Laboratorium nr 12

Współbieżność w Javie

Kurs programowania. Wykład 8. Wojciech Macyna

Wstęp do programowania 2

Systemy operacyjne Wzajemne wykluczanie i synchronizacja

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

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

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

SOP2 - semafory. grudzień

Synchronizacja procesów

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Model pamięci. Rafał Skinderowicz

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

Synchronizacja procesów

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

5. Model komunikujących się procesów, komunikaty

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

Programowanie współbieżne Zadanie nr 4 Spotkania

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

4. Procesy pojęcia podstawowe

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

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

Programowanie komputerów

Wprowadzenie do programowania współbieżnego

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

9. Problem wzajemnego wykluczania i sekcji krytycznej

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

Systemy Operacyjne synchronizacja i komunikacja procesów

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

Systemy operacyjne III

Systemowe mechanizmy synchronizacji procesów

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Lock Manager Deadlock Źródła Jak starczy czasu. Dreadlocks. Konrad Błachnio MIMUW 19 maja 2010

3URJUDPRZDQLHZVSyáELH*QHZVWS

Systemy operacyjne. Studia podyplomowe Wydział Informatyki PB

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

Generatory. Michał R. Przybyłek

Składowane procedury i funkcje

Zaawansowany kurs języka Python

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

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

Programowanie wspóªbie»ne

Programowanie obiektowe

Wykład 8: klasy cz. 4

Problemy współbieżności

4. Procesy pojęcia podstawowe

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

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

Nazwa Wydziału Nazwa jednostki prowadzącej moduł Nazwa modułu kształcenia Kod modułu Język kształcenia Efekty kształcenia dla modułu kształcenia

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

Programowanie obiektowe

Współczesne aplikacje sterowania i akwizycji danych są zbiorem komunikujących się wątków lub procesów współbieżnych.

10. Synchronizacja użycia zasobów, Semafory

Przetwarzanie równoległe i współbieżne

Transkrypt:

J. Ułasiewicz Programowanie aplikacji współbieżnych 1 11 Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację. Monitor (Brinch Hansen, Hoare) jest strukturalnym narzędziem synchronizacji procesów lub wątków. Jest to obiekt którego metody mogą być bezpiecznie używane przez wiele procesów / wątków, gdyż wzajemne wykluczanie jest automatycznie zapewniane. Zapewnione jest także oczekiwanie na dostęp do jakiegoś zasobu które powoduje odblokowanie na ten czas monitora. zaimplementowane w językach: Java, Modula-3, Concurrent Pascal, Concurrent Euclid. Definicja monitora 1. Zmienne i działające na nich procedury zebrane są w jednym module. Dostęp do zmiennych monitora możliwy jest tylko za pomocą procedur monitora. 2. W danej chwili tylko jeden proces wykonywać może procedury monitora. Gdy inny proces wywoła procedurę monitora będzie on zablokowany do chwili opuszczenia monitora przez pierwszy proces. 3. Istnieje możliwość wstrzymania i wznowienia procedur monitora za pomocą zmiennych warunkowych (ang. conditional variables). Na zmiennych warunkowych można wykonywać operacje Wait, Signal, Noempty. Wait(c) - Wstrzymanie procesu bieżącego wykonującego procedurę monitora i wstawienie go na koniec kolejki związanej ze zmienną warunkową c. Jeżeli jakieś procesy czekają na wejście do monitora to jeden z nich będzie wpuszczony.

J. Ułasiewicz Programowanie aplikacji współbieżnych 2 Signal(c) Odblokowanie jednego z procesów czekających na zmiennej warunkowej c. Gdy brak czekających procesów operacja nie daje efektów. Operacja Signal jest bezpamięciowa (nie posiada licznika). Notempty(c) Funkcja zwraca true gdy kolejka c jest niepusta, false gdy pusta. Jeśli Signal nie jest ostatnią instrukcją procedury monitora to proces wykonujący tę operację jest wstrzymany do chwili gdy wznowiony przezeń proces zwolni monitor. Wstrzymany tak proces może przebywać w: wejściowej kolejce procesów oczekujących na wejście do monitora kolejce uprzywilejowanej Które rozwiązanie zastosowano zależne jest od implementacji. P1 wejście do monitora wait(c) P1 wyjście z monitora P1 P2 P2 próbuje wejść do monitora P2 wejście do monitora signal(c) P2 wyjście z monitora proces czeka proces aktywny zasięg monitora Rys. 11-1 Wewnątrz monitora znajduje się tylko jeden proces/wątek Kolejki monitora: W - kolejka wejściowa U - kolejka uprzywilejowana C - kolejka zmiennej warunkowej, jest ich tyle ile zmiennych warunkowych

J. Ułasiewicz Programowanie aplikacji współbieżnych 3 W - kolejka wejściowa Procesy oczekujące na wejście do monitora MONITOR Zmienne warunkowe C1 C2 CN Kolejka 1 Kolejka 2 Kolejka N U - kolejka wejściowa Zmienne Procedury Procesy wstrzymane na zmiennych warunkowych P1 P2 Pk Rys. 11-2 Kolejki monitora Procesy oczekujące na wejście do monitora FIFO Procesy wstrzymane na Signal(c) LIFO MONITOR MON; VAR c: CONDITION PROCEDURE PR1(...) BEGIN... Wait(c);... END PR1; PROCEDURE PR1(...) BEGIN... Signal(c);... END PR2;... END MON; Procesy wstrzymane na Wait(c) FIFO Rys. 11-3 Przykład monitora

J. Ułasiewicz Programowanie aplikacji współbieżnych 4 Wejście do monitora Gdy monitor jest wolny Zajmij monitor Gdy monitor jest zajęty Dodaj bieżący wątek do kolejki W, Zablokuj bieżący wątek. Wait(C) Umieść bieżący wątek w kolejce C Zablokuj bieżący wątek Gdy w kolejce uprzywilejowanej U jest jakiś wątek, usuń go z U i wznów, Gdy w kolejce wejściowej W jest jakiś watek, usuń go z W i wznów, Gdy w żadnej z kolejek U i W nie ma wątków oznacz monitor jako wolny Signal(C) Jeżeli jest jakiś wątek W czekający w kolejce C Usuń W z kolejki C Dodaj bieżący wątek do kolejki U Zablokuj wątek bieżący Odblokuj wątek W Wyjście z monitora Gdy w kolejce U jest jakiś wątek, usuń go z U i wznów, Gdy w kolejce W jest jakiś watek, usuń go z W i wznów, Gdy w żadnej z kolejek U i W nie ma wątków oznacz monitor jako wolny

J. Ułasiewicz Programowanie aplikacji współbieżnych 5 11.1.1 Rozwiązanie problemu wzajemnego wykluczania za pomocą monitorów monitor WzajemneWykluczanie int z1,z2; Pisz(int x1, int x2){ z1 = x1; z2 = x2; ; Czytaj(int *x1, int *x2){ *x1 := z1; *x2 := z2; ; Przykład 11-1 Rozwiązanie problemu wzajemnego wykluczania za pomocą monitora Procedury Czytaj lub Pisz wykonane będą w sposób wyłączny co wynika z definicji monitora.

J. Ułasiewicz Programowanie aplikacji współbieżnych 6 11.2 Rozwiązanie problemu producenta i konsumenta za pomocą monitorów P1 Producent Buf x x x x K1 Konsumenci Tail Head Rys. 11-4 Problem producenta konsumenta, bufor cykliczny monitor ProducentKonsument #define N 8 Record Buf[N]; // Bufor na rekordy int Ile; // Ile rekordów w buforze int Head,Tail; // Indeks wejściowy i wyjściowy CONDITION Prod; // Czekający producenci CONDITION Cons; // Czekający konsumenci Wstaw(Record x ) { if(ile == N) { Wait(Prod); Head := (Head+1) % N; Buf(Head) = x; Ile ++; Signal(Cons); ; Pobierz(Record *x ) { if(ile == 0) { Wait(Cons); Tail := (Tail+1) % N; *x = Buf(Head)x; Ile --; Signal(Prod); ; Przykład 11-2 Rozwiązanie problemu producenta / konsumenta za pomocą monitora Hoare a (monitor ze wznawianiem).

J. Ułasiewicz Programowanie aplikacji współbieżnych 7 11.3 Rozwiązanie problemu czytelników i pisarzy za pomocą monitorów monitor CzytelnicyPisarze condition Pisanie, Czytanie;// Kolejka pisarzy i czytelników int ReaderCount = 0; // Liczba czytelników w czytelni Boolean zajety = false; // true gdy w czytelni jest pisarz procedure StartRead() { if (zajety) // Gdy czytelnia zajęta - blokada Wait(Czytanie); ReaderCount++; Signal(Czytanie); // Wpuść następnego czytelnika EndRead() { ReaderCount-- ; if(readercount == 0) // Ostatni Czyt. wpuszcza pisarzy Signal(Pisanie); StartWrite() { // Czekaj gdy w czytelni jest pisarz lub czytelnicy if(zajety ReaderCount!= 0) Wait(Pisanie); zajety = true; EndWrite() { zajety = false; // Gdy czekają czytelnicy to ich wpuść // Gdy czytelnicy nie czekają wpuść pisarzy if (Notempty(Czytanie)) Signal(Czytanie); else Signal(Pisanie);

J. Ułasiewicz Programowanie aplikacji współbieżnych 8 Reader() { while (true) { StartRead(); Czytaj(); // Wykonaj procedurę czytania EndRead(); Writer() { while (true) { StartWrite(); Pisz(); // Wykonaj procedurę pisania EndWrite(); Przykład 11-3 Rozwiązanie problemu czytelników i pisarzy za pomocą monitora.

J. Ułasiewicz Programowanie aplikacji współbieżnych 9 11.4 z powiadamianiem i rozgłaszaniem W omawianych poprzednio monitorach Hoara a wystąpienie operacji Signal(c) musi spowodować natychmiastowe wznowienie procesu oczekującego na zmiennej warunkowej c. Jest to trudne do realizacji ze względu na implementację szeregowania. z powiadamianiem Inne rozwiązanie stosowane jest w monitorach z powiadamianiem (wprowadzone -Lampson, Redell w języku Mesa). Zdefiniowana tam operacja Notify(c) powoduje odblokowanie jednego z procesów związanej ze zmienną warunkową c ale proces ten nie musi być natychmiast zaszeregowany. z rozgłaszaniem Dodana funkcja NotifyAll(c) która powoduje odblokowanie wszystkich z procesów związanej ze zmienną warunkową c. Proces te będą konkurowały o dostęp do monitora. Będą zaszeregowane gdy będzie to możliwe. Nie występuję tu kolejka uprzywilejowana U, system operacyjny może stosować standardowe szeregowanie.

J. Ułasiewicz Programowanie aplikacji współbieżnych 10 Wejście do monitora Gdy monitor jest wolny Zajmij monitor Gdy monitor jest zajęty Dodaj bieżący wątek do kolejki W, Zablokuj bieżący wątek Wait(C) Umieść bieżący wątek w kolejce C, Zablokuj bieżący wątek, Gdy w kolejce wejściowej W jest jakiś wątek, usuń go z W i wznów, Gdy w nie oznacz monitor jako wolny Notify(C) Jeżeli jest jakiś wątek P czekający w kolejce C Usuń go z kolejki C i dodaj do kolejki wejściowej W. NotifyAll(c) Jeżeli są jakie wątki czekające w kolejce C Usuń je wszystkie z kolejki C i dodaj do kolejki wejściowej W Wyjście z monitora Gdy w kolejce W jest jakiś wątek, usuń go z W i wznów, gdy nie oznacz monitor jako wolny.

J. Ułasiewicz Programowanie aplikacji współbieżnych 11 monitor ProducentKonsument #define N 8 Record Buf[N]; // Bufor na rekordy int Ile; // Ile rekordów w buforze int Head,Tail; // Indeks wejściowy i wyjściowy CONDITION Prod; // Czekający producenci CONDITION Cons; // Czekający konsumenci Wstaw(Record x ) { while(ile == N) Wait(Prod); Head := (Head+1) % N; Buf(Head) = x; Ile ++; Notify(Cons); ; Pobierz(Record *x ) { while(ile == 0) Wait(Cons); Tail := (Tail+1) % N; *x = Buf(Head)x; Ile --; Notify (Prod); ; Przykład 11-4 Rozwiązanie problemu producenta / konsumenta za pomocą monitora z powiadamianiem

J. Ułasiewicz Programowanie aplikacji współbieżnych 12 11.5 w Javie z powiadamianiem zaimplementowane są w języku Java jako obiekty synchronizowane. Poprzedza się je słowem kluczowym synchronized. Każde wejście do monitora oznaczone jest słowem kluczowym synchronized. Monitor związany jest z obiektem a nie klasą. Gdy wątek przechodzi instrukcje oznaczone jako synchronized to tak jakby zamykał drzwi do monitora. Synchronizacja w Javie może być wykonana na poziomie: 1. Metod słowo kluczowe synchronized występuje przy definiowaniu metody np.: public synchronized int get() {... 2. Obiektów i bloków - słowo kluczowe synchronized występuje przy definiowaniu bloku instrukcji np. synchronized(p) { safex = p.x; safey = p.y;... synchronized(this) {...

J. Ułasiewicz Programowanie aplikacji współbieżnych 13 W1 W2 synchronized wątek W1 w monitorze wyjście odblokowanie synchronized wyjście blokada wątek W2 czeka wątek W2 w monitorze Rys. 11-5 Dostęp do obiektu synchronizowany przez monitor Zapewnienie wzajemnego wykluczania metod synchronizowanych nie wystarczy do rozwiązania wielu zagadnień synchronizacji. Co zrobić gdy wewnątrz synchronizowanej metody nastąpi konieczność oczekiwania na pewien zasób?. Jakby zastosować aktywne czekanie to inne wątki miały by zablokowany dostęp do monitora. Konieczna jest implementacja metody wstrzymywania i wznawiania wątku wewnątrz monitora. Java nie udostępnia jawnie zmiennych warunkowych. Dla obiektu synchronizowanego automatycznie tworzona jest jedna zmienna warunkowa dostępna przez metody wait, notify i notifyall. Kolejne mogą być wprowadzone przez obiekty klasy Lock.

J. Ułasiewicz Programowanie aplikacji współbieżnych 14 Metoda wait() public final void wait(); public final void wait(long timeout); public final void wait(long timeout,int nanos) throws InterruptedException Wykonanie metody powoduje zawieszenie bieżącego wątku do czasu gdy inny watek nie wykona metody notify() lub notifyall() odnoszącej się do wątku w który wykonał wait(). Uwaga! Wątek wykonujący wait(...) musi być w posiadaniu monitora dotyczącego synchronizowanego obiektu. Wykonanie wait(...) powoduje zwolnienie monitora. Metoda notify() public final void notify() Metoda powoduje odblokowanie jednego z wątków zablokowanych na monitorze pewnego obiektu poprzez wait(). Który z czekających wątków będzie odblokowany nie jest w definicji metody określone. Uwaga! Odblokowany wątek nie będzie natychmiast wykonywany musi on jeszcze zaczekać, aż zwolniona będzie przez bieżący wątek blokada monitora. Odblokowany wątek będzie konkurował z innymi o nabycie blokady monitora. Uwaga! Metoda notify() i notifyall może być wykonana tylko przez wątek który jest właścicielem monitora obiektu.

J. Ułasiewicz Programowanie aplikacji współbieżnych 15 Wątek staje się właścicielem monitora obiektu gdy: Wykona synchronizowaną metodę instancji tego obiektu. Wykona synchronizowane wyrażenia tego obiektu. Gdy wątek nie jest w posiadaniu monitora obiektu generowany jest wyjątek. IllegalMonitorStateException. Metoda notifyall() public final void notifyall() Metoda powoduje odblokowanie wszystkich wątków zablokowanych na monitorze pewnego obiektu poprzez uprzednie wykonanie wait(). Uwaga! Wątki będą jednak czekały aż do chwili gdy wątek bieżący zwolni blokady monitora. Odblokowane wątki będą konkurowały o nabycie blokady monitora. Literatura: [1] http://pl.wikipedia.org/wiki/monitor_programowanie_wsp