Synchronizacja procesów



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

synchronizacji procesów

synchronizacji procesów

Systemowe mechanizmy synchronizacji procesów

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

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

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

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

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

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

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

Wprowadzenie do programowania współbieżnego

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

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 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

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

SOP2 - semafory. grudzień

w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych

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ę.

Synchronizacja procesów i wątków

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

Problemy współbieżności

Systemy operacyjne. Zajęcia 11. Monitory

Programowanie Równoległe i Rozproszone

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

Synchronizacja procesów

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

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

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

Współbieżność i synchronizacja procesów

Monitory. Jarosław Kuchta

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

Oprogramowanie systemowe

Systemy Operacyjne synchronizacja i komunikacja procesów

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

Klasyczne problemy synchronizacji

Oprogramowanie systemowe

1. Uruchom poniższy program tworzący pojedynczy wątek:

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

Zagadnienia zaawansowane. Lech Kruś,

Temat zajęć: Tworzenie i obsługa wątków.

Program jest więc strukturą statyczną zapisaną na jakimś nośniku. Natomiast proces jest wykonującym się programem.

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

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

Oprogramowanie systemowe

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

Wstęp do programowania 2

Monitory. Wady semafora

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

Systemy operacyjne III

Programowanie współbieżne i równoległe. dr inż. Marcin Wilczewski 2013

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

1 Podstawowe definicje i pojęcia współbieżności

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

Projekt systemy operacyjne 2 - Systemowe mechanizmy synchr

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

Język programowania PASCAL

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

4. Procesy pojęcia podstawowe

Programowanie współbieżne Zadanie numer 3 Monitory

Programowanie wspóªbie»ne

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Synchronizacja procesów

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

Mogą pracować w środowisku: Scentralizowanym -mikrokontroler Rozproszonym sieć sterująca, systemy hierarchiczne. Komunikacja z syst.

Informatyka 1. Przetwarzanie tekstów

Planowanie przydziału procesora

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

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

Synchronizacja procesów

4. Procesy pojęcia podstawowe

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

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

3URJUDPRZDQLHZVSyáELH*QHZVWS

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

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

Detekcja zakleszczenia (1)

Wzajemne wykluczanie i zakleszczenie

Programowanie w Ruby

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

Planowanie przydziału procesora

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Klient-Serwer Komunikacja przy pomocy gniazd

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Komputerowe systemy sterowania

Proces y i y w i ąt ą ki

Programowanie wspóªbie»ne

Zaawansowany kurs języka Python

Komunikacja asynchroniczna w modelu rozproszonym

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

Czas wirtualny, złożoność algorytmów

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

OPERACJE NA PLIKACH. Podstawowe pojęcia:

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

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

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

Wykład 5: Specyfikacja na poziomie systemowym

1. Działania na procesach

Transkrypt:

Synchronizacja procesów - Współbieżność i synchronizacja procesów - Systemowe mechanizmy synchronizacji procesów Systemy operacyjne Wykład 7 1

Współbieżność i synchronizacja procesów Abstrakcja programowania współbieżnego. Instrukcje atomowe i ich przeplot. Istota synchronizacji. Kryteria poprawności programów współbieżnych. Klasyfikacja mechanizmów synchronizacji. Wzajemne wykluczania. Algorytmy wzajemnego wykluczania (alg. Petersona i Lamporta). Złożone instrukcje atomowe (test&set, exchange). Systemy operacyjne Wykład 7 2/78

Wprowadzenie do abstrakcji przetwarzania współbieżnego Realizacja przetwarzania polega na wykonywaniu instrukcji przez jednostkę przetwarzającą (procesor). Instrukcje wykonywane są w kontekście jakiegoś procesu. Wykonanie instrukcji (akcja) oznacza zajście zdarzenia w procesie, skutkiem czego jest zmiana stanu procesu. Zajście zdarzenia jest zdeterminowane poprzedzającym je stanem procesu. Na stan procesu wpływają pośrednio akcje innych procesów w systemie, przejawiające się w stanie współdzielonych zasobów. Systemy operacyjne Wykład 7 3/78

Podstawowe definicje i oznaczenia C zbiór instrukcji (operacji), możliwych do wykonania przez jednostkę przetwarzającą (np. dodawanie, odejmowanie, skok, rozgałęzienie warunkowe). D zbiór danych, przetwarzanych (modyfikowanych lub czytanych) w ramach wykonywania operacji przez jednostkę przetwarzającą. e i (c, O) wykonanie w ramach procesu P i instrukcji atomowej c C na operandach ze zbioru O D Systemy operacyjne Wykład 7 4/78

