Systemy operacyjne. Zajęcia 11. Monitory



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

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

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

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

Monitory. Jarosław Kuchta

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

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

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

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

Monitory. Wady semafora

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

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

Programowanie wspóªbie»ne

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

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

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

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

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

synchronizacji procesów

synchronizacji procesów

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

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

Wstęp do programowania 2

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

Synchronizacja procesów i wątków

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

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

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

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

Programowanie współbieżne Zadanie nr 4 Spotkania

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

Język Java wątki (streszczenie)

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Podstawy współbieżności

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

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

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

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

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

Wprowadzenie do programowania współbieżnego

Kurs programowania. Wykład 8. Wojciech Macyna

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

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

SOP2 - semafory. grudzień

Programowanie współbieżne Zadanie numer 3 Monitory

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

Problemy współbieżności

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

Liczby losowe i pętla while w języku Python

Klasy i obiekty cz II

Odczyt danych z klawiatury Operatory w Javie

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

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

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Język Java wątki (streszczenie)

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Programowanie współbieżne Wykład 2. Iwona Kochańska

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Strategia "dziel i zwyciężaj"

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

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

Programowanie Współbieżne. Monitory

Konstrukcje warunkowe Pętle

Języki i techniki programowania Ćwiczenia 2

Sztuczna Inteligencja Projekt

Współbieżność w Javie

Podstawy Programowania Podstawowa składnia języka C++

Synchronizacja procesów

Współbieżność w Javie

Programowanie w Ruby

Podstawy Programowania C++

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Kolejki FIFO (łącza nazwane)

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

Wykład 8: klasy cz. 4

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Podstawowe części projektu w Javie

Programowanie - wykład 4

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

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

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

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Kurs języka Python. Wątki

Model pamięci. Rafał Skinderowicz

KOTLIN. Język programowania dla Androida

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

ZASADY PROGRAMOWANIA KOMPUTERÓW

Programowanie współbieżne i rozproszone

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Transkrypt:

Systemy operacyjne. Zajęcia 11. Monitory 1. Monitor to mechanizm zamykający całą pamięć wspólną i synchronizację w pojedynczym module. 2. Monitor posiada całą pamięć wspólną jako część 'prywatną': dostępu do niej nie mają taski (czyli typowo wątki) użytkownika bezpośrednio a jedynie przez procedury wejściowe (entries, entry procedures). Procedury te mogą być wywoływane przez taski użytkownika i mogą przyjmować argumenty i zwracać wartości. Jeśli w danym momencie jakiś wątek jest w trakcie wykonywania kodu którejś z procedur wejściowych, to mówimy że jest on w monitorze. 3. W monitorze (czyli w którejś z procedur wejściowych) może być tylko jeden task na raz. Jeśli monitor jest zajęty (czyli ktoś wykonuje jakąś procedurę wejściową) to zadania użytkownika są kolejkowane w kolejce wejściowej (entry queue). Po wyjściu zadania z monitora (czyli po zakończeniu wykonywania procedury wejściowej) monitor przekazywany jest następnemu zadaniu z kolejki. W ten sposób monitor zapewnia zadaniom wzajemne wykluczanie (mutual exclusion), chroniąc tym samym pamięć wspólną. Rozwiązania problemów programowania współbieżnego z wykorzystaniem monitora są z reguły prostsze i mniej 'trickowe' niż z wykorzystaniem semaforów. Niestety, z monitorami są związane pewne problemy. W Javie monitor może być realizowany poprzez klasę ReentrantLock implementującą interfejs Lock. Tworzymy obiekt: Lock monitor = new ReentrantLock(true); //true będzie kolejka Treść procedury wejściowej to dowolny kod znajdujący się wewnątrz bloku: monitor.lock(); //tu kod monitor.unlock();

