Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Semafory Jarosław Kuchta. Operacje podniesienie semafora podniesienie semafora opuszczenie semafora opuszczenie semafora Operacje są niepodzielne (atomowe),

Podobne prezentacje


Prezentacja na temat: "Semafory Jarosław Kuchta. Operacje podniesienie semafora podniesienie semafora opuszczenie semafora opuszczenie semafora Operacje są niepodzielne (atomowe),"— Zapis prezentacji:

1 Semafory Jarosław Kuchta

2 Operacje podniesienie semafora podniesienie semafora opuszczenie semafora opuszczenie semafora Operacje są niepodzielne (atomowe), tzn. że żadna z tych operacji nie może zostać przerwana.

3 Rodzaje semaforów ogólny ogólny binarny binarny ograniczony uogólniony

4 Semafor ogólny (definicja klasyczna Dijkstry) Zmienna całkowita S: Zmienna całkowita S: podniesienie – V(S): S = S + 1; podniesienie – V(S): S = S + 1; opuszczenie – P(S): while (S<=0); S = S – 1; opuszczenie – P(S): while (S<=0); S = S – 1; Nie spełnia warunku niepodzielności Nie spełnia warunku niepodzielności

5 Semafor ogólny (definicja praktyczna BenAriego) Zmienna całkowita S: Zmienna całkowita S: podniesienie – V(S): podniesienie – V(S): if (są procesy wstrzymane podczas opuszczania S) wznów jeden z nich; else S = S +1; S = S +1; opuszczenie – P(S): opuszczenie – P(S): if (S>0) S = S – 1; S = S – 1;else wstrzymaj; wstrzymaj; Spełnia warunek niepodzielności Spełnia warunek niepodzielności

6 Konstrukcja semafora P(S): S = S - 1 S = 0 Proces A V(S): S = S + 1 ktoś czeka Proces B OpuszczeniePodniesienie

7 Semafor binarny (definicja klasyczna) Zmienna logiczna S: Zmienna logiczna S: podniesienie – VB(S): S = 1; podniesienie – VB(S): S = 1; opuszczenie – PB(S): while (S==1); S = 0; opuszczenie – PB(S): while (S==1); S = 0;

8 Semafor binarny (definicja praktyczna) Zmienna logiczna S: Zmienna logiczna S: podniesienie – VB(S): podniesienie – VB(S): if (są procesy wstrzymane podczas opuszczania S) wznów jeden z nich; else S = 1; S = 1; opuszczenie – PB(S): opuszczenie – PB(S): if (S==1) S = 0; S = 0;else wstrzymaj; wstrzymaj;

9 Semafor binarny a ogólny Semafor binarny NIE jest szczególnym przypadkiem semafora ogólnego. Semafor binarny NIE jest szczególnym przypadkiem semafora ogólnego. Semafor binarny nie pamięta liczby operacji podniesienia. Semafor binarny nie pamięta liczby operacji podniesienia. Semafor binarny może zastąpić ogólny, gdy realizuje wzajemne wykluczanie. Semafor binarny może zastąpić ogólny, gdy realizuje wzajemne wykluczanie. Podniesienie już podniesionego semafora binarnego jest błędem. Podniesienie już podniesionego semafora binarnego jest błędem.

10 Semafor dwustronnie ograniczony Zmienna całkowita S z zakresu (0..N): Zmienna całkowita S z zakresu (0..N): podniesienie – V(S): podniesienie – V(S): if (S==N) wstrzymaj; wstrzymaj; else if (są procesy wstrzymane podczas opuszczania S) wznów jeden z nich; else S = S + 1; S = S + 1; opuszczenie – P(S): opuszczenie – P(S): if (S==0) wstrzymaj; wstrzymaj; else if (są procesy wstrzymane podczas opuszczania S) wznów jeden z nich; else S = S – 1; S = S – 1;

11 Semafor uogólniony Operacje podniesienia i opuszczenia mają dodatkowy operand n Operacje podniesienia i opuszczenia mają dodatkowy operand n podniesienie – V(S, n): podniesienie – V(S, n): if (są procesy wstrzymane podczas opuszczania S o m) { wznów jeden z nich; S = S – m + n; S = S – m + n;}else S = S + n; S = S + n; opuszczenie – P(S, n): opuszczenie – P(S, n): if (S >= n) S = S – n; S = S – n;else wstrzymaj; wstrzymaj;