Stan procesu i zdarzenie Stan procesu obejmuje te elementy (wartości zmiennych, rejestrów, stan zasobów), które między innymi determinują następną instrukcję do wykonania. Wykonanie instrukcji określane jest jako zdarzenie lub akcja. Zbiór instrukcji do wykonania oraz zależności pomiędzy nimi określone są przez program procesu. Zajście zdarzenia zdeterminowane jest zatem przez program oraz bieżący stan procesu. Systemy operacyjne Wykład 7 5/78

Proces sekwencyjny Proces (wątek) sekwencyjny jest wykonaniem ciągu instrukcji, opisanych przez program dla tego procesu (procedurę dla wątku), w taki sposób, że następna akcja nie rozpocznie się, zanim nie skończy się poprzednia. Zdarzenie (akcja) w procesie P i oznacza zmianę stanu tego procesu, co formalnie opisane jest poprzez odwzorowanie (przejście, tranzycję): L: S i E i S i, gdzie S i zbiór stanów procesu P i E i zbiór zdarzeń w procesie P i Systemy operacyjne Wykład 7 6/78

Relacja lokalnego porządku Proces Pi jest ciągiem (skończonym lub nieskończonym) następujących po sobie naprzemiennie stanów i zdarzeń s i0, e i1, s i1, e i2, s i2,..., gdzie: s i0 stan początkowy procesu P i k 0 s ik S i k>0 e ik E i k 0 L(s ik, e i k+1 ) = s i k+1 Relację porządku w procesie P i odzwierciedlająca kolejność stanów i zdarzeń w ciągu nazywana będzie lokalnym porządkiem i oznaczana symbolem i Systemy operacyjne Wykład 7 7/78

Współbieżna realizacja zbioru procesów Zdarzenie w systemie współbieżnym, złożonym z procesów sekwencyjnych P 1, P 2,..., P n, oznacza zajście zdarzenia w jednym z procesów. Zdarzenie, zmieniając stan jednego procesu, zmienia stan całego systemu, co formalnie opisane jest poprzez odwzorowanie (przejście, tranzycję): G: Σ Λ Σ, gdzie: Σ S 1 S 2... S n zbiór stanów systemu, Λ = E 1 E 2... E n zbiór zdarzeń w systemie. Systemy operacyjne Wykład 7 8/78

Relacja globalnego porządku Przetwarzanie współbieżne zbioru procesów sekwencyjnych P 1, P 2,..., P n, jest ciągiem (skończonym lub nieskończonym) następujących po sobie naprzemiennie stanów systemu i zdarzeń σ 0, e 1, σ 1, e 2, σ 2,..., gdzie: σ 0 stan początkowy s 10, s 20,..., s 0 n k 0 σ k Σ k>0 e k Λ k 0 G(σ k, e k+1 ) = σ k+1 Relacja porządku w systemie odzwierciedlająca kolejność stanów i zdarzeń w ciągu nazywana będzie globalnym porządkiem i oznaczana symbolem Systemy operacyjne Wykład 7 9/78

Niedeterminizm przetwarzania Zdarzenie, które może pojawić się w określonym stanie przetwarzania, określane jest jako zdarzenie dopuszczalne. W przetwarzaniu współbieżnym z każdym sekwencyjnym procesem w danym stanie związane jest jedno zdarzenie. W stanie całego przetwarzania jest zatem zbiór zdarzeń dopuszczalnych. W zależności od dostępności zasobów (procesora, magistrali systemowej) oraz decyzji planisty, wykonywany będzie jeden z procesów gotowych. Należy więc przyjąć, że zajście jednego ze zdarzeń dopuszczalnych ma charakter losowy. Systemy operacyjne Wykład 7 10/78

Przeplot i osiągalność stanu Przeplotem jest zbiór zdarzeń Λ, uporządkowany przez relację globalnego porządku, spełniającą następujący warunek: e, e Λ ie i e e e Stan σ systemu jest osiągalny ze stanu σ, co będzie oznaczone przez σ σ, jeśli zachodzi jeden z warunków: 1) są to te same stany, czyli σ σ, 2) e Λ G(σ, e) = σ, 3) σ Σ σ σ σ σ Systemy operacyjne Wykład 7 11/78