4. Oprócz tego monitor ma tzw. mechanizm kolejek wewnętrznych zwanych też zmiennymi warunkowymi (queues, condition variables). W każdym monitorze można stworzyć dowolną ilość kolejek wewnętrznych. Kolejka taka ma trzy dostępne operacje (można je wykonywać tylko wewnątrz procedur wejściowych, bo kolejki wewnętrzne są widoczne tylko wewnątrz monitora): q.empty() - true jeśli kolejka jest pusta i false w.p.p. q.delay() - zawieś się i wpisz do kolejki q, zwalnia task czekający w kolejce wejściowej q.continue() - jeśli q jest pusta nic nie rób, w przeciwnym razie odwieś pierwsze z zadań czekających w kolejce q Czasem można się także spotkać z operacją: q.continueall() - odwieś wszystkie taski czekające w q, W Javie kolejka wewnętrzna jest reprezentowana przez interfejs Condition i tworzona przy pomocy metody: Condition q = monitor.newcondition(); Odpowiednikiem operacji delay jest metoda await(): q.await(); q.awaituninterruptibly(); Z kolei odpowiednikiem operacji continue jest metoda signal() q.signal(); Wreszcie odpowiednikiem operacji continueall jest metoda signalall() q.signalall(); Źródło rysunku: http://www.cs.mtu.edu/~shene/nsf-3/e-book/monitor/cv.html

Działanie operacji delay W1 W2 wchodzi do monitora chce wejść do monitora: czeka w kolejce wejściowej... delay (zawiesza sie). ---------------->.. może wejść do monitora... wychodzi z monitora (kończy procedurę wejściową). Jest kilka semantyk działania continue: W1 W2 W3 wchodzi do monitora q.delay. wchodzi do monitora.. chce wejść do monitora. q.continue. ma się odwiesić chce się wykonywać chce wejść (w monitorze) (w monitorze) (do monitora) A) Semantyka Hoare'a (oryginalnie zaproponowana w 1974 przez Hoare'a, który był twórcą idei monitora). Zadanie które wykonało q.continue zawiesza się (w dodatkowej kolejce tymczasowej). Odwieszane jest zadanie z kolejki q. Wykonuje się ono w monitorze do końca swojej procedury wejściowej. Po tym jak wyjdzie z monitora, odwieszane jest zadanie z kolejki tymczasowej. Jeśli zanim wyjdzie zrobi continue kolejka tymczasowa rośnie. B) Semantyka Mesy (od języka programowanie Mesa, w którym ją wprowadzono jest to semantyka współcześnie typowo używana, także w Javie, jest nazywana także semantyką wait - notify). Zadanie, które wykonało q.continue wykonuje się dalej do końca swojej procedury wejściowej. Pierwsze zadanie z kolejki q wznawia działanie w monitorze po wyjściu tego zadania z monitora. W przypadku continueall, zadania z kolejki wykonują się w monitorze po kolei. C) Często przyjmuje się (aby uniknąć problemu), że continue może być tylko ostatnią operacją w kodzie procedury wejściowej.

5. Przykłady: A) Semafor: q: queue; n: int :=x; entry P() if n = 0 q.delay(); else n--; entry V() if not q.empty() q.continue(); // może być samo q.continue() bo na kolejce pustej nic by się nie działo else n++; ; Zadanie: jaki to jest semafor? Binarny? Liczbowy? Ograniczony? Nieograniczony? B) Producent i konsument (z buforem jednoelementowym): full: boolean = false; bufor: qp: queue; //kolejka producentow qk: queue; //kolejka konsumentow entry wloz(in x) if full qp.delay(); **** bufor = x; full:= true; if not qk.empty() qk.continue(); entry wez(out x) if!full qk.delay(); **** x = bufor; full:= false; if not qp.empty() qp.continue(); Zadanie (tablicowe): zrobić producenta i konsumenta z buforem o dowolnym rozmiarze. Uwaga: Bufor, jako pamięć wspólna jest wewnątrz monitora. Zadanie: Zaimplementować to w Javie: w programie powinien być wątek producenta, watek konsumenta, klasa monitora i main. W mainie stworzyć monitor, kilku producentów, kilku konsumentów, przekazać im monitor. Producent powinien produkować Stringa będącego katenacją numeru wątku i numeru kolejnego wyprodukowania. Bufor może być listą (w konstruktorze dla monitora można podać maksymalny rozmiar).

