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

Podobne dokumenty
SOP2 - semafory. grudzień

Programowanie Równoległe i Rozproszone

Klasyczne problemy synchronizacji

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

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

J. Ułasiewicz Programowanie aplikacji współbieżnych 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

Programowanie Równoległe i Rozproszone

Programowanie wspóªbie»ne

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

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

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

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

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

Wprowadzenie do programowania współbieżnego

Synchronizacja procesów i wątków

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

synchronizacji procesów

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

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

synchronizacji procesó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 Wzajemne wykluczanie i synchronizacja

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

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

Wydział Fizyki i Informatyki Stosowanej, Uniwersytetu Łódzkiego Łódź. Java podstawy języka, wykład 4 1

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

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

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

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

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

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

Systemy Operacyjne synchronizacja i komunikacja procesów

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

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Synchronizacja procesów

Programowanie wspóªbie»ne

Systemy operacyjne III

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

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

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

Synchronizacja procesów

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

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Komunikacja asynchroniczna w modelu rozproszonym

Monitory. Jarosław Kuchta

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

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

Strategia "dziel i zwyciężaj"

Synchronizacja procesów

Temat zajęć: Mechanizmy IPC: semafory

Synchronizacja procesów

Systemy operacyjne. Zajęcia 11. Monitory

Systemowe mechanizmy synchronizacji procesów

3URJUDPRZDQLHZVSyáELH*QHZVWS

I.Wojnicki, PHP. PHP PHP Hypertext Preprocessor. Igor Wojnicki. Ktedra Informatyki Stosowanej Akademia Górniczo-Hutnicza w Krakowie.

XII. Warunek wielokrotnego wyboru switch... case

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

Wstęp do programowania

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Wstęp do programowania

Stany procesu. nowy aktywny oczekujący gotowy zakończony. zakończ. nowy. przerwanie gotowy aktywny. we/wy czek. we/wy czekający

Krzysztof Jakubczyk. Zadanie 2

Programowanie wielowątkowe. Tomasz Borzyszkowski

I.Wojnicki, Tech.Inter.


2 Implementacja w systemie Linux 2.4

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

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

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

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

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

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

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Lista dwukierunkowa - przykład implementacji destruktorów

Wstęp do programowania

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

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

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Wskaźniki. Programowanie Proceduralne 1

Kurs programowania. Wykład 8. Wojciech Macyna

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

Klasy i obiekty cz II

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

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:


Platformy Programistyczne Podstawy języka Java

4.2 Sposób korzystania z l acza

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

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

Transkrypt:

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

Ilustracja 5. Schemat problemu czytelników i pisarzy Wykład 4 strona 2/24

Opis problemu: Jest n czytelników, m pisarzy i jedna wspólna strona. KaŜdy czytelnik czyta informacje ze strony, kaŝdy pisarz moŝe pisać na stronie; Wielu czytelników moŝe naraz czytać dane ze strony; Pisarz zajmuje stronę na wyłączność (Ŝaden inny proces pisarz czy czytelnik nie moŝe uŝywać w tym czasie strony); Nie ma ograniczeń czasowych na czytanie i pisanie, ale operacje te są skończone; Rozwiązanie: Pisarz: Robi coś; Chce pisać; Pisze; Informuje, Ŝe skończył pisać; Czytelnik: Robi coś; Chce czytać; Czyta; Informuje, Ŝe skończył czytać; Wykład 4 strona 3/24

int no_of_r = 0; /* liczba procesów - czytelników aktualnie czytających*/ Boolean semaphore sp, w = 1, 1 ; /* w słuŝy do synchronizacji dostępu do no_of_r, sp słuŝy do synchronizacji dostępu do strony */ process :: reader; void main() while(1) PB(w); no_of_r ++; if (no_of_ r == 1) PB(sp); /* pierwszy czytający proces opuszcza sp */ VB(w); /* czyta ze strony*/ PB(w); no_of_r --; if (no_of_r == 0) VB(sp); /* ostatni czytający proces podnosi semafor sp */ VB(w); Wykład 4 strona 4/24