Procesy niezależne a procesy współpracujące Niech D i D oznacza zbiór danych przetwarzanych przez proces P i, czyli dla ciągu instrukcji procesu P i : e i1 (c i1, O i1 ), e i2 (c i2, O i2 ),... D i = U k O k i Dwa procesy, P i i P j, są niezależne, jeśli D i D j = Dwa procesy, P i i P j, współpracują (są w interakcji), jeśli D i D j Systemy operacyjne Wykład 7 12/78

Dane współdzielone a lokalne Dane lokalne (prywatne) procesu P i to takie, które są przetwarzane wyłącznie przez P i, formalnie zatem jest to zbiór: D i \ U 1 j n,j i D j Dane współdzielone przez proces P i to takie, które przetwarzane są oprócz P i przez co najmniej jeszcze jeden inny proces, formalnie zatem jest to zbiór: D i U 1 j n,j i D j Systemy operacyjne Wykład 7 13/78

Dane wejściowy i wyjściowe Niech D R i D i oznacza zbiór danych czytanych przez proces P i, a D M i D i oznacza zbiór danych modyfikowanych przez proces P i. Dane wejściowe procesu P i to takie dane współdzielone, które są czytane przez proces P i, formalnie zatem jest to zbiór: D ir U 1 j n,j i D j Dane wyjściowe procesu P i to takie dane współdzielone, które są modyfikowane przez proces P i, formalnie zatem jest to zbiór: D im U 1 j n,j i D j Systemy operacyjne Wykład 7 14/78

Przykład przetwarzania współbieżnego n: integer := 0; /* zmienna współdzielona */ instrukcje wątki wątek A wątek B wysokopoziomowe n := n + 1 n := n + 1 RISC load R A, n load R B, n add R A, 1 add R B, 1 store R A, n store R B, n CISC inc n inc n Systemy operacyjne Wykład 7 15/78

Przykład przeplotu instrukcji RISC przeplot 1 przeplot 2 przepływ sterowania {A} load R A, n {A} load R A, n {A} add R A, 1 {A} add R A, 1 {A} store R A, n // n=0 // n=1 {B} load R B, n {B} load R B, n {B} add R B, n {B} add R B, n {A} store R A, n {B} store R B, n {B} store R B, n wartość n 2 1 Systemy operacyjne Wykład 7 16/78

Przykład przeplotu instrukcji CISC przeplot 1 przeplot 2 przepływ sterowania {A} inc n {B} inc n {B} inc n {A} inc n wartość n 2 2 Systemy operacyjne Wykład 7 17/78

Istota synchronizacji Celem synchronizacji jest kontrola przepływu sterowania pomiędzy procesami tak, żeby dopuszczalne stały się tylko przeploty instrukcji zgodne z intencją programisty. Synchronizacja na najniższym poziomie polega na wykonaniu specjalnych instrukcji, które powodują zatrzymanie postępu przetwarzania. Synchronizacja na wyższym poziomie polega na użyciu specjalnych konstrukcji programotwórczych lub odpowiednich definicji struktur danych. Systemy operacyjne Wykład 7 18/78

Poprawność programów współbieżnych Własność bezpieczeństwa (safety) w każdym stanie przetwarzania muszą być spełnione pewne warunki. Własność żywotności (liveness) w wyniku przetwarzania muszą w końcu zajść pewne warunki. Systemy operacyjne Wykład 7 19/78

Własność uczciwości programów współbieżnych Uczciwość słaba nieprzerwanie zgłaszane żądanie procesu będzie kiedyś obsłużone. Uczciwość mocna nieskończenie wiele razy zgłaszane żądanie procesu będzie kiedyś obsłużone. Oczekiwanie liniowe żądanie proces będzie obsłużone po najwyżej jednokrotnym obsłużeniu żądań innych procesów. FIFO żądania będą realizowane w kolejności zgłoszeń. Systemy operacyjne Wykład 7 20/78

Klasyfikacja mechanizmów synchronizacji Zapis lub odczyt współdzielonych danych. Złożone operacje atomowe na współdzielonych danych (np. test&set, exchange) Mechanizmy wspierane przez system operacyjny: semafory, mechanizmy POSIX (zamki oraz zmienne warunkowe). Mechanizmy strukturalne (wspierane przez wysokopoziomowe języki programowania): monitory, regiony krytyczne. Systemy operacyjne Wykład 7 21/78

Wzajemne wykluczanie sformułowanie problemu W systemie działa n procesów P 0, P 1,..., P n-1. W programie każdego procesu znajduje się fragment kodu zwany sekcją krytyczną (critical section). Sekcja krytyczna wykonywana jest w danej chwili przez co najwyżej jeden proces. Systemy operacyjne Wykład 7 22/78