Uwaga: w Javie w poniższej sytuacji W1 W2 W3 monitor.lock() q.await(). monitor.lock(). monitor.lock(). q.signal(). ma się odwiesić chce się wykonywać chce wejść (w monitorze) (w monitorze) (do monitora) nie ma gwarancji, że wątek W1 dostanie się do monitora przed wątkiem W3. Zatem, jeśli W2 to producent, który umieścił dane w buforze, nie ma gwarancji, że konsumentowi W1, który ma tą daną dostać, nie podbierze jej W3. Wówczas dojdzie do błędu polegającego na tym, że W1 i W3 pobiorą to samo (albo W1 skonsumuje daną a W3 mimo że się odwiesi, dostanie pustą listę). Rozwiązaniem jest zastąpienie w linijkach oznaczonych w powyższym kodzie gwiazdkami ifów przez while. Dodatkowo w Javie jest możliwy tzw 'spurious wakeup'. Oznacza to, że wątek, czekający na q.await() może przebudzić się bez wykonania signal. http://java.sun.com/javase/6/docs/api/java/util/concurrent/locks/condition.html Należy więc zawsze warunek przebudzenia sprawdzać w pętli while. Pytanie: czy wobec możliwości zawłaszczenia monitora przez zadanie wchodzące do niego oraz możliwość wystąpienia 'spurious wakeup' jest możliwe rozwiązanie sprawiedliwe? Odp. Tak. Idea rozwiązania: dodać dodatkową kolejkę (nie służącą do blokowania wątków tylko zwykłą kolejkę) obiektów typu Thread. Wątek zawieszany dodaje wpis do kolejki Thread. Jeśli przy wchodzeniu do monitora ta kolejka jest niepusta i nie jest spełniony warunek możliwości wyprodukowania/skonsumowania to producent/konsument powinni się zawiesić w swoich kolejkach (i dodać swoje wątki do kolejki Thread). Po odwieszeniu wątek powinien sprawdzić, czy jego obiekt wątek jest na początku kolejki Thread i, jeśli tak jest (i warunek wejścia do monitora jest spełniony tzn nie jest to spurious wakeup) to wątek usuwa swój wpis z początku kolejki Thread i idzie dalej do monitora. Uwaga: w Javie sprawdzanie bieżącego wątka to Thread.CurrentThread();

C) Czytelnicy i pisarze (z preferencjami): qc, qp: queue; //kolejka czytelnikow i kolejka pisarzy r:=0, w:=0: integer; entry PC() //poczatek czytania if w = 1 or not qp.empty() qc.delay(); r++; if not qc.empty() qc.continue(); //kaskadowe odwieszanie czytelnikow entry PP()//poczatek pisania if w = 1 or r > 0 qp.delay(); w ++; entry KC()//koniec czytania r --; if r = 0 qp.continue(); entry KP() //koniec pisania w--; if not qc.empty() qc.continue(); else qp.continue(); ; Manipulując fragmentami kodu zaznaczonymi na żółto można sterować priorytetami. Uwaga: Ponieważ czytelnicy czytają współbieżnie, czytanie (i pisanie) nie może odbywać się w monitorze. Zadanie: zaimplementować to w Javie, czytanie i pisanie ma być atrapą. Zadanie na BaCy dotyczy wersji FIFO. Rozwiązanie (zabezpieczające nas przed 'spurious wakeup') i realizujące FIFO znajduje się w prezentacji http://www.cs.chalmers.se/cs/grundutb/kurser/ppxt/ht2007/lectures/5x6.pdf slajdy 27-32

6. Symulacja monitora za pomocą semaforów (monitor i semafor są sobie równoważne): SemaforBinarny mutex:=otwarty; //kolejka wejściowa Dla każdej kolejki wewnętrznej q: int czekaja := 0 ; SemaforBinarny s:=zamkniety; Operacje w monitorze entry P() q.delay(); q.continue(); ; Operacje semaforowe <---------> mutex.p() <---------> mutex.v() <---------> czekaja++; mutex.v(); S.P(); czekają--; <---------> if (czekaja>0) s.v(); else mutex.v(); Po q.continue pierwszym zadaniem, które ma się wykonywać jest to, które było zawieszone, dlatego nie otwieram mutexa (żeby nie weszły zadania z kolejki wejściowej). Do monitora wejdzie zadanie, które zrobiło delay i 'przejmie' mutexa.