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

Podobne dokumenty
Systemy operacyjne Wzajemne wykluczanie i synchronizacja

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

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

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

Systemy operacyjne III

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

SOP2 - semafory. grudzień

Systemy operacyjne. Zajęcia 11. Monitory

Materiały do wykładu Systemy operacyjne (SOI.B) 1 dla kierunku Informatyka

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

Programowanie Równoległe i Rozproszone

Materiały do wykładu Systemy operacyjne (SOI.B) 1 dla kierunku Informatyka

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

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

Synchronizacja procesów i wątków

synchronizacji procesów

synchronizacji procesów

Monitory. Jarosław Kuchta

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

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

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

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

Wprowadzenie do programowania współbieżnego

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

Monitory. Wady semafora

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

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

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

Systemy Operacyjne synchronizacja i komunikacja procesów

Klasyczne problemy synchronizacji

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

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

- graf przejśd stanów procesów w systemie Unix,

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

Problemy współbieżności

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

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

9. Problem wzajemnego wykluczania i sekcji krytycznej

Programowanie wielowątkowe. Tomasz Borzyszkowski

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

Synchronizacja procesów

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

Synchronizacja procesów

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

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

Systemowe mechanizmy synchronizacji procesów

2 Implementacja w systemie Linux 2.4

Programowanie współbieżne Wykład 7. Iwona Kochaoska

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

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 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

Podstawy programowania komputerów

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

4. Procesy pojęcia podstawowe

4. Procesy pojęcia podstawowe

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

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

Wielozadaniowość w systemie Microsoft Windows

Futex (Fast Userspace Mutex) Łukasz Białek

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

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

Synchronizacja procesów

Podstawy Informatyki Systemy operacyjne

Szablony funkcji i szablony klas

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

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Język Java wątki (streszczenie)

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

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

Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla

Zagadnienia zaawansowane. Lech Kruś,

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

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

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

Modelowanie procesów współbieżnych

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

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

I.Wojnicki, Tech.Inter.

Uniwersytet w Białymstoku Wydział Ekonomiczno-Informatyczny w Wilnie SYLLABUS na rok akademicki 2010/2011

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

Zaawansowane programowanie w C++ (PCP)

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

Uniwersytet w Białymstoku Wydział Ekonomiczno-Informatyczny w Wilnie SYLLABUS na rok akademicki 2009/2010

Język ludzki kod maszynowy

Warstwy oprogramowania wejścia/wyjścia

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Podstawy współbieżności

Działanie systemu operacyjnego

Zaawansowany kurs języka Python

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Programowanie wspóªbie»ne

41. System operacyjny. Postrzeganie systemu operacyjnego przez warstwę oprogramowania użytkowego

Wstęp do programowania 2

Transkrypt:

Przykład wystąpienia wyścigu Systemy Operacyjne Wzajemne wykluczanie i synchronizacja dr inż. Tomasz Jordan Kruk T.Kruk@ia.pw.edu.pl Przykład void echo() chin = getchar(); chout = chin; putchar( chout ); Instytut Automatyki i Informatyki Stosowanej Politechnika Warszawska PROCES 1 1 2 chin = getchar(); 3 4 chout = chin; 5 putchar( chout ); 6 7 PROCES 2 chin = getchar(); chout = chin; putchar( chout ); Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.1/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.3/33 Wyścigi w systemie operacyjnym Sekcja krytyczna IPC - komunikacja między procesami (ang. InterProcess Communication) W SO wykonujące się procesy często dzielą obszary wspólnej pamięci, pliki lub inne zasoby. Należy unikać tzw. wyścigów. Def. 1 Warunkami wyścigu (ang. race conditions) nazywamy sytuację, w której dwa lub więcej procesów wykonuje operację na zasobach dzielonych, a ostateczny wynik tej operacji jest zależny od momentu jej realizacji. Aby zapobiec warunkom wyścigu należy stworzyć mechanizm zabraniający więcej niż jednemu procesowi dostępu do zasobów dzielonych w tym samym czasie. Należy wprowadzić mechanizm wzajemnego wykluczania WW (ang. mutual exclusion). Def. 2 Sekcja krytyczna - fragment programu, w którym występują instrukcje dostępu do zasobów dzielonych. Instrukcje tworzące sekcje krytyczne muszą być poprzedzone i zakończone operacjami realizującymi wzajemne wykluczanie. Wybór właściwych operacji realizujących WW stanowi istotę każdego systemu operacyjnego. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.2/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.4/33