Ogólna postać algorytmu wzajemnego wykluczania reszta (remainder section) sekcja wejściowa (entry section) sekcja krytyczna (critical section) sekcja wyjściowa (exit section) Systemy operacyjne Wykład 7 23/78

Poprawność rozwiązania problemu wzajemnego wykluczania Wzajemne wykluczanie warunek bezpieczeństwa, Postęp (progress) warunek żywotności z punktu widzenia systemu, Ograniczone czekanie (lockout-freedom) warunek żywotności z punktu widzenia procesu. Systemy operacyjne Wykład 7 24/78

Wzajemne wykluczanie 2 procesów podejście 1 Algorytm dla procesu P i przy dwóch procesach P i i P j shared numer: Integer := i; while numer i do nic; sekcja wejściowa sekcja krytyczna i ; numer := j; sekcja wyjściowa reszta i ; Systemy operacyjne Wykład 7 25/78

Wzajemne wykluczanie 2 procesów podejście 2 Algorytm dla procesu P i przy dwóch procesach P i i P j (dla uproszczenia prezentacji założono, że i = 0, a j = 1) shared znacznik: array [0..1] of Boolean := false; znacznik[i] := true; while znacznik[j] do sekcja wyjściowa nic; sekcja krytyczna i ; znacznik[i] := false; sekcja wyjściowa reszta i ; Systemy operacyjne Wykład 7 26/78

Wzajemne wykluczanie 2 procesów podejście 3 shared znacznik: array [0..1] of Boolean := false; znacznik[i] := true; while znacznik[j] do begin sekcja znacznik[i] := false; wejściowa znacznik[i] := true; end; sekcja krytyczna i ; znacznik[i] := false; sekcja wyjściowa reszta i ; Systemy operacyjne Wykład 7 27/78

sekcja wejściowa Wzajemne wykluczanie 2 procesów podejście 4 shared znacznik: array [0..1] of Boolean; shared numer: Integer; znacznik[i] := true; numer := j; while znacznik[j] and numer i do nic; sekcja krytyczna i ; znacznik[i] := false; sekcja wyjściowa reszta i ; Systemy operacyjne Wykład 7 28/78

drzwi Wzajemne wykluczanie n procesów algorytm piekarni Algorytm dla procesu P i przy n procesach ( i = 0 n-1 ) shared wybieranie: array [0..n-1] of Boolean := false; shared numer: array [0..n-1] of Integer := 0; local k: Integer; wybieranie[i] := true; numer[i] := max(numer[0],numer[1], ) + 1; wybieranie[i] := false; Systemy operacyjne Wykład 7 29/78

sekcja wejściowa Wzajemne wykluczanie n procesów algorytm piekarni cd. 1) for k := 0 to n-1 do begin 2) if k i then begin 3) while wybieranie[k] do nic; 4) while numer[k] 0 and 5) (numer[k],k)<(numer[i],i) do 6) nic; 7) end; 8) end; 9) sekcja krytyczna i ; 10) numer[i] := 0; sekcja wyjściowa 11) reszta i ; Systemy operacyjne Wykład 7 30/78

Operacja test&set function test&set(var l: Boolean): Boolean; begin test&set := l; l := true; end; Systemy operacyjne Wykład 7 31/78

Operacja exchange procedure exchange(var a,b: Boolean); var tmp: Boolean; begin tmp := a; a := b; b := tmp; end; Systemy operacyjne Wykład 7 32/78

Wzajemne wykluczanie z użyciem instrukcji test&set shared zamek: Boolean; while test&set(zamek) do sekcja nic; wejściowa sekcja krytyczna; zamek := false; sekcja wyjściowa reszta; Systemy operacyjne Wykład 7 33/78

Wzajemne wykluczanie z użyciem instrukcji exchange shared zamek: Boolean; local klucz: Boolean; klucz := true; repeat exchange(zamek, klucz); until klucz = false; sekcja krytyczna; zamek := false; sekcja wyjściowa reszta; sekcja wejściowa Systemy operacyjne Wykład 7 34/78

Systemowe mechanizmy synchronizacji procesów Definicja semafora Klasyfikacja semaforów Implementacja semaforów Zamki Zmienne warunkowe Klasyczne problemy synchronizacji Systemy operacyjne Wykład 7 35/78

