semafory

18
Semafory Semafory Jarosław Kuchta Jarosław Kuchta

Upload: altessa

Post on 04-Jan-2016

53 views

Category:

Documents


2 download

DESCRIPTION

Jarosław Kuchta. Semafory. podniesienie semafora opuszczenie semafora. Operacje są niepodzielne (atomowe), tzn. że żadna z tych operacji nie może zostać przerwana. Operacje. ogólny binarny. ograniczony uogólniony. Rodzaje semaforów. Semafor ogólny (definicja klasyczna Dijkstry). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Semafory

SemaforySemafory

Jarosław KuchtaJarosław Kuchta

Page 2: Semafory

OperacjeOperacje podniesienie semaforapodniesienie semafora opuszczenie semaforaopuszczenie semafora

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

Page 3: Semafory

Rodzaje semaforówRodzaje semaforów ogólnyogólny binarnybinarny

ograniczonyograniczony uogólnionyuogólniony

Page 4: Semafory

Semafor ogólnySemafor ogólny (definicja klasyczna (definicja klasyczna

Dijkstry)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ściNie spełnia warunku niepodzielności

Page 5: Semafory

Semafor ogólnySemafor ogólny(definicja praktyczna (definicja praktyczna

BenAriego)BenAriego) Zmienna całkowita S:Zmienna całkowita S:

podniesienie – V(S): podniesienie – V(S): if (są procesy wstrzymane podczas opuszczania S)if (są procesy wstrzymane podczas opuszczania S)

wznów jeden z nich;wznów jeden z nich;elseelse S = S +1;S = S +1;

opuszczenie – P(S): opuszczenie – P(S): if (S>0)if (S>0) S = S – 1;S = S – 1;elseelse wstrzymaj;wstrzymaj;

Spełnia warunek niepodzielnościSpełnia warunek niepodzielności

Page 6: Semafory

Konstrukcja semaforaKonstrukcja semafora

P(S):

S = S - 1

S = 0

Proces A

V(S):

S = S + 1

ktoś czeka

Proces B

Opuszczenie

Podniesienie

Page 7: Semafory

Semafor binarnySemafor binarny (definicja klasyczna) (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;

Page 8: Semafory

Semafor binarnySemafor binarny(definicja praktyczna)(definicja praktyczna)

Zmienna logiczna S:Zmienna logiczna S: podniesienie – VB(S): podniesienie – VB(S):

if (są procesy wstrzymane podczas opuszczania S)if (są procesy wstrzymane podczas opuszczania S)

wznów jeden z nich;wznów jeden z nich;

elseelse

S = 1;S = 1; opuszczenie – PB(S): opuszczenie – PB(S):

if (S==1)if (S==1)

S = 0;S = 0;

elseelse

wstrzymaj;wstrzymaj;

Page 9: Semafory

Semafor binarny a Semafor binarny a ogólnyogólny

Semafor binarny NIE jest szczególnym Semafor binarny NIE jest szczególnym przypadkiem semafora ogólnego.przypadkiem semafora ogólnego.

Semafor binarny nie pamięta liczby Semafor binarny nie pamięta liczby operacji podniesienia.operacji podniesienia.

Semafor binarny może zastąpić ogólny, Semafor binarny może zastąpić ogólny, gdy realizuje wzajemne wykluczanie.gdy realizuje wzajemne wykluczanie.

Podniesienie już podniesionego semafora Podniesienie już podniesionego semafora binarnego jest błędem.binarnego jest błędem.

Page 10: Semafory

Semafor dwustronnie Semafor dwustronnie ograniczonyograniczony

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)if (S==N) wstrzymaj;wstrzymaj;else if (są procesy wstrzymane podczas opuszczania S)else if (są procesy wstrzymane podczas opuszczania S)

wznów jeden z nich;wznów jeden z nich;elseelse S = S + 1;S = S + 1;

opuszczenie – P(S): opuszczenie – P(S): if (S==0)if (S==0) wstrzymaj;wstrzymaj;else if (są procesy wstrzymane podczas opuszczania S)else if (są procesy wstrzymane podczas opuszczania S)

wznów jeden z nich;wznów jeden z nich;elseelse S = S – 1;S = S – 1;

Page 11: Semafory

Semafor uogólnionySemafor uogólniony Operacje podniesienia i opuszczenia mają Operacje podniesienia i opuszczenia mają

dodatkowy operand dodatkowy operand nn podniesienie – V(S, podniesienie – V(S, nn): ):

if (są procesy wstrzymane podczas opuszczania S o if (są procesy wstrzymane podczas opuszczania S o mm)){{

wznów jeden z nich;wznów jeden z nich; S = S – S = S – mm + + nn;;}}elseelse S = S + S = S + nn;;

opuszczenie – P(S, opuszczenie – P(S, nn): ): if (S >= if (S >= nn)) S = S – S = S – nn;;elseelse wstrzymaj;wstrzymaj;

Page 12: Semafory

Jednoczesne operacje Jednoczesne operacje semaforowesemaforowe

KoniunktywnaKoniunktywna PAND (S1, S2): PAND (S1, S2):

if (S1 > 0 && S2 > 0)if (S1 > 0 && S2 > 0)

{{

S1 = S1 – 1;S1 = S1 – 1;

S2 = S2 – 1;S2 = S2 – 1;

}}

elseelse

wstrzymaj;wstrzymaj;

AlternatywnaAlternatywna POR (S1, S2): POR (S1, S2):

if (S1 > 0 || S2 > 0)if (S1 > 0 || S2 > 0)

{{

S1 = S1 – 1;S1 = S1 – 1;

S2 = S2 – 1;S2 = S2 – 1;

}}

elseelse

wstrzymaj;wstrzymaj;

Page 13: Semafory

PrzykładyPrzykłady

Producenci i konsumenciProducenci i konsumenci Czytelnicy i pisarzeCzytelnicy i pisarze Pięciu filozofówPięciu filozofów

Page 14: Semafory

1 producent i 1 1 producent i 1 konsumentkonsument

void Producent ()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 ()void Konsument (){{ Dane dane; Dane dane; int j = 0;int j = 0; while (true)while (true) {{ P(Pełne);P(Pełne); dane = bufor [j];dane = bufor [j]; j = (j + 1) % N;j = (j + 1) % N; V(Wolne);V(Wolne); Konsumuj (dane);Konsumuj (dane); }}}}

Semaphore Wolne = N;Semaphore Wolne = N;Semaphore Pełne = 0;Semaphore Pełne = 0;Dane[] bufor = new Dane[N];Dane[] bufor = new Dane[N];

Page 15: Semafory

Wielu producentów i Wielu producentów i konsumentówkonsumentów

void Producent ()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 ()void Konsument (){{ Dane dane; Dane dane; while (true)while (true) {{ P(Pełne);P(Pełne); PB(j_S);PB(j_S); dane = bufor [j];dane = bufor [j]; j = (j+1) % N;j = (j+1) % N; VB(j_S);VB(j_S); V(Wolne);V(Wolne); Konsumuj (dane);Konsumuj (dane); }}}}

Semaphore Wolne = N;Semaphore Wolne = N;Semaphore Pełne = 0;Semaphore Pełne = 0;Dane[] bufor = new Dane[N];Dane[] bufor = new Dane[N];

int j = 0; int k = 0int j = 0; int k = 0BinarySemaphore i_S = 1;BinarySemaphore i_S = 1;BinarySemaphore j_S = 1; BinarySemaphore j_S = 1;

Page 16: Semafory

Czytelnicy i pisarzeCzytelnicy i pisarze

void Czytelnik ()void Czytelnik (){{ while (true)while (true) {{ Własne_Sprawy();Własne_Sprawy(); P(Wolne);P(Wolne); Czytanie();Czytanie(); V(Wolne);V(Wolne); }}}}

void Pisarz ()void Pisarz (){{while (true)while (true) {{ Własne_Sprawy();Własne_Sprawy(); PB(W);PB(W); // Pisarz stopniowo zajmuje // Pisarz stopniowo zajmuje

miejscamiejsca // w czytelni// w czytelni for (int j=0; j<M; j++) P(Wolne);for (int j=0; j<M; j++) P(Wolne); Pisanie();Pisanie(); VB(W);VB(W); }}}}

int M; // liczba czytelnikówint M; // liczba czytelnikówint P; // liczba pisarzyint P; // liczba pisarzySemaphore Wolne = N; // liczba miejsc w czytelniSemaphore Wolne = N; // liczba miejsc w czytelniBinarySemaphore W = 1; // wzajemne wykluczanie się pisarzyBinarySemaphore W = 1; // wzajemne wykluczanie się pisarzy

Page 17: Semafory

Pięciu filozofówPięciu filozofów(z możliwością (z możliwością zagłodzenia)zagłodzenia)

BinarySemaphore[] Pałeczki = new BinarySemaphore[] {1, 1, BinarySemaphore[] Pałeczki = new BinarySemaphore[] {1, 1, 1, 1, 1};1, 1, 1};

void Filozof(int i)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); }}}}

Page 18: Semafory

Pięciu filozofówPięciu filozofów(z lokajem)(z lokajem)

BinarySemaphore[] Pałeczki = new BinarySemaphore[] {1, 1, 1, 1, BinarySemaphore[] Pałeczki = new BinarySemaphore[] {1, 1, 1, 1, 1};1};

Semaphore Lokaj = 4;Semaphore Lokaj = 4;void Filozof(int i)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); }}}}