Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Monitory Jarosław Kuchta. Co to jest monitor Monitor to zebrane w jednej konstrukcji programowej zmienne i operacje na tych zmiennych. Monitor to zebrane.

Podobne prezentacje


Prezentacja na temat: "Monitory Jarosław Kuchta. Co to jest monitor Monitor to zebrane w jednej konstrukcji programowej zmienne i operacje na tych zmiennych. Monitor to zebrane."— Zapis prezentacji:

1 Monitory Jarosław Kuchta

2 Co to jest monitor Monitor to zebrane w jednej konstrukcji programowej zmienne i operacje na tych zmiennych. Monitor to zebrane w jednej konstrukcji programowej zmienne i operacje na tych zmiennych. Część tych operacji jest udostępnianych na zewnątrz monitora. Część tych operacji jest udostępnianych na zewnątrz monitora. Tylko udostępnione operacje umożliwiają działanie na zmiennych. Tylko udostępnione operacje umożliwiają działanie na zmiennych. Wykonanie operacji monitora jest sekcją krytyczną wykonującego ją procesu. Wykonanie operacji monitora jest sekcją krytyczną wykonującego ją procesu. Wewnątrz monitorowanej operacji istnieje możliwość wstrzymywania i wznawiania procesów. Wewnątrz monitorowanej operacji istnieje możliwość wstrzymywania i wznawiania procesów.

3 Szczegóły zmienna c typu contition zmienna c typu contition umożliwia wstrzymywanie / wznawianie procesów umożliwia wstrzymywanie / wznawianie procesów posiada własną kolejkę procesów posiada własną kolejkę procesów operacje: operacje: wait(c) – powoduje wstrzymanie procesu wykonującego tę operację; proces jest wstawiany na koniec kolejki właściwej dla zmiennej c; monitor jest zwalniany wait(c) – powoduje wstrzymanie procesu wykonującego tę operację; proces jest wstawiany na koniec kolejki właściwej dla zmiennej c; monitor jest zwalniany signal(c) – powoduje wznowienie wstrzymanego procesu; wznawiany jest pierwszy proces z kolejki właściwej dla zmiennej c; proces ten czeka, aż proces wywołujący tę operację zwolni monitor signal(c) – powoduje wznowienie wstrzymanego procesu; wznawiany jest pierwszy proces z kolejki właściwej dla zmiennej c; proces ten czeka, aż proces wywołujący tę operację zwolni monitor empty(c) – funkcja sprawdzająca, czy kolejka właściwa dla zmiennej c nie jest pusta empty(c) – funkcja sprawdzająca, czy kolejka właściwa dla zmiennej c nie jest pusta

4 Przechodzenie procesów przez monitor P void P(float x) { … wait (C); … signal (C); … } Monitor M kolejka wejściowa M.P(1.0) kolejka procesów oczekujących na C kolejka procesów wstrzymanych po signal

5 Przykłady Wzajemne wykluczanie Wzajemne wykluczanie Producenci i konsumenci Producenci i konsumenci Czytelnicy i pisarze Czytelnicy i pisarze Pięciu filozofów Pięciu filozofów