Semafory Semafor jest zmienną całkowitą nieujemną lub w przypadku semaforów binarnych zmienną typu logicznego. Na semaforze można wykonywać dwa rodzaje operacji: P opuszczanie semafora (hol. proberen) V podnoszenie semafora (hol. verhogen) Synchronizacja polega na blokowaniu procesu w operacji opuszczania semafora, jeśli semafor jest już opuszczony. Systemy operacyjne Wykład 7 36/78

Rodzaje semaforów Semafor binarny zmienna semaforowa przyjmuje tylko wartości true (stan podniesienia, otwarcia) lub false (stan opuszczenia, zamknięcia). Semafor ogólny (zliczający) zmienna semaforowa przyjmuje wartości całkowite nieujemne, a jej bieżąca wartość jest zmniejszana lub zwiększana o 1 w wyniku wykonania odpowiednio operacji opuszczenia lub podniesienia semafora. Semafor uogólniony semafor zliczający, w przypadku którego zmienną semaforową można zwiększać lub zmniejszać o dowolną wartość, podaną jako argument operacji. Semafor dwustronnie ograniczony semafor ogólny, w przypadku którego zmienna semaforowa, oprócz dolnego ograniczenia wartością 0, ma górne ograniczenie, podane przy definicji semafora. Systemy operacyjne Wykład 7 37/78

Implementacja semafora ogólnego na poziomie maszynowym Opuszczanie semafora procedure P(var s: Semaphore) begin while s = 0 do nic; s := s - 1; end; Podnoszenie semafora procedure V(var s: Semaphore) begin s := s + 1; end; instrukcje muszą być wykonane atomowo instrukcja musi być wykonana atomowo Systemy operacyjne Wykład 7 38/78

Implementacja semafora binarnego na poziomie maszynowym Opuszczanie semafora procedure P(var s: Binary_Semaphore) begin while s = 0 do nic; s := false; end; Podnoszenie semafora procedure V(var s: Binary_Semaphore) begin s := true; end; instrukcje muszą być wykonane atomowo instrukcja musi być wykonana atomowo Systemy operacyjne Wykład 7 39/78

Implementacja semafora ogólnego na poziomie systemu operacyjnego Struktury danych type Semaphore = record wartość: Integer; L: list of Proces; end; Opuszczanie semafora procedure P(var s: Semaphore) begin s.wartość := s.wartość - 1; if s.wartość < 0 then begin dołącz dany proces do s.l zmień stan danego procesu na oczekujący end; end; Systemy operacyjne Wykład 7 40/78

Implementacja semafora ogólnego na poziomie systemu operacyjnego Podnoszenie semafora procedure V(var s: Semaphore) begin s.wartość := s.wartość + 1; if s.wartość 0 then begin wybierz i usuń jakiś/kolejny proces z kolejki s.l zmień stan wybranego procesu na gotowy end; end; Systemy operacyjne Wykład 7 41/78

Wzajemne wykluczanie z użyciem semaforów shared mutex: Semaphore := 1; P(mutex); sekcja wejściowa sekcja krytyczna; V(mutex); sekcja wyjściowa reszta; Systemy operacyjne Wykład 7 42/78

Mechanizmy synchronizacji POSIX zmienne synchronizujące Rodzaje zmiennych synchronizujących: zamek umożliwiająca implementację wzajemnego wykluczania, zmienna warunkowa umożliwia usypianie i budzenie wątków. Zmienne synchronizujące muszą być współdzielone przez synchronizowane wątki. Zanim zmienna zostanie wykorzystana do synchronizacji musi zostać zainicjalizowana. Systemy operacyjne Wykład 7 43/78

Operacje na zmiennych synchronizujących Zamek umożliwia implementację wzajemnego wykluczania. Operacje: lock zajęcie (zaryglowanie) zamka, unlock zwolnienie (odryglowanie) zamka, trylock nieblokująca próba zajęcia zamka. Zmienna warunkowa umożliwia usypianie i budzenie wątków. Operacje: wait uśpienie wątku, signal obudzenie jednego z uśpionych wątków, broadcast obudzenie wszystkich uśpionych wątków. Systemy operacyjne Wykład 7 44/78

Zamek interfejs Typ: pthread_mutex_t Operacje: pthread_mutex_lock(pthread_mutex_t *m) zajęcie zamka, pthread_mutex_unlock(pthread_mutex_t *m) zwolnienie zamka, pthread_mutex_trylock(pthread_mutex_t *m) próba zajęcia zamka w sposób nie blokujący wątku w przypadku niepowodzenia. Systemy operacyjne Wykład 7 45/78

Zamek implementacja pthread_mutex_lock zajęcie zamka, jeśli jest wolny, ustawienie stanu wątku na oczekujący i umieszczenie w kolejce, jeśli zamek jest zajęty. pthread_mutex_unlock ustawienie zamka na wolny, jeśli kolejka oczekujących wątków jest pusta, wybranie wątku z niepustej kolejki wątków oczekujących i ustawienie jego stanu na gotowy. pthread_mutex_trylock zajęcie zamka lub kontynuacja przetwarzania. Systemy operacyjne Wykład 7 46/78

Zmienna warunkowa interfejs Typ: pthread_cond_t Operacje: pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m) uśpienie wątku na zmiennej warunkowej, pthread_cond_signal(pthread_cond_t *c) obudzienie jednego z wątków uśpionych na zmiennej warunkowej, pthread_cond_broadcast(pthread_cond_t *c) obudzienie wszystkich wątków uśpionych na zmiennej warunkowej. Systemy operacyjne Wykład 7 47/78

Zmienna warunkowa implementacja pthread_cond_wait ustawienie stanu wątku na oczekujący i umieszczenie go w kolejce. pthread_cond_signal wybranie jednego wątku z kolejki i postępowanie takie, jak przy zajęciu zamka, zignorowanie sygnału, jeśli kolejka jest pusta. pthread_cond_broadcast ustawienie wszystkich wątków oczekujących na zmiennej warunkowej w kolejce do zajęcia zamka, a jeśli zamek jest wolny zmiana stanu jednego z nich na gotowy. Systemy operacyjne Wykład 7 48/78

Zasada funkcjonowania zmiennej zignorowani e sygnału pthread_cond_wait warunkowej wątek 1 wątek 2 pthread_cond_signal pthread_cond_signal Systemy operacyjne Wykład 7 49/78

Użycie zmiennych warunkowych (schemat 1) wątek oczekujący pthread_mutex_lock(&m) sygnał TAK warunek spełniony? NIE pthread_cond_wait(&c,&m) pthread_mutex_unlock(&m) Systemy operacyjne Wykład 7 50/78

Użycie zmiennych warunkowych (schemat 1) wątek sygnalizujący pthread_mutex_lock(&m) modyfikacja zmiennych współdzielonych pthread_cond_signal(&c) sygnał pthread_mutex_unlock(&m) Systemy operacyjne Wykład 7 51/78

Użycie zmiennych warunkowych (schemat 2) wątek sygnalizujący pthread_mutex_lock(&m) modyfikacja zmiennych współdzielonych pthread_cond_signal(&c) TAK warunek spełniony? NIE sygnał pthread_mutex_unlock(&m) Systemy operacyjne Wykład 7 52/78

Użycie zmiennych warunkowych (schemat 2) wątek oczekujący pthread_mutex_lock(&m) sygnał TAK warunek spełniony? NIE pthread_cond_wait(&c,&m) pthread_mutex_unlock(&m) Systemy operacyjne Wykład 7 53/78

Klasyczne problemy synchronizacji Problem producenta i konsumenta problem ograniczonego buforowania w komunikacji międzyprocesowej. Problem czytelników i pisarzy problem synchronizacji dostępu do zasobu w trybie współdzielonym i wyłącznym. Problem pięciu filozofów problem jednoczesnego dostępu do dwóch zasobów (ryzyko głodzenia i zakleszczenia). Problem śpiących fryzjerów problem synchronizacji w interakcji klient-serwer przy ograniczonym kolejkowaniu. Systemy operacyjne Wykład 7 54/78

Problem producenta i konsumenta Producent produkuje jednostki określonego produktu i umieszcza je w buforze o ograniczonym rozmiarze. Konsument pobiera jednostki produktu z bufora i konsumuje je. Z punktu widzenia producenta problem synchronizacji polega na tym, że nie może on umieścić kolejnej jednostki, jeśli bufor jest pełny. Z punktu widzenia konsumenta problem synchronizacji polega na tym, że nie powinien on mięć dostępu do bufora, jeśli nie ma tam żadnego elementu do pobrania. Systemy operacyjne Wykład 7 55/78

Synchronizacja producenta i konsumenta za pomocą semaforów ogólnych Dane współdzielone const n: Integer := rozmiar bufora; shared buf: array [0..n-1] of ElemT; shared wolne: Semaphore := n; shared zajęte: Semaphore := 0; Systemy operacyjne Wykład 7 56/78

Synchronizacja producenta i konsumenta za pomocą semaforów Producent ogólnych cd. local i: Integer := 0; local elem: ElemT; while... do begin produkuj(elem); P(wolne); buf[i] := elem; i := (i+1) mod n; V(zajęte); end; Systemy operacyjne Wykład 7 57/78

Synchronizacja producenta i konsumenta za pomocą semaforów Konsument ogólnych cd. local i: Integer := 0; local elem: ElemT; while... do begin P(zajęte); elem := buf[i]; i := (i+1) mod n; V(wolne); konsumuj(elem); end; Systemy operacyjne Wykład 7 58/78

Problem czytelników i pisarzy Dwa rodzaje użytkowników czytelnicy i pisarze korzystają ze wspólnego zasobu czytelni. Czytelnicy korzystają z czytelni w trybie współdzielonym, tzn. w czytelni może przebywać w tym samym czasie wielu czytelników. Pisarze korzystają z czytelni w trybie wyłącznym, tzn. w czasie, gdy w czytelni przebywa pisarz, nie może z niej korzystać inny użytkownik (ani czytelnik, ani inny pisarz). Synchronizacja polega na blokowaniu użytkowników przy wejściu do czytelni, gdy wymaga tego tryb dostępu. Systemy operacyjne Wykład 7 59/78

Synchronizacja czytelników i pisarzy za pomocą semaforów binarnych Dane współdzielone shared l_czyt: Integer := 0; shared mutex_r: Binary_Semaphore := true; shared mutex_w: Binary_Semaphore := true; Systemy operacyjne Wykład 7 60/78

Synchronizacja czytelników i pisarzy za pomocą semaforów binarnych cd. Czytelnik while... do begin P(mutex_r); l_czyt := l_czyt + 1; if l_czyt = 1 then P(mutex_w); V(mutex_r); czytanie; P(mutex_r); l_czyt := l_czyt - 1; if l_czyt = 0 then V(mutex_w); V(mutex_r); end; Systemy operacyjne Wykład 7 61/78

Synchronizacja czytelników i pisarzy za pomocą semaforów binarnych cd. Pisarz while... do P(mutex_w); pisanie; V(mutex_w); end; Systemy operacyjne Wykład 7 62/78

Problem pięciu filozofów Przy okrągłym stole siedzi pięciu filozofów, którzy na przemian myślą (filozofują) i jedzą makaron ze wspólnej miski. Żeby coś zjeść, filozof musi zdobyć dwa widelce, z których każdy współdzieli ze swoim sąsiadem. Widelec dostępny jest w trybie wyłącznym może być używany w danej chwili przez jednego filozofa. Należy zsynchronizować filozofów tak, aby każdy mógł się w końcu najeść przy zachowaniu reguł dostępu do widelców oraz przy możliwie dużej przepustowości w spożywaniu posiłków. Systemy operacyjne Wykład 7 63/78

Synchronizacja 5 filozofów za pomocą semaforów binarnych shared dopuść: Semaphore := 4; shared widelec: array[0..4] of Binary_Semaphore := true; Filozof nr i (i = 0... 4) while... do begin myślenie; P(dopuść); P(widelec[i]); P(widelec[(i+1) mod 5]); jedzenie; V(widelec[i]); V(widelec[(i+1) mod 5]); V(dopuść); end; Systemy operacyjne Wykład 7 64/78

Problem śpiących fryzjerów W salonie fryzjerskim jest poczekalnia z p miejscami oraz n foteli, obsługiwanych przez fryzjerów. Do salonu przychodzi klient, budzi fryzjera, po czym fryzjer znajduje wolny fotel i obsługuje klienta. Jeśli nie ma wolnego fotela, klient zajmuje jedno z wolnych miejsc w poczekalni. Jeśli nie ma miejsca w poczekalni, klient odchodzi. Problem polega na zsynchronizowaniu fryzjerów oraz klientów w taki sposób, aby jeden fryzjer w danej chwili obsługiwał jednego klienta i w tym samym czasie klient był obsługiwany przez jednego fryzjera. Systemy operacyjne Wykład 7 65/78

Synchronizacja śpiących fryzjerów za pomocą semaforów Dane współdzielone const p: Integer := pojemność poczekalni; const n: Integer := liczba foteli; shared l_czek: Integer := 0; shared mutex: Binary_Semaphore := true; shared klient: Semaphore := 0; shared fryzjer: Semaphore := 0; shared fotel: Semaphore := n; Systemy operacyjne Wykład 7 66/78

