Docsity
Docsity

Przygotuj się do egzaminów
Przygotuj się do egzaminów

Studiuj dzięki licznym zasobom udostępnionym na Docsity


Otrzymaj punkty, aby pobrać
Otrzymaj punkty, aby pobrać

Zdobywaj punkty, pomagając innym studentom lub wykup je w ramach planu Premium


Informacje i wskazówki
Informacje i wskazówki

Semafory: definicje, rodzaje, przykłady, Prezentacje z Computer Science

Opracowanie z zakresu tematu

Typologia: Prezentacje

2019/2020

Załadowany 03.11.2020

niebieski
niebieski 🇵🇱

4.8

(24)

226 dokumenty

1 / 18

Toggle sidebar

Pobierz cały dokument

poprzez zakup abonamentu Premium

i zdobądź brakujące punkty w ciągu 48 godzin

bg1
Semafory
Jarosław Kuchta
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12

Podgląd częściowego tekstu

Pobierz Semafory: definicje, rodzaje, przykłady i więcej Prezentacje w PDF z Computer Science tylko na Docsity!

Semafory

Jarosław Kuchta

Operacje

  • podniesienie semafora V(s)
  • opuszczenie semafora P(s)
    • Operacje są niepodzielne

(atomowe), tzn. że żadna z

tych operacji nie może

zostać przerwana.

Semafor ogólny (definicja klasyczna Dijkstry)

  • Zmienna całkowita S:
    • podniesienie – V(S): S = S + 1;
    • opuszczenie – P(S): while (S<=0); S = S – 1;
  • Nie spełnia warunku niepodzielności

Semafor ogólny (definicja praktyczna BenAriego)

  • Zmienna całkowita S:
    • podniesienie – V(S):

if (są procesy wstrzymane podczas opuszczania S)

wznów jeden z nich;

else

S = S +1;

  • opuszczenie – P(S):

if (S>0)

S = S – 1;

else

wstrzymaj;

  • Spełnia warunek niepodzielności

Semafor binarny (definicja klasyczna)

  • Zmienna logiczna S:
    • podniesienie – VB(S): S = 1;
    • opuszczenie – PB(S): while (S!=1); S = 0;

Semafor binarny (definicja praktyczna)

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

if (są procesy wstrzymane podczas opuszczania S)

wznów jeden z nich;

else

S = 1;

  • opuszczenie – PB(S):

if (S==1)

S = 0;

else

wstrzymaj;

Semafor dwustronnie ograniczony

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

Semafor uogólniony

  • Operacje podniesienia i opuszczenia mają dodatkowy operand

n

  • podniesienie – V(S, n ): if (są procesy wstrzymane podczas opuszczania S o m ) { wznów jeden z nich; S = S – m + n ; } else S = S + n ;
  • opuszczenie – P(S, n ): if (S >= n ) S = S – n ; else wstrzymaj;

Przykłady

• Producenci i konsumenci

• Czytelnicy i pisarze

• Pięciu filozofów

1 producent i 1 konsument

void Producent () { Dane dane; int i = 0; while (true) { Produkuj (out dane); P(Wolne); bufor [i] = dane; i = (i + 1) % N; 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];

Czytelnicy i pisarze

void Czytelnik () { while (true) { Własne_Sprawy(); P(Wolne); Czytanie(); V(Wolne); } } void Pisarz () { while (true) { Własne_Sprawy(); PB(W); for (int j=0; j<M; j++) P(Wolne); Pisanie(); for (int j=0; j<M; j++) V(Wolne); VB(W); } } int M; // liczba czytelników int P; // liczba pisarzy Semaphore Wolne = N; // liczba miejsc w czytelni BinarySemaphore W = 1; // wzajemne wykluczanie się pisarzy

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)

Myślenie();

PB(Pałeczki, i);

PB(Pałeczki, (i+1) % 5);

Jedzenie();

VB(Pałeczki, i);

VB(Pałeczki, (i+1) % 5);