process :: writer; void main() while(1) PB(sp); /* kaŝdy piszący proces musi opuścić semafor sp*/ /* pisze na stronie */ VB(sp); Wykład 4 strona 5/24

Przykład 6a Problem czytelników i pisarzy z priorytetem dla pisarzy. Dodajemy dwa dodatkowe warunki do zadania: Pisarze mają priorytet, czyli, jeśli jakikolwiek pisarz chce pisać, Ŝaden czytelnik nie moŝe zacząć czytać. Nie ma priorytetu pomiędzy czytelnikami. int no_of_r,no_of_w = 0,0; /*no_of_r - liczba aktualnie czytających procesów no_of_w liczba procesów, które chcą pisać */ Boolean semaphore sp,sr = 1, 1; Boolean semaphore w1, w2, w3= 1, 1, 1; /* w1 do dostępu do no_of_r w2 do dostępu do no_of_w w3 dodatkowe drzwi dla czytelników sp podobnie jak w poprzednim przykładzie sr dla priorytetu pisarzy*/ Wykład 4 strona 6/24

process:: reader; void main() while(1) PB(w3); PB(sr); PB(w1); no_of_r++; if (no_of_r == 1) VB(w1); VB(sr); VB(w3); /* czyta */ PB(w1); no_of_r--; if ( no_of_r == 0) VB(w1); PB(sp); VB(sp); Wykład 4 strona 7/24

process :: writer; void main(); while(1) PB(w2); no_of_w++; if (no_of_w == 1 ) PB(sr); VB(w2); PB(sp); /* pisze */ VB(sp); PB(w2); no_of_w--; if (no_of_w==0) VB(sr); VB(w2); Wykład 4 strona 8/24

Jednoczesne operacje na semaforach Modyfikacje semaforów Rozszerzone operacje na semaforach (ang. Concurrent semaphore operations) (Dijkstra) PD(s 1,s 2,...,s i,...,s n ); Czekaj aŝ wszystkie si, si>0 (i=1,...,n); for (i=1;i<=n;i++) si = si-1; VD(s 1,s 2,...,s i,...,s n ); for (i=1;i<=n;i++) si = si+1; Wykład 4 strona 9/24

Uogólnione operacje na semaforach Wartość semafora jest zmieniana o wartość całkowitą n. PN(s,n); Waiting until s >= n; s=s-n; VN(s,n); s = s+n; Wykład 4 strona 10/24

Priorytety w dostępie do zasobów Priorytety są realizowane na podstawie numeru procesu. Procesy z mniejszymi numerami mają wyŝszy priorytet. Wykład 4 strona 11/24

semaphore prior = 2*N-1; // N liczba procesów process:: P(name) /*1 <=name<=n */ int i; while(1) PN(prior,N+name-1); /* prior == N-name Ŝaden inny proces nie moŝe wejść do sekcji krytycznej */ /*zaŝądaj zasobu; */ /*sekcja krytyczna */ /*zwolnienie zasobu */ VN(prior, name-1); /* prior = =N-1 nadal Ŝaden proces nie moŝe wejść do sekcji krytycznej*/ for(i=1;i<=n;i++) /* wyszukiwanie czekającego procesu z najwyŝszym priorytetem */ VN(prior,1); /* prior == N+i-1 proces z numerem i moŝe wejść do sekcji krytycznej, i=1,...,n */ } } Wykład 4 strona 12/24

Przykład 6 (zmieniony) Czytelnicy i pisarze bez priorytetu semaphore w = M; /* M > liczba procesów - pisarzy*/ process :: reader; while(1) PN(w,1); /*M moŝe zwiększyć w o 1 */ /* teraz czyta */ VN(w,1); process :: writer; while(1) PN(w,M); /*tylko jeden proces moŝe zmniejszyć w o M*/ /* teraz pisze*/ VN(w,M); Wykład 4 strona 13/24

Przykład 6 a (zmieniony) Czytelnicy - pisarze z priorytetem dla pisarzy semaphore sp, r = M,M ; /* M>= liczby moŝliwych czytelników sp podobnie jak we wcześniejszym przykładzie r dla realizowania priorytetu pisarzy*/ Wykład 4 strona 14/24