12 Jednoczesne operacje semaforowe Koniunktywna Koniunktywna PAND (S1, S2): PAND (S1, S2): if (S1 > 0 && S2 > 0) { S1 = S1 – 1; S1 = S1 – 1; S2 = S2 – 1; S2 = S2 – 1;}else wstrzymaj; wstrzymaj; Alternatywna POR (S1, S2): if (S1 > 0 || S2 > 0) { S1 = S1 – 1; S2 = S2 – 1; } else wstrzymaj;

13 Przykłady Producenci i konsumenci Producenci i konsumenci Czytelnicy i pisarze Czytelnicy i pisarze Pięciu filozofów Pięciu filozofów

14 1 producent i 1 konsument void Producent () { Dane dane; Dane dane; int i = 0; int i = 0; while (true) while (true) { Produkuj (out dane); Produkuj (out dane); P(Wolne); P(Wolne); bufor [i] = dane; bufor [i] = dane; i = (i + 1) % N; i = (i + 1) % N; V(Pełne); V(Pełne); }} void Konsument () { Dane dane; int j = 0; while (true) { P(Pełne); dane = bufor [j]; j = (j + 1) % N; V(Wolne); Konsumuj (dane); } Semaphore Wolne = N; Semaphore Pełne = 0; Dane[] bufor = new Dane[N];

15 Wielu producentów i konsumentów void Producent () { Dane dane; Dane dane; while (true) while (true) { Produkuj (out dane); Produkuj (out dane); P(Wolne); P(Wolne); PB(i_S); PB(i_S); bufor [i] = dane; bufor [i] = dane; i = (i+1) % N; i = (i+1) % N; VB(i_S); VB(i_S); V(Pełne); V(Pełne); }} void Konsument () { Dane dane; while (true) { P(Pełne); PB(j_S); dane = bufor [j]; j = (j+1) % N; VB(j_S); V(Wolne); Konsumuj (dane); } Semaphore Wolne = N; Semaphore Pełne = 0; Dane[] bufor = new Dane[N]; int j = 0; int k = 0 BinarySemaphore i_S = 1; BinarySemaphore j_S = 1;

16 Czytelnicy i pisarze void Czytelnik () { while (true) while (true) { Własne_Sprawy(); Własne_Sprawy(); P(Wolne); P(Wolne); Czytanie(); Czytanie(); V(Wolne); V(Wolne); }} void Pisarz () { while (true) { Własne_Sprawy(); PB(W); // Pisarz stopniowo zajmuje miejsca // w czytelni for (int j=0; j

17 Pięciu filozofów (z możliwością zagłodzenia) BinarySemaphore[] Pałeczki = new BinarySemaphore[] {1, 1, 1, 1, 1}; void Filozof(int i) { while (true) while (true) { Myślenie(); Myślenie(); PB(Pałeczki, i); PB(Pałeczki, i); PB(Pałeczki, (i+1) % 5); PB(Pałeczki, (i+1) % 5); Jedzenie(); Jedzenie(); VB(Pałeczki, i); VB(Pałeczki, i); VB(Pałeczki, (i+1) % 5); VB(Pałeczki, (i+1) % 5); }}

18 Pięciu filozofów (z lokajem) BinarySemaphore[] Pałeczki = new BinarySemaphore[] {1, 1, 1, 1, 1}; Semaphore Lokaj = 4; void Filozof(int i) { while (true) while (true) { Myślenie(); Myślenie(); P(Lokaj); P(Lokaj); PB(Pałeczki, i); PB(Pałeczki, i); PB(Pałeczki, (i+1) % 5); PB(Pałeczki, (i+1) % 5); Jedzenie(); Jedzenie(); VB(Pałeczki, i); VB(Pałeczki, i); VB(Pałeczki, (i+1) % 5); VB(Pałeczki, (i+1) % 5); V(Lokaj); V(Lokaj); }}


Pobierz ppt "Semafory Jarosław Kuchta. Operacje podniesienie semafora podniesienie semafora opuszczenie semafora opuszczenie semafora Operacje są niepodzielne (atomowe),"

Podobne prezentacje


Reklamy Google