semafory

Post on 04-Jan-2016

53 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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

SemaforySemafory

Jarosław KuchtaJarosław Kuchta

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.

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

ograniczonyograniczony uogólnionyuogólniony

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

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

Konstrukcja semaforaKonstrukcja semafora

P(S):

S = S - 1

S = 0

Proces A

V(S):

S = S + 1

ktoś czeka

Proces B

Opuszczenie

Podniesienie

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;

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;

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.

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;

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;

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;

PrzykładyPrzykłady

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

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];

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;

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

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); }}}}

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); }}}}

top related