6 Wzajemne wykluczanie static class Wykluczanie: Monitor { public static void Dostęp() public static void Dostęp() { Enter (this); Enter (this); // Działanie na zasobach // Działanie na zasobach Exit (this); Exit (this); }} class ProcesGłówny { void Działaj() { // własne sprawy Wykluczanie.Działaj(); // własne sprawy }

7 Producenci i konsumenci void Produkuj (Dane element) { if (n == N) if (n == N) Bufor.Wait (Producenci); Bufor.Wait (Producenci); n = n + 1; n = n + 1; bufor[ i] = element; bufor[ i] = element; i = (i+1) % N; i = (i+1) % N; Bufor.Signal (Konsumenci); Bufor.Signal (Konsumenci);} void Konsumuj (out Dane element) { if (n == 0) if (n == 0) Bufor.Wait (Konsumenci); Bufor.Wait (Konsumenci); n = n – 1; n = n – 1; element = bufor [j]; element = bufor [j]; j = (j+1) % N; j = (j+1) % N; Bufor.Signal (Producenci); Bufor.Signal (Producenci);} Monitor Bufor; Object Producenci = new Object(); Object Konsumenci = new Object(); const int N=10; Dane[] bufor = new Dane[N]; int n=0; int i = 0; int j = 0;

8 Czytelnicy i pisarze (z możliwością zagłodzenia pisarza) void Początek_Czytania() { if (ile_pisze > 0) if (ile_pisze > 0) Wait (Czytelnicy); Wait (Czytelnicy); ile_czyta++; ile_czyta++;} class Czytelnia: Monitor { Object Czytelnicy = new Object(); Object Czytelnicy = new Object(); Object Pisarze = new Object(); Object Pisarze = new Object(); int ile_czyta = 0; int ile_czyta = 0; int ile_pisze = 0; int ile_pisze = 0; void Koniec_Czytania() { ile_czyta--; ile_czyta--; if (ile_czyta == 0) if (ile_czyta == 0) Signal (Pisarze); Signal (Pisarze);} void Początek_Pisania() { if (ile_czyta + ile_pisze > 0) if (ile_czyta + ile_pisze > 0) Wait (Pisarze); Wait (Pisarze); ile_pisze = 1; ile_pisze = 1;} void Koniec_Pisania() { ile_pisze = 0; ile_pisze = 0; if (!Empty(Pisarze) if (!Empty(Pisarze) Signal (Pisarze) Signal (Pisarze) else else do Signal (Czytelnicy) do Signal (Czytelnicy) while (!Empty(Czytelnicy)) while (!Empty(Czytelnicy))}

9 Czytelnicy i pisarze (rozwiązanie poprawne) void Początek_Czytania() { if (!Empty(Czytelnicy) || ile_pisze > 0) if (!Empty(Czytelnicy) || ile_pisze > 0) Wait (Czytelnicy); Wait (Czytelnicy); ile_czyta++; ile_czyta++;} class Czytelnia: Monitor { Object Czytelnicy = new Object(); Object Czytelnicy = new Object(); Object Pisarze = new Object(); Object Pisarze = new Object(); int ile_czyta = 0; int ile_czyta = 0; int ile_pisze = 0; int ile_pisze = 0; void Koniec_Czytania() { ile_czyta--; ile_czyta--; if (ile_czyta == 0) if (ile_czyta == 0) Signal (Pisarze); Signal (Pisarze);} void Początek_Pisania() { if (ile_czyta + ile_pisze > 0) if (ile_czyta + ile_pisze > 0) Wait (Pisarze); Wait (Pisarze); ile_pisze = 1; ile_pisze = 1;} void Koniec_Pisania() { ile_pisze = 0; ile_pisze = 0; if (!Empty(Pisarze) if (!Empty(Pisarze) Signal (Pisarze) Signal (Pisarze) else else do Signal (Czytelnicy) do Signal (Czytelnicy) while (!Empty(Czytelnicy)) while (!Empty(Czytelnicy))}

10 Pięciu filozofów (przymiarka pierwsza) void Biorę(int i) { while (wolne [i] < 2) while (wolne [i] < 2) Wait (Filozof [i]); Wait (Filozof [i]); wolne [(i–1 ) % 5] = wolne [(i–1) % 5] - 1; wolne [(i–1 ) % 5] = wolne [(i–1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1;} class Pałeczki: Monitor { int [] wolne = new int[] { 2, 2, 2, 2, 2}; int [] wolne = new int[] { 2, 2, 2, 2, 2}; object [] Filozof = new object[5]; object [] Filozof = new object[5]; void Odkładam(int i) { wolne [(i–1) % 5] = wolne [(i–1) % 5] + 1; wolne [(i–1) % 5] = wolne [(i–1) % 5] + 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] + 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] + 1; Signal (Filozof[(i–1) % 5]); Signal (Filozof[(i–1) % 5]); Signal (Filozof[(i+1) % 5]); Signal (Filozof[(i+1) % 5]);}

11 Pięciu filozofów (przymiarka druga) void Biorę(int i) { while (wolne [i] < 2) while (wolne [i] < 2) Wait (Filozof [i]); Wait (Filozof [i]); wolne [(i–1 ) % 5] = wolne [(i–1) % 5] - 1; wolne [(i–1 ) % 5] = wolne [(i–1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1;} class Pałeczki: Monitor { int [] wolne = new int[] { 2, 2, 2, 2, 2}; int [] wolne = new int[] { 2, 2, 2, 2, 2}; object [] Filozof = new object[5]; object [] Filozof = new object[5]; void Odkładam(int i) { wolne [(i–1) % 5] = wolne [(i–1) % 5] - 1; wolne [(i–1) % 5] = wolne [(i–1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1; wolne [(i+1) % 5] = wolne [(i+1) % 5] - 1; if (wolne[(i-1) % 5] == 2) if (wolne[(i-1) % 5] == 2) Signal (Filozof[(i–1) % 5]); Signal (Filozof[(i–1) % 5]); if (wolne[(i+1) % 5] == 2) if (wolne[(i+1) % 5] == 2) Signal (Filozof[(i+1) % 5]); Signal (Filozof[(i+1) % 5]);}

12 Pięciu filozofów (rozwiązanie poprawne) void Biorę(int i) { if (ile_je == 4) Wait (Lokaj); if (ile_je == 4) Wait (Lokaj); ile_je ++; ile_je ++; if (zajęta [i]) if (zajęta [i]) Wait (Pałeczka [i]); Wait (Pałeczka [i]); zajęta[ i] = true; zajęta[ i] = true; if (zajęta[(i+1) % 5]) if (zajęta[(i+1) % 5]) Wait (Pałeczka [(i+1) % 5]); Wait (Pałeczka [(i+1) % 5]); zajęta[(i+1) % 5] = true; zajęta[(i+1) % 5] = true;} class Pałeczki: Monitor { bool [] zajęta = new bool[5]; bool [] zajęta = new bool[5]; object [] Pałeczka = new object[5]; object [] Pałeczka = new object[5]; object Lokaj = new object(); object Lokaj = new object(); void Odkładam(int i) { zajęta [i] = false; zajęta [i] = false; Signal (Pałeczka[i]); Signal (Pałeczka[i]); zajęta [(i+1) % 5] = false; zajęta [(i+1) % 5] = false; Signal (Pałeczka[(i+1) % 5]); Signal (Pałeczka[(i+1) % 5]); ile_je --; ile_je --; Signal (Lokaj); Signal (Lokaj);} int ile_je = 0; int ile_je = 0;

13 Implementacje Monitora Zmienne warunkowe z blokowaniem Zmienne warunkowe z blokowaniem Zmienne warunkowe bez blokowania Zmienne warunkowe bez blokowania Monitory z niejawnym warunkiem Monitory z niejawnym warunkiem

14 Zmienne warunkowe z blokowaniem (monitor Hoara) wątek powiadamiający jest blokowany do czasu, aż powiadomiony wątek oczekujący nie opuści monitora lub nie zatrzyma się w ponownym oczekiwaniu na warunek. wątek powiadamiający jest blokowany do czasu, aż powiadomiony wątek oczekujący nie opuści monitora lub nie zatrzyma się w ponownym oczekiwaniu na warunek. dwie główne kolejki wątków: dwie główne kolejki wątków: e - kolejka wejściowa e - kolejka wejściowa s - kolejka wątków powiadamiających s - kolejka wątków powiadamiających każda zmienna warunkowa c posiada własną kolejkę c.q wątków oczekujących na spełnienie warunku. każda zmienna warunkowa c posiada własną kolejkę c.q wątków oczekujących na spełnienie warunku. a.q b.q wait(a) wait(b) signal es enter exit

15 Zmienne warunkowe bez blokowania (monitor Massy) operacja signal nie powoduje opuszczenia monitora operacja signal nie powoduje opuszczenia monitora wątek oczekujący jest przenoszony do kolejki e, aby zaczekać, aż wątek powiadamiający zakończy swoje zadanie wątek oczekujący jest przenoszony do kolejki e, aby zaczekać, aż wątek powiadamiający zakończy swoje zadanie kolejka s jest niepotrzebna kolejka s jest niepotrzebna operacja signal nazywa się teraz notify operacja signal nazywa się teraz notify a.q b.q wait(a) wait(b) e enter exit notified

16 Monitory z niejawnym warunkiem W języku Java każdy obiekt może stać się monitorem W języku Java każdy obiekt może stać się monitorem metody wykluczane są oznaczone słowem kluczowym synchronized. metody wykluczane są oznaczone słowem kluczowym synchronized. monitor ma kolejkę wejściową i pojedynczą kolejkę monitor ma kolejkę wejściową i pojedynczą kolejkę wszystkie operacje dotyczą tej jednej kolejki (najwyżej jeden warunek) wszystkie operacje dotyczą tej jednej kolejki (najwyżej jeden warunek) q wait e enter exit notified

17 Klasa Monitor w C# (1) public static class Monitor public static class Monitor public static void Enter (Object obj) – wejście do monitora public static void Enter (Object obj) – wejście do monitora public static bool TryEnter (Object obj) public static bool TryEnter (Object obj) public static bool TryEnter (Object obj, int millisecondsTimeout) public static bool TryEnter (Object obj, int millisecondsTimeout) public static bool TryEnter (Object obj, TimeSpan timeout) public static bool TryEnter (Object obj, TimeSpan timeout) public static void Exit (Object obj) – wyjście z monitora public static void Exit (Object obj) – wyjście z monitora

18 Klasa Monitor w C# (2) public static bool Wait (Object obj) – oczekiwanie public static bool Wait (Object obj) – oczekiwanie public static bool Wait (Object obj, int millisecondsTimeout) public static bool Wait (Object obj, int millisecondsTimeout) public static bool Wait(Object obj, TimeSpan timeout) public static bool Wait(Object obj, TimeSpan timeout) public static bool Wait (Object obj, int millisecondsTimeout, bool exitContext) public static bool Wait (Object obj, int millisecondsTimeout, bool exitContext) public static bool Wait( Object obj, TimeSpan timeout, bool exitContext ) public static bool Wait( Object obj, TimeSpan timeout, bool exitContext ) public static void Pulse (Object obj) – sygnalizacja public static void Pulse (Object obj) – sygnalizacja public static void PulseAll (Object obj) – sygnalizacja do wszystkich public static void PulseAll (Object obj) – sygnalizacja do wszystkich


Pobierz ppt "Monitory Jarosław Kuchta. Co to jest monitor Monitor to zebrane w jednej konstrukcji programowej zmienne i operacje na tych zmiennych. Monitor to zebrane."

Podobne prezentacje


Reklamy Google