process :: reader; void main(); while(1) PN(r,M); PN(sp,1); VN(r,M-1); /*pisarze mogą zwiększyć semafor r o 1*/ VN(r,1); /*czytelnik czeka jeśli jakiś pisarz czeka*/ /* czyta*/ VN(sp,1); process :: writer; void main(); while(1) PN(r,1); PN(sp,M); /* pisze */ VN(sp,M); VN(r,1); Wykład 4 strona 15/24

Przykład 7. n filozofów je rybę. Ilustracja 7.1 Filozofowie jedzący rybę Wykład 4 strona 16/24

Opis problemu: N filozofów siedzi dokoła okrągłego stołu, kaŝdy na swoim miejscu. Jest n talerzy i n widelców na stole. Talerze znajdują się na wprost filozofów, widelce leŝą pomiędzy talerzami. Czynności filozofa: pętla Myśli Chce podnieść swoje widelce Je rybę posługując się widelcami Odkłada widelce Wykład 4 strona 17/24

Rozwiązanie problemu: Spróbuj podnieść swoje widelce Rozwiązanie 1. Czekaj aŝ lewy widelec będzie wolny Podnosi lewy widelec Czekaj aŝ prawy widelec będzie wolny Podnosi prawy widelec Złe rozwiązanie: zakleszczenie Wykład 4 strona 18/24

Rozwiązanie 2: Pętla Czekaj aŝ lewy jest wolny Podnieś lewy IF prawy jest zajęty OdłóŜ lewy widelec ELSE Podnieś prawy widelec EXIT } } Złe rozwiązanie: zakleszczenie Wykład 4 strona 19/24

Wniosek: Rozwiązanie 3: Czekaj aŝ oba będą wolne Podnieś oba widelce w jednym ruchu OdłóŜ widelce OdłóŜ widelce w dowolnej kolejności Obudź tego sąsiada, który czeka na widelec (jeśli jego drugi widelec jest wolny) Wykład 4 strona 20/24

Pierwsze rozwiązanie z semaforami - zakleszczenie resource fork [N]; Boolean semaphore sem [N] = (N) 1; process Philosopher (name); while(1) /* myśli */ /* chce jeść */ PB ( sem[name]); /* podnosi lewy widelec - fork[name] */ PB ( sem[(name+1) % N] ) ; /* podnosi prawy widelec - fork[(name+1) % N] */ /* je */ VB ( sem[name] ); /*odkłada fork[name],*/ VB ( sem[(name+1) % N] ) ; /* odkłada fork [(name+1) % N] */ Wykład 4 strona 21/24

2 rozwiązanie state[i] = 0 i-ty filozof myśli state[i] = 1 i-ty filozof chce jeść state[i] = 2 i-ty filozof je resource fork [N]; Boolean semaphore filsem [N] = (N) 0; /*kaŝdy filozof ma swój własny semafor do czekania*/ int state [N] = (N) 0 ; Boolean semaphore w = 1; /* w do dostępu do tablicy stanów */ void test (int k); if ((state [(k-1)% N] <> 2 ) and ( state[k]== 1) and ( state[(k+1)%n] <> 2 )) state [k] = 2; VB(filsem[k]); " Wykład 4 strona 22/24

process Philosopher (int name); while(1) /* myśli */ /* chce jeść */ PB(w); state[name] = 1; test (name); VB(w); PB ( filsem[name] ); /* filsem[name] moŝe zostać opuszczony, jeśli został podniesiony w procedurze test(name) */ request (fork[name], fork [(name+1) % N] ) ; /* je */ release (fork[name], fork [(name+1) % N]) ; PB(w); state[name] = 0; test ((name-1) % N); test ((name+1) % N); /* sprawdzamy obydwu sąsiadów czy czekają */ /* odpowiednie semafory są podnoszone */ VB(w); Wykład 4 strona 23/24

To samo z globalnymi semaforami semaphore sem [N] = (N) 1; void philosopher(int name); while(1) /* myśli */ PD(sem[name], sem[(name+1) % N]); /*je*/ VD(sem[name], sem[(name+1) % N]); } } Wykład 4 strona 24/24