Synchronizacja śpiących fryzjerów Klient za pomocą semaforów cd. while... do begin P(mutex); if l_czek < p then begin l_czek := l_czek + 1; V(klient); V(mutex); P(fryzjer); strzyżenie; end else V(mutex); end; Systemy operacyjne Wykład 7 67/78

Synchronizacja śpiących fryzjerów za pomocą semaforów cd. Fryzjer while... do begin P(klient); P(fotel); P(mutex); l_czek := l_czek - 1; V(fryzjer); V(mutex); strzyżenie; V(fotel); end; Systemy operacyjne Wykład 7 68/78

Monitory Monitor jest strukturalnym mechanizmem synchronizacji, którego definicja obejmuje: hermetycznie zamkniętą definicję zmiennych (pól), definicję wejść, czyli procedur umożliwiających wykonywanie operacji na polach monitora. Wewnątrz monitora może być aktywny co najwyżej jeden proces. Proces może zostać uśpiony wewnątrz monitora na zmiennej warunkowej. Uśpiony proces może zostać obudzony przez wysłanie sygnału związanego z daną zmienną warunkową. Systemy operacyjne Wykład 7 69/78

Ogólny schemat definicji monitora type nazwa_monitora = monitor deklaracje zmiennych procedure entry proc_1(...); begin... end; procedure entry proc_n(...); begin... end; begin kod inicjalizujący end. Systemy operacyjne Wykład 7 70/78

Ograniczony bufor cykliczny definicja oparta na monitorze type Buffer = monitor pula : array [0..n-1] of ElemT; wej, wyj, licz : Integer; pusty, pełny : Condition; procedure entry wstaw(elem: ElemT); begin if licz = n then pełny.wait; pula[wej] := elem; wej := (wej + 1) mod n; licz := licz + 1; pusty.signal; end; Systemy operacyjne Wykład 7 71/78

Ograniczony bufor cykliczny definicja oparta na monitorze cd. procedure entry pobierz(var elem: ElemT); begin if licz = 0 then pusty.wait; elem := pula[wyj]; wyj := (wyj + 1) mod n; licz := licz - 1; pełny.signal; end; begin wej := 0; wyj := 0; licz := 0; end. Systemy operacyjne Wykład 7 72/78

Synchronizacja producenta i konsumenta za pomocą monitora Dane współdzielone shared buf: Buffer; Producent Konsument local elem: ElemType; while... do begin produkuj(elem); buf.wstaw(elem); end; local elem: ElemType; while... do begin buf.pobierz(elem); konsumuj(elem); end; Systemy operacyjne Wykład 7 73/78

Synchronizacja czytelników i pisarzy za pomocą monitora Dane współdzielone Czytelnik Pisarz shared czytelnia: Monitor; czytelnia.wejście_czytelnika; czytanie; czytelnia.wyjście_czytelnika; czytelnia.wejście_pisarza; pisanie; czytelnia.wyjście_pisarza; Systemy operacyjne Wykład 7 74/78

Regiony krytyczne Region krytyczny jest fragmentem programu oznaczonym jako S, wykonywanym przy wyłącznym dostępie do pewnej zmiennej współdzielonej, wskazanej w jego definicji oznaczonej jako v. Wykonanie regionu krytycznego uzależnione jest od wyrażenia logicznego B, a przetwarzanie blokowane jest do momentu, aż wyrażenie będzie prawdziwe. shared v: T; region v when B do S; Systemy operacyjne Wykład 7 75/78

Synchronizacja producenta i konsumenta za pomocą regionu krytycznego Dane współdzielone shared buf: record pula : array [0..n-1] of ElemT; wej, wyj, licz : Integer; end; Systemy operacyjne Wykład 7 76/78

Synchronizacja producenta i konsumenta za pomocą regionu Producent krytycznego cd. local elem: ElemT; while... do begin produkuj(elem); region buf when buf.licz < n do begin buf.pula[wej]:= elem; buf.wej := (buf.wej+1) mod n; buf.licz := buf.licz + 1; end; end; Systemy operacyjne Wykład 7 77/78

Synchronizacja producenta i konsumenta za pomocą regionu Konsument krytycznego cd. local elem: ElemT; while... do begin region buf when buf.licz > 0 do begin elem := buf.pula[wyj]; buf.wyj := (buf.wyj+1) mod n; buf.licz := buf.licz - 1; end; konsumuj(elem); end; Systemy operacyjne Wykład 7 78/78