Warunki konieczne implementacji SK Mechanizmy z aktywnym oczekiwaniem Dla prawidłowej implementacji sekcji krytycznych muszą być spełnione następujące 3 warunki, przy czym nie czynimy żadnych założeń dotyczących szybkości działania procesów, czy też liczby procesorów: 1. wewnątrz SK może przebywać tylko jeden proces, 2. jakikolwiek proces znajdujący się poza SK, nie może zablokować innego procesu pragnącego wejść do SK, 3. każdy proces oczekujący na wejście do SK powinień otrzymać prawo dostępu w rozsądnym czasie. 1. Blokowanie przerwań (ang. disabling interrupts) każdy proces wchodząc do SK blokuje przerwania, a wychodząc odblokowuje, zaleta: proces znajdujący się w SK może uaktualnić zawartość zasobów dzielonych bez obawy, że inny proces będzie interweniował. wada: jeśli proces na wyjściu z SK nie odblokuje przerwań, to nastąpi upadek systemu; ponadto, w przypadku systemów wieloprocerowych technika nieskuteczna, technika blokowania przerwań może być stosowana w jądrze SO przy uaktualnianiu niektórych systemowych struktur danych, lecz nie może być wykorzystywana do realizacji wzajemnego wykluczania w przestrzeni użytkownika. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.5/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.7/33 Mechanizmy realizujące wzajemne wykluczanie 2. Zmienne blokujące (ang. lock variables) Dwa podejścia: 1. Mechanizmy z aktywnym oczekiwaniem na wejście do SK, (a) blokowanie przerwań, (b) zmienne blokujące (niepoprawne), (c) ścisłe następstwo (niepoprawne), (d) algorytm Petersona, (e) instrukcja TSL. 2. Mechanizmy z zawieszaniem procesu oczekującego na wejście do SK. (a) sleep i wakeup (niepoprawne), (b) semafory, (c) monitory, (d) komunikaty. Rozwiązanie programowe. Niech będzie dana zmienna dzielona o nazwie lock. Niech początkowo lock ma wartość 0. Kiedy proces P chce wejść do SK, to sprawdza wartość lock. jeżeli lock = 0, to ustawia lock na 1 i wchodzi do SK; jeżeli nie, to proces czeka aż lock stanie się równe 0. Tak więc: lock = 0 oznacza, że nie ma procesu w SK, lock = 1 oznacza, że jest w SK. Rozwiązanie niepoprawne, występuje problem wyścigu. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.6/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.8/33

3. Ścisłe następstwo (ang. strict alternation) Algorytm Petersona (II) PROCES 0 1 2 3 while( turn!= 0 ) 4 /* wait */; 5 critical_section(); 6 turn = 1; 7 noncritical_section(); 8 PROCES 1 while( turn!= 1 ) /* wait */; critical_section(); turn = 0; noncritical_section(); początkowo turn=0, został naruszony warunek 2. P0 może zostać zablokowany przez P1 znajdujący się poza SK. Stan taki nazywamy stanem zagłodzenia. rozwiązanie wymaga ścisłego następstwa (przełączania), nie można wydrukować dwóch kolejnych plików przez ten sam proces, rozwiązanie niepoprawne, wyeliminowany problem wyścigu zastąpiony problemem zagłodzenia. #define FALSE 0 #define TRUE 1 #define N 2 int turn; int interested[n]; /* initially 0 */ enter_region(int process) /* process nr 0 or 1 */ int other; other = 1 - process; interested[process] = TRUE; turn = process; while( (turn == process) && (interested[other] == TRUE) ); leave_region(int process) interested[process]=false; Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.9/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.11/33 4. Algorytm Petersona (I) 5. Instrukcja TSL Łącząc ideę ścisłego następstwa ze zmiennymi blokującymi T. Dekker pierwszy znalazł rozwiązanie (1965) wzajemnego wykluczania. W 1981 r. Peterson znalazł prostsze rozwiązanie tego problemu. Każdy proces przed wejściem do SK wywołuje enter_region z własnym numerem jako parametrem, zaś po wyjściu leave_region. Wspomaganie sprzętowe, niektóre komputery są wyposażone w instrukcję TEST AND SET LOCK (TSL) instrukcja TSL wykonuje się niepodzielnie w następujący sposób: czyta zawartość słowa pamięci do rejestru, zapamiętuje wartość rejestru w pamięci, operacje czytania i pisania są niepodzielne, tzn. inny proces nie ma dostępu do miejsca pamięci, aż nie nastąpi zakończenie instrukcji TSL, W celu użycia TSL posłużymy się zmienną dzieloną o nazwie flag, przy pomocy której będziemy koordynować dostęp do zasobów dzielonych. kiedy flag = 0, to każdy proces może ją ustawić na 1 stosując TSL, a następnie wejść do SK, wychodząc z SK ustawia wartość flag na 0 stosując zwykłą instrukcje move. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.10/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.12/33

Organizacja sekcji krytycznej z wykorzystaniem TSL Przykład wykorzystania sleep()/ wakeup() 1 enter_region: 2 tsl register, flag 3 cmp register, #0 4 jnz enter_region 5 ret leave_region: mov flag, #0 ret Procesy ubiegające się o dostęp do SK muszą wywoływać procedury enter_region i leave_region we właściwym porządku. Wady rozwiązań opartych na koncepcji aktywnego oczekiwania strata czasu procesora, możliwość blokady systemu przy wielopriorytetowym sposobie szeregowania procesów, tzw. zjawisko inwersji priorytetów. Problem producent-konsument (problem ograniczonego bufora). Niech dwa procesy dzielą wspólny bufor o skończonym wymiarze. Proces o nazwie producent (Pr) będzie umieszczał informacje (inf) w kolejnych miejscach buforu. Proces o nazwie konsument (Ko) będzie pobierał informacje z tego buforu. Przyjmujemy założenia: jeżeli Pr napotka na bufor pełny, to ma być zawieszony, jeżeli Ko napotka na bufor pusty, to ma być zawieszony, Niech w zmiennej o nazwie count będzie zapamiętywana liczba miejsc zajętych w buforze. Ponadto niech maksymalna liczba miejsc będzie równa N. Producent: if( count == N ) zaśnij else dodaj inf i count++ Konsument: if( count == 0 ) zaśnij else pobierz inf i count Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.13/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.15/33 Rozwiązania z zawieszaniem procesu oczekującego Producent-Konsument z RC (z wyścigiem) 1. Sleep and Wakeup Najprostszym rozwiązaniem jest utworzenie dwóch wywołań systemowych sleep() i wakeup(). wywołanie sleep() powoduje, że proces wywołujący zostaje zawieszony do momentu, gdy inny proces nie obudzi danego poprzez wywołanie wakeup(), funkcja wakeup wywoływana jest z jednym argumentem, numerem procesu, który ma być obudzony. #define N 100 int count=0; void producer(void) while (TRUE) produce_item(); if (count == N) sleep(); enter_item(); count = count + 1; if (count == 1) wakeup(consumer); void consumer(void) while (TRUE) if (count == 0) sleep(); remove_item(); count = count - 1; if (count == N-1) wakeup(producer); consume_item(); Wada: sygnał wakeup może nie zostać przechwycony i utracony, co prowadzi do blokady. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.14/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.16/33

2. Semafory: definicja Semafory: algorytm producent-konsument 1965 r. - E. W. Dijkstra proponuje zmienną typu całkowitego do zliczania sygnałów wakeup, zaproponowana zmienna nazwana semaforem, inicjowana nieujemną wartością całkowitą i zdefiniowana poprzez definicje niepodzielnych operacji P(s) i V(s): P(S): while S 0 do ; S := S 1; V(S): S := S + 1; holenderskie P i V od proberen (testować) i verhogen (zwiększać), teraz dla semaforów wielowartościowych zazwyczaj down()/up(), wait()/signal(), a dla semaforów binarnych często lock()/unlock(). #define N 100 semaphore mutex = 1; semaphore empty = N; semaphore full = 0; int count = 0; void producer(void) while (TRUE) produce_item(); down( empty ); down( mutex ); enter_item(); up( mutex ); up( full ); void consumer(void) while (TRUE) down( full); down( mutex ); remove_item(); up( mutex ); up( empty ); consume_item(); Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.17/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.19/33 Semafory: realizacja Mutex - semafor binarny struct semaphore int count; queue_t queue; stosowane, gdy nie trzeba zliczać wystąpień sygnałów a jedynie organizować wzajemne wykluczanie (ang. mutual exclusion). szybka i prosta implementacja np. dla pakietu wątków poziomu użytkownika void down( semaphore s ) s.count--; if( s.count < 0 ) wstaw proces do kolejki s.queue; zablokuj proces; void up( semapahore s ) s.count++; if( s.count <= 0 ) usuń jeden z procesów z s.queue i wstaw do kolejki gotowych; mutex_lock: TSL REGISTER, MUTEX CMP REGISTER, #0 JZE ok CALL thread_yield JMP mutex_lock ok: RET mutex_unlock: MOVE MUTEX, #0 RET Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.18/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.20/33

3. Monitory Monitory: wstrzymywanie procesu W celu łatwiejszego pisania programów realizujących wzajemne wykluczanie Hoare (1974) i Hansen (1975) zaproponowali mechanizm synchronizacji wysokiego poziomu zwany monitorem. monitor stanowi zbiór procedur, zmiennych i struktur danych, które są zgrupowane w specjalnym module. W każdej chwili tylko jeden proces aktywny może przebywać w danym monitorze. monitory są konstrukcją języka wysokiego poziomu. Za właściwą implementację wzajemnego wykluczania jest odpowiedzialny kompilator. w przedstawionej koncepcji brak mechanizmu, który powodowałby zawieszenie procesu, Zaproponowano wprowadzenie zmiennych warunkowych z dwoma operacjami wait( zmienna ) oraz signal( zmienna ). kiedy procedura monitora wykrywa sytuację, że nie może kontynuować obliczeń wykonuje operację wait na pewnej zmiennej warunkowej. Proces wykonujący procedurę jest zawieszany. inny proces może teraz wejść do sekcji krytycznej. Przy wyjściu wykonuje signal w celu obudzenia zawieszonego procesu na zmiennej warunkowej. Po wywołaniu signal: Hoare: proces obudzony kontynuuje działanie, a wywołujący jest zawieszany, Hansen: proces wywołujący musi natychmiast opuścić monitor. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.21/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.23/33 Monitory: zapis Monitory: algorytm producent-konsument (I) Zapis monitora w hipotetycznych językach. monitor Buffer var byte b[100]; integer head, tail; procedure insert( int item )... procedure remove( int item )... end monitor; monitor Buffer char b[100]; integer head, tail; public void insert( Item i )... public Item remove( void )... monitor Buffer condition full, empty; integer count; procedure enter; if count = N then wait(full); enter_item; count := count + 1; if count = 1 then signal(empty); count := 0; end monitor; procedure remove; if count = 0 then wait(empty); remove_item; count := count - 1; if count = N-1 then signal(full); Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.22/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.24/33

Monitory: algorytm producent-konsument (II) Komunikaty: algorytm producent/konsument (I) procedure producer; while true do produce_item; Buffer.enter; end procedure consumer; while true do Buffer.remove; consume_item; end Mechanizm monitorów, własności: wait()/signal() zapobiega możliwości gubienia sygnałów występującej przy sleep()/wakeup(), niewiele języków wysokiego poziomu jest wyposażone w monitory (Euclid, Concurrent Pascal) część języków posiada mechanizmy niepełne (Java i synchronized), rozwiązanie nierealizowalne w środowisku rozproszonym ze względu na wymóg dostępności wspólnej pamięci. Założenia wstępne: wiadomości są tego samego rozmiaru, wiadomości wysłane lecz nie odebrane są buforowane automatycznie przez system operacyjny, użyto N wiadomości, analogicznie do N miejsc dzielonego bufora, komunikaty są traktowane jako medium transportowe dla informacji, tzn. mogą być wypełnione bądź bez informacji, algorytm rozpoczyna wysłanie przez konsumenta N pustych komunikatów do producenta, aby producent mógł wysłać nową informację do konsumenta musi mieć dostępny pusty komunikat odebrany od konsumenta - liczba komunikatów w obiegu między producentem a konsumentem jest stała i niezależna od szybkości produkcji czy konsumpcji informacji. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.25/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.27/33 4. Komunikaty (ang. message passing) Komunikaty: algorytm producent/konsument (II) Oparte na dwóch wywołaniach systemowych: send( destination, &message ); receive( source, &message ); Sposoby adresowania wiadomości: 1. adresowanie bezpośrednie, każdy proces posiada unikatowy adres. Można stosować poniższy mechanizm spotkań: jeżeli send wywołane przed receive, to proces wysyłający zawieszany do momentu przesłania wiadomości po wywołaniu receive, jeżeli receive wywołane przed send, to proces odbierający zawieszany do momentu przesłania wiadomości po wywołaniu send. 2. adresowanie pośrednie poprzez skrzynkę pośredniczącą pełniącą funkcję bufora pośredniczącego. Argumentem wywołań send i receive jest adres skrzynki a nie adres konkretnego procesu. #define N 100 void producer( void ) int item; message m; produce_item( &item ); receive( consumer, &m ); build_message( &m, &item ); send( consumer, &m ); void consumer( void ) int item, i; message m; for( i = 0; i < N; i++ ) send( producer, &m ); receive( consumer, &m ); extract_item( &m, &item ); send( consumer, &m ); Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.26/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.28/33

Problem ucztujących filozofów (I) Problem ucztujących filozofów (III) pięciu filozofów przy stole z rozstawionymi pięcioma talerzami i pięcioma widelcami pomiędzy talerzami, każdy filozof tylko je i myśli, do jedzenia potrzebuje talerza (z zawartością) i dwóch widelców, widelec zasobem dzielonym przez sąsiadujących filozofów, jak zorganizować synchronizację? #define N 5 #define THINKING 0 #define HUNGRY 1 #define EATING 2 void philosopher(int i) while (TRUE) think( ); take_forks(i); eat( ); put_forks(i); void take_forks(int i) down(&mutex); state[i] = HUNGRY; test(i); up(&mutex); down(&s[i]); #define LEFT ( i + N - 1) % N #define RIGHT ( i + 1 ) % N int state[n]; semaphore mutex = 1; semaphore s[n]; void put_forks(i) down(&mutex); state[i] = THINKING; test(left); test(right); up(&mutex); void test(i) if (state[i] == HUNGRY && \\ state[left]!= EATING && \\ state[right]!= EATING) state[i] = EATING; up(&s[i]); Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.29/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.31/33 Problem ucztujących filozofów (II) Problem czytelników i pisarzy #define N 5 void philosopher( int i ) think() take_fork( i ); take_fork( ( i + 1 ) % N ); eat(); put_fork( ( i + 1 ) % N ); put_fork( i ); Rozwiązanie niepoprawne - możliwość blokady. semaphore mutex = 1; semaphore db = 1; int rc = 0; void writer( void ) think_up_data( ); down( &db ); write_data_base( ); up( &db ); void reader(void) down( &mutex ); rc = rc + 1; if( rc == 1 ) down( &db ); up( &mutex ); read_data_base( ); down( &mutex ); rc = rc - 1; if( rc == 0 ) up(&db); up(&mutex); use_data_read( ); Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.30/33 Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.32/33

Problem śpiącego fryzjera #define CHAIRS 5 semaphore customers = 0; semaphore barbers = 0; semaphore mutex = 1; int waiting = 0; void barber( void ) down( &customers ); down( &mutex ); waiting = waiting - 1; up( &barbers ); up( &mutex ); cut_hair(); /* ilu siedzi na krzesłach */ /* ilu śpi nie pracując */ void customer( void ) down( &mutex ); if( waiting < CHAIRS ) waiting = waiting + 1; up( &customers ); up( &mutex ); down( &barbers ); get_haircut(); else up( &mutex ); Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.33/33