• Keine Ergebnisse gefunden

Programmierprimitiven:ProzessmodellundSemaphore Prinzipien,Modelle&AlgorithmenderNebenl¨aufigenProgrammierung

N/A
N/A
Protected

Academic year: 2021

Aktie "Programmierprimitiven:ProzessmodellundSemaphore Prinzipien,Modelle&AlgorithmenderNebenl¨aufigenProgrammierung"

Copied!
148
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prinzipien, Modelle & Algorithmen der Nebenl¨aufigen Programmierung Wintersemester 2020/21

Programmierprimitiven: Prozessmodell und Semaphore

Prof. Dr. David Sabel

LFE Theoretische Informatik

(2)

Inhalt

1 Einleitung

2 Erweitertes Prozessmodell

3 Semaphore Definition

Mutual-Exclusion mithilfe von Semaphore

4 Semaphore in Java

5 Anwendungsbeispiele

TCS | 08 Semaphore | WS 2020/21 2/76 Einleitung Prozessm. Semaphore Sem. Java Anwendungsbsp.

(3)

Bisher

Primitive atomare Operationen, die durch Hardware implementiert sind osungen f¨ur das Mutual-Exclusion-Problem mit den verschiedenen Primitiven

(4)

Jetzt

Softwarel¨osungen“

Primitive, die durch nebenl¨aufige Programmiersprachen bereit gestellt werden Anwendungen (klassische Probleme)

TCS | 08 Semaphore | WS 2020/21 4/76 EinleitungProzessm. Semaphore Sem. Java Anwendungsbsp.

(5)

Prozessmodell (1)

ProzesseP haben einen ZustandP.state:

bereit

(ready) laufend

(running)

laufend/running: Prozess f¨uhrt Schritte aus

bereit/ready: Prozess will Schritte ausf¨uhren, darf aber nicht mindestens ein Prozess l¨auft immer (z.B.Leerlaufprozess)

Scheduler uhrtContext-Switch aus:

Bereite Prozesse werden zu laufenden und umgekehrt

Fairness: Jeder bereite Prozess wird nach endlich vielen Schritten laufend

(6)

Prozessmodell (1)

ProzesseP haben einen ZustandP.state:

bereit

(ready) laufend

(running)

laufend/running: Prozess f¨uhrt Schritte aus

bereit/ready: Prozess will Schritte ausf¨uhren, darf aber nicht mindestens ein Prozess l¨auft immer (z.B.Leerlaufprozess) Scheduleruhrt Context-Switch aus:

Bereite Prozesse werden zu laufenden und umgekehrt

Fairness: Jeder bereite Prozess wird nach endlich vielen Schritten laufend

TCS | 08 Semaphore | WS 2020/21 5/76 EinleitungProzessm.Semaphore Sem. Java Anwendungsbsp.

(7)

Prozessmodell (1)

ProzesseP haben einen ZustandP.state:

bereit

(ready) laufend

(running)

laufend/running: Prozess f¨uhrt Schritte aus

bereit/ready: Prozess will Schritte ausf¨uhren, darf aber nicht mindestens ein Prozess l¨auft immer (z.B.Leerlaufprozess) Scheduleruhrt Context-Switch aus:

Bereite Prozesse werden zu laufenden und umgekehrt

Fairness: Jeder bereite Prozess wird nach endlich vielen Schritten laufend

(8)

Prozessmodell (2)

ProzesseP haben einen ZustandP.state:

inaktiv

(inactive)

bereit

(ready) laufend

(running)

beendet

(completed)

inaktiv: noch nicht bereit (z.B. Code wird geladen) beendet/completed: Prozess terminiert

TCS | 08 Semaphore | WS 2020/21 6/76 EinleitungProzessm.Semaphore Sem. Java Anwendungsbsp.

(9)

Prozessmodell (2)

ProzesseP haben einen ZustandP.state:

inaktiv

(inactive) bereit

(ready) laufend

(running)

beendet

(completed)

inaktiv: noch nicht bereit (z.B. Code wird geladen)

beendet/completed: Prozess terminiert

(10)

Prozessmodell (2)

ProzesseP haben einen ZustandP.state:

inaktiv

(inactive) bereit

(ready) laufend

(running) beendet

(completed)

inaktiv: noch nicht bereit (z.B. Code wird geladen) beendet/completed: Prozess terminiert

TCS | 08 Semaphore | WS 2020/21 6/76 EinleitungProzessm.Semaphore Sem. Java Anwendungsbsp.

(11)

Prozessmodell (3)

ProzesseP haben einen ZustandP.state:

inaktiv

(inactive) bereit

(ready)

blockiert

(blocked)

laufend

(running) beendet

(completed)

blockiert: Prozess darf keine Schritte ausf¨uhren blockieren / entblockieren durch Programmbefehle, nicht durch Scheduler

(12)

Prozessmodell (3)

ProzesseP haben einen ZustandP.state:

inaktiv

(inactive) bereit

(ready)

blockiert

(blocked)

laufend

(running) beendet

(completed)

blockiert: Prozess darf keine Schritte ausf¨uhren

blockieren / entblockieren durch Programmbefehle, nicht durch Scheduler

TCS | 08 Semaphore | WS 2020/21 7/76 EinleitungProzessm.Semaphore Sem. Java Anwendungsbsp.

(13)

Prozessmodell (3)

ProzesseP haben einen ZustandP.state:

inaktiv

(inactive) bereit

(ready)

blockiert

(blocked)

laufend

(running) beendet

(completed)

blockiert: Prozess darf keine Schritte ausf¨uhren blockieren / entblockieren durch Programmbefehle,

(14)

Semaphore

Begriffsherkunft:

Semaphor =

Mechanischer Signalgeber im Bahnverkehr

In der Informatik:

Abstrakter Datentyp mit Operationen

TCS | 08 Semaphore | WS 2020/21 8/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(15)

Semaphore

Begriffsherkunft:

Semaphor =

Mechanischer Signalgeber im Bahnverkehr In der Informatik:

Abstrakter Datentyp mit Operationen

(16)

Semaphor S

Attribute (i.a.):

V = Nicht-negative Ganzzahl M = Menge von Prozessen

Schreibweise f¨ur SemaphorS:S.V undS.M

Operationen:

newSem(k) erzeugt neuen Semaphor mit S.V =k und S.M =

wait(S) (alternativ:P(S) (Dijkstra, prolaag (Kunstwort, anstelle von verlaag (niederl. erniedrige) oder down(S))

signal(S) (alternativ: V(S) (Dijkstra, verhoog (niederl. erh¨ohe)) oder up(S)) werden atomarausgef¨uhrt (aus Sicht des Programmieres, d.h.

Programmiersprache sorgt f¨ur

richtige“ Implementierung)

TCS | 08 Semaphore | WS 2020/21 9/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(17)

Semaphor S

Attribute (i.a.):

V = Nicht-negative Ganzzahl M = Menge von Prozessen

Schreibweise f¨ur SemaphorS:S.V undS.M Operationen:

newSem(k) erzeugt neuen Semaphor mit S.V =k und S.M =

wait(S) (alternativ:P(S) (Dijkstra, prolaag (Kunstwort, anstelle von verlaag (niederl. erniedrige) oder down(S))

signal(S) (alternativ: V(S) (Dijkstra, verhoog (niederl. erh¨ohe)) oder up(S)) werdenatomar ausgef¨uhrt (aus Sicht des Programmieres, d.h.

Programmiersprache sorgt f¨ur richtige“ Implementierung)

(18)

Semaphor: Wait von Prozess Q, wenn S.V = 0

S.V S.M

. . . Q

laufend

wait(S)

S.V S.M

. . . Q

blockiert

TCS | 08 Semaphore | WS 2020/21 10/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(19)

Semaphor: Wait von Prozess Q, wenn S.V = 0

S.V S.M

. . . Q

laufend

wait(S)

. . . Q

blockiert

(20)

Semaphor: Wait von Prozess Q, wenn S.V > 0

. . . k

S.V S.M

Q

laufend

wait(S)

. . . k1

S.V S.M

Q

laufend

TCS | 08 Semaphore | WS 2020/21 11/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(21)

Semaphor: Wait von Prozess Q, wenn S.V > 0

. . . k

S.V S.M

Q

laufend

wait(S)

. . . k1

Q

laufend

(22)

wait(S)

SeiQ der aufrufende Prozess:

procedure wait(S) ifS.V > 0then

S.V :=S.V 1;

else

S.M := S.M ∪ {Q};

Q.state := blocked;

S.V =? 0

blockiere Q und ugeQ in S.M

ein

erniedrige S.V um 1

Ja Nein

TCS | 08 Semaphore | WS 2020/21 12/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(23)

Semaphor: Signal, wenn S.M 6= ∅

. . . k

S.V S.M

P1

blockiert

. . . Pi

blockiert

. . . Pn

blockiert

signal(S)

. . . k

S.V S.M

P1

blockiert

. . . Pi

bereit

. . . Pn

blockiert

(24)

Semaphor: Signal, wenn S.M 6= ∅

. . . k

S.V S.M

P1

blockiert

. . . Pi

blockiert

. . . Pn

blockiert

signal(S)

. . . k

S.V S.M

P1

blockiert

. . . Pi

bereit

. . . Pn

blockiert

TCS | 08 Semaphore | WS 2020/21 13/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(25)

Semaphor: Signal, wenn S.M = ∅

. . . k

S.V S.M

signal(S)

. . . k+ 1

S.V S.M

(26)

Semaphor: Signal, wenn S.M = ∅

. . . k

S.V S.M

signal(S)

. . . k+ 1

S.V S.M

TCS | 08 Semaphore | WS 2020/21 14/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(27)

signal(S)

procedure signal(S) if S.M = then

S.V := S.V + 1;

else

ahle ein ElementQ ausS.M; S.M := S.M\ {Q};

Q.state := ready;

S.M =?

erh¨ohe S.V um 1

entblockiere einQ ausS.M

Ja Nein

(28)

Invarianten

SeiS mitkinitialisierter Semaphor. Nach Ausf¨uhrung jeder AuswertungsfolgeP gilt:

S.V 0

S.V = k+|S.M|+ #signal(S,P) #wait(S,P)

−1 +1

+1 +1

+1 +1

−1 +1

wait

(S)

signal

(S)

wobei

#signal(S,P) = Anzahlsignal-Operationen inP

#wait(S,P) = Anzahlwait-Operationen inP

TCS | 08 Semaphore | WS 2020/21 16/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(29)

Invarianten

SeiS mitkinitialisierter Semaphor. Nach Ausf¨uhrung jeder AuswertungsfolgeP gilt:

S.V 0

S.V = k+|S.M|+ #signal(S,P) #wait(S,P)

−1 +1

+1 +1

+1 +1

−1 +1

wait

(S)

signal

(S)

wobei

#signal(S,P) = Anzahlsignal-Operationen inP

#wait(S,P) = Anzahlwait-Operationen inP

(30)

Invarianten

SeiS mitkinitialisierter Semaphor. Nach Ausf¨uhrung jeder AuswertungsfolgeP gilt:

S.V 0

S.V = k+|S.M|+ #signal(S,P) #wait(S,P)

−1 +1

+1 +1

+1 +1

−1 +1

wait

(S)

signal

(S) wobei

#signal(S,P) = Anzahlsignal-Operationen inP

#wait(S,P) = Anzahlwait-Operationen inP

TCS | 08 Semaphore | WS 2020/21 16/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(31)

Bin¨ are Semaphore

bisher:Generelle Semaphore bei bin¨aren Semaphore:

0S.V 1 wait unver¨andert

signaldarf nicht beliebig erh¨ohen:

procedure signal(S) if S.V = 1 then

undefined

else if S.M =then S.V := 1 else

ahle ein ElementQausS.M;

(32)

Bin¨ are Semaphore (2)

werden in Programmiersprachen oft als mutexbezeichnet

Invarianten gelten weiterhin, wennvor jedem signalein zugeh¨origes wait ausgef¨uhrt wird

TCS | 08 Semaphore | WS 2020/21 18/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(33)

Zusammenfassend nochmal: Semaphor

Qruftwait(S) auf S.V =? 0

blockiereQ und uge Qin S.M

ein

erniedrige S.V um 1

Ja Nein

signal(S)

S.M =?

erh¨ohe S.V um 1

entblockiere einQausS.M

Ja Nein

(34)

Zusammenfassend: Bin¨ arer Semaphor

V nur 0 oder 1 Qruftwait(S) auf

S.V =? 0

blockiereQ und ugeQin S.M

ein

erniedrige S.V um 1

Ja Nein

signal(S)

S.M =?

S.V =? 1

erh¨ohe S.V um 1

entblockiere einQ ausS.M Ja

Nein Ja

Nein

TCS | 08 Semaphore | WS 2020/21 20/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(35)

Mutual-Exclusion mit bin¨ arem Semaphor

Initial: S sei ein bin¨arer Semaphor, initialisiert mit 1 Programm des i. Prozesses

loop forever (P1) restlicher Code (P2) wait(S)

(P3) Kritischer Abschnitt (P4) signal(S)

end loop

(36)

Korrektheit des Algorithmus

Theorem

Der Algorithmus garantiert wechselseitigen Ausschluss und ist Deadlock-frei.

Beweis: Mutual-Exclusion

#KA(P)= Anzahl von Prozessen im Kritischen Abschnitt nach Ausf¨uhrung vonP

#KA(P) = #wait(S,P)#signal(S,P)− |S.M|

Mit InvarianteS.V =k+|S.M|+ #signal(S,P)#wait(S,P)ergibt das

#KA(P) +S.V = #wait(S,P)#signal(S,P)− |S.M| +k+|S.M|+ #signal(S,P)#wait(S,P)

=k

Dak= 1muss gelten:#KA(P)1(d.h. wechselseitiger Ausschluss)

TCS | 08 Semaphore | WS 2020/21 22/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(37)

Korrektheit des Algorithmus (2)

Theorem

Der Algorithmus garantiert wechselseitigen Ausschluss und ist Deadlock-frei.

Beweis: Deadlock-Freiheit

P =unendlich lange Auswertungsfolge, so dass Deadlock aufritt P1=Pr¨afix vonP, so dass abP1:

Kein Prozess im Kritischen Abschnitt, d.h.#KA(P1) = 0

Mind. ein ProzessP wartet (ist blockiert), d.h. S.V = 0undP S.M Unm¨oglich, da #KA(P1) +S.V = 1

(38)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

TCS | 08 Semaphore | WS 2020/21 24/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(39)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

(40)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

TCS | 08 Semaphore | WS 2020/21 24/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(41)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S)

0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

(42)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

TCS | 08 Semaphore | WS 2020/21 24/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(43)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert)

0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

(44)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert)

0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

TCS | 08 Semaphore | WS 2020/21 24/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(45)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert)

0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

(46)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert)

0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

TCS | 08 Semaphore | WS 2020/21 24/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(47)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert)

0 {3} Krit. Abschnitt wait(S) (blockiert) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

(48)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert) 0 {3} Krit. Abschnitt wait(S) (blockiert)

0 {2,3} Krit. Abschnitt (blockiert) (blockiert)

TCS | 08 Semaphore | WS 2020/21 24/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(49)

Weitere Eigenschaften

Bei maximal 2 Prozessen: Algorithmus ist Starvation-frei.

Bei mehr Prozessen:nicht Starvation-frei:

S.V S.M Prozess 1 Prozess 2 Prozess 3

1 rest. Code rest. Code rest. Code

1 wait(S) rest. Code rest. Code

0 Krit. Abschnitt wait(S) rest. Code

0 {2} Krit. Abschnitt (blockiert) wait(S) 0 {2,3} Krit. Abschnitt (blockiert) (blockiert) 0 {2,3} signal(S) (blockiert) (blockiert) 0 {3} rest. Code Krit. Abschnitt (blockiert) 0 {1,3} wait(S) Krit. Abschnitt (blockiert) 0 {1,3} (blockiert) signal(S) (blockiert) 0 {3} Krit. Abschnitt rest. Code (blockiert)

{3}

(50)

Weitere Arten von Semaphore

Bisherige Semaphore sindschwache Semaphore, da Auswahl des zu entblockierenden Prozesses beliebig.

Starke Semaphore: FIFO-Reihenfolge Queue / Liste S.Lstatt MengeS.M

procedure wait(S) if S.V >0 then

S.V := S.V 1;

else

S.L:= append(S.L, P);

P.state := blocked;

procedure signal(S) if isEmpty(S.L) then

S.V := S.V + 1;

else

Q:=head(S.L);

S.L:= tail(S.L);

Q.state := ready;

Mit starkem Semaphor: Algorithmus ist Starvation-frei & erf¨ullt FIFO-Eigenschaft

TCS | 08 Semaphore | WS 2020/21 25/76 Einleitung Prozessm.SemaphoreSem. Java Anwendungsbsp.

(51)

Weitere Arten von Semaphore (2)

Unfaire bzw. Busy-WaitSemaphore

gar keine Eigenschaft, wann ein Prozess entblockiert wird blockiert = busy-waiting

Keine S.M Komponente nurS.V procedure wait(S)

awaitS.V >0;

S.V := S.V 1;

procedure signal(S) S.V :=S.V + 1;

Algorithmus selbst bei 2 Prozessen nicht Starvation-frei.

(52)

Semaphore in Java

Im Package java.util.concurrentist die KlasseSemaphore definiert.

Konstruktor Semaphore(i) initialisiert den Semaphor mit Wert i Negatives ierlaubt

wait heißt acquire signalheißt release

Exceptions k¨onnen auftreten und m¨ussen abgefangen werden (bei acquire Interrupted Exception)

zweiter KonstruktorSemaphore(i,fair) i= initialer Wert

fair = Boolescher Wert. Wenn falsch, dann busy-wait Semaphor, sonst starker Semaphor

TCS | 08 Semaphore | WS 2020/21 27/76 Einleitung Prozessm. SemaphoreSem. JavaAnwendungsbsp.

(53)

Beispiel aus Ben-Ari Buch

import java.util.concurrent.Semaphore;

class CountSem extends Thread {

static volatile int n = 0; // globale atomare Variable static Semaphore s = new Semaphore(1);

public void run() { int temp;

for (int i = 0; i < 10; i++) { try {

s.acquire();

}

catch (InterruptedException e) {}

temp = n;

n = temp + 1;

s.release();

}

(54)

Beispiel aus Ben-Ari Buch (2)

...

public static void main(String[] args) { CountSem p = new CountSem();

CountSem q = new CountSem();

p.start(); // startet Thread p q.start(); // startet Thread q try {

p.join();// wartet auf Terminierung von Thread p q.join();// wartet auf Terminierung von Thread q }

catch (InterruptedException e) { }

System.out.println("The value of n is " + n);

} }

TCS | 08 Semaphore | WS 2020/21 29/76 Einleitung Prozessm. SemaphoreSem. JavaAnwendungsbsp.

(55)

Im Folgenden:

Anwendungsbeispiele und Probleml¨ osungen mit Semaphore

Koordination - Beispiel: Merge-Sort Erzeuger / Verbraucher: Infinite / bounded Buffer

Speisende Philosophen The Sleeping Barber Cigarette Smoker’s Problem

Reader & Writers

(56)

Fork-Join-Pattern zum Parallelisieren

Idee analog zu Divide-and-Conquer:

ose Teilprobleme mit Threads Warte auf Beenden der Threads Setze Gesamtl¨osung zusammen

? ? ?

? ?

X X

X X X

TCS | 08 Semaphore | WS 2020/21 31/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(57)

Mergesort: Koordination der Reihenfolge

Parallelisierung von Mergesort mit Fork-Join-Pattern:

Teile Eingabe in zwei H¨alften

Sortiere beide H¨alften (rekursiv) nebenl¨aufig (fork) Mische anschließend das Ergebnis (join)

Problem: Mische erstnachdemdie beiden H¨alften fertig sortiert sind.

(58)

Mergesort mit bin¨ aren Semaphore

Initial: left, right: Bin¨arer Semaphor mit 0 initialisiert merge-Prozess:

(1) wait(left);

(2) wait(right);

(3) merge Prozess f¨ur linke H¨alfte

(1) sortiere linke H¨alfte;

(2) signal(left);

Prozess f¨ur rechte H¨alfte (1) sortiere rechte H¨alfte;

(2) signal(right);

Achtung: 2 Semaphore pro Rekursionsschritt!

TCS | 08 Semaphore | WS 2020/21 33/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(59)

Anmerkung

Probleme:

Naive Parallelisierung f¨uhrt zu Slow-Down Zuviele Threads f¨ur wenige Prozessorkerne osungen:

Wenige Threads erzeugen Anzahl absch¨atzen bzw. testen Noch besser: Thread-Pool verwenden

(Anzahl der Threads begrenzen, aber Threads k¨onnen mehrere Aufgaben hintereinander bearbeiten)

(60)

Erzeuger / Verbraucher

Problem:

Erzeuger produzieren Daten Verbraucher konsumieren Daten

Beispiel: Tastatur / Betriebssystem usw.

Austausch ¨uber Puffer:

Queue / Liste

Erzeuger schreibt hinten auf die Liste Verbraucher konsumiert vorne von der Liste Zwei Varianten:

beliebig lange Liste (infinite buffer) begrenzter Platz (bounded buffer)

TCS | 08 Semaphore | WS 2020/21 35/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(61)

Erzeuger / Verbraucher mit infinite Buffer

Anforderungen:

Lesen / Schreiben auf den Pufferkorrekt(atomar)

Verbraucher braucht Schutz f¨ur den Fall, dass der Puffer leer ist

(62)

Erzeuger / Verbraucher mit infinite Buffer (2)

Initial: notEmpty: Genereller Semaphor, initialisiert mit 0 mutex: Bin¨arer Semaphor, initialisiert mit 1 l: Liste

Erzeuger (erzeugt e) (1) erzeuge e;

(2) wait(mutex);

(3) l := append(l,e);

(4) signal(notEmpty);

(5) signal(mutex);

Verbraucher (verbraucht e) (1) wait(notEmpty);

(2) wait(mutex);

(3) e := head(l);

(4) l := tail(l);

(5) signal(mutex);

(6) verbrauche e;

Liste am Anfang leer = Invariante: notEmpty.V = length(l)

TCS | 08 Semaphore | WS 2020/21 37/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(63)

Infinite Buffer mit Semaphore in Java

import java.util.concurrent.Semaphore;

import java.util.LinkedList;

class InfBuffer<V> {

Semaphore notEmpty = new Semaphore(0);

Semaphore mutex = new Semaphore(1);

LinkedList<V> buffer = new LinkedList<V>();

public void produce(V elem) {

try {mutex.acquire();} catch (InterruptedException e) {};

buffer.add(elem);

notEmpty.release();

mutex.release();

}

public V consume() {

try {notEmpty.acquire();} catch (InterruptedException e) {};

try {mutex.acquire();} catch (InterruptedException e) {};

V e = buffer.removeFirst();

mutex.release();

(64)

Infinite Buffer mit Semaphore in Java (2)

class Producer extends Thread {

static Random generator = new Random();

InfBuffer<Integer> buff;

Integer number;

Producer(InfBuffer<Integer> b, Integer i) { buff = b;

number = i;

}

public void run() {

for (int i = 1; i <= 10; i++) {

try {(Thread.currentThread()).sleep(Math.abs(generator.nextInt()%1000));}

catch (InterruptedException e) { };

buff.produce(i);

PrintSem.print("Producer " + number + ": " + i + " produziert");

} } }

TCS | 08 Semaphore | WS 2020/21 39/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(65)

Infinite Buffer mit Semaphore in Java (3)

class Consumer extends Thread {

static Random generator = new Random();

InfBuffer<Integer> buff;

Integer number;

Consumer(InfBuffer<Integer> b,Integer i) { buff = b;

number = i;

}

public void run() {

for (int i = 1; i <= 50; i++) {

try {Thread.currentThread().sleep(Math.abs(generator.nextInt()%1000));}

catch (InterruptedException e) { };

Integer e = buff.consume();

PrintSem.print("Consumer " + number + ": " + e + " konsumiert");

} }

(66)

Infinite Buffer mit Semaphore in Java (4)

final class PrintSem {

static Semaphore mutex = new Semaphore(1);

static void print(String str) {

try {mutex.acquire();} catch (InterruptedException e) {};

System.out.println(str);

mutex.release();

} }

class Main {

public static void main(String[] args) {

InfBuffer<Integer> b = new InfBuffer<Integer>();

for (int i=1; i <= 50; i++) { Producer q = new Producer(b,i);

q.start();

}

for (int i=1; i <= 10; i++) { Consumer q = new Consumer(b,i);

q.start();

}

while (true) {} // Endlosschleife }

}

TCS | 08 Semaphore | WS 2020/21 41/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(67)

Erzeuger / Verbraucher mit bounded Buffer

Anforderungen:

Lesen / Schreiben auf den Puffersicher (atomar)

Verbraucher braucht Schutz f¨ur den Fall, dass der Puffer leer ist Erzeuger braucht Schutz f¨ur den Fall, dass der Puffer voll ist

(68)

Erzeuger / Verbraucher mit bounded Buffer (2)

Initial: notEmpty: Genereller Semaphor, initialisiert mit 0 notFull: Genereller Semaphor, initialisiert mitN mutex: Bin¨arer Semaphor, initialisiert mit 1 l: Liste

Erzeuger (erzeugt e) (1) erzeuge e;

(2) wait(notFull);

(3) wait(mutex);

(4) l := append(l,e);

(5) signal(notEmpty);

(6) signal(mutex);

Verbraucher (verbraucht e) (1) wait(notEmpty);

(2) wait(mutex);

(3) e := head(l);

(4) l := tail(l);

(5) signal(notFull);

(6) signal(mutex);

(7) verbrauche e;

Invariante: notEmpty.V + notFull.V =N

(notEmpty,notFull) = Split-Semaphor“

TCS | 08 Semaphore | WS 2020/21 43/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(69)

Speisende Philosophen

(70)

Speisende Philosophen (2)

Situation

Philosoph denkt oder isst Spaghetti, abwechselnd Philosoph braucht beide Gabeln zum Essen Philosoph nimmt Gabelnnacheinander

Anforderungen:

Kein Deadlock: Irgendein Philosoph kann nach endlicher Zeit immer essen Kein Verhungern: Jeder Philosoph isst nach endlicher Zeit

Modellierung:

Philosophen durchnummeriert i∈ {1, . . . , N} Gabel = Bin¨arer Semaphor

linke Gabel: gabel[i], rechte Gabel: gabel[i+1] (modulo N)

TCS | 08 Semaphore | WS 2020/21 45/76 Einleitung Prozessm. Semaphore Sem. JavaAnwendungsbsp.

(71)

Speisende Philosophen (2)

Situation

Philosoph denkt oder isst Spaghetti, abwechselnd Philosoph braucht beide Gabeln zum Essen Philosoph nimmt Gabelnnacheinander Anforderungen:

Kein Deadlock: Irgendein Philosoph kann nach endlicher Zeit immer essen Kein Verhungern: Jeder Philosoph isst nach endlicher Zeit

Modellierung:

Philosophen durchnummeriert i∈ {1, . . . , N} Gabel = Bin¨arer Semaphor

linke Gabel: gabel[i], rechte Gabel: gabel[i+1] (modulo N)

Referenzen

ÄHNLICHE DOKUMENTE

signalC(cond) kann effektlos sein: Entwe- der Prozess in cond wird entblockiert, oder effektlos, wenn cond leer ist. TCS | 09 Monitore | WS 2020/21 17/53 Monitore

Sei P der aufrufende Prozess, cond eine Condition Variable im Monitor monitor Erinnerung: cond ist eine FIFO-Queue (Liste). Sei lock der implizite Lock des Monitors (Lock

Ein Kanal verbindet einen sendenden Prozess mit einem empfangenden Prozess Oft erlaubt: ein Kanal verbindet mehrere sendende und empfangende Prozesse Kan¨ ale sind typisiert:

Ein Kanal verbindet einen sendenden Prozess mit einem empfangenden Prozess Oft erlaubt: ein Kanal verbindet mehrere sendende und empfangende Prozesse Kan¨ ale sind typisiert:

Im Tuple Space muss ein “Matching Tuple“ vorhanden sein Matching Tuple = gleiche L¨ ange, gleiche Typen, gleiche Werte Falls kein passendes Tuple vorhanden:.. Prozess blockiert, bis

TCS | 11 Tuple-Spaces | WS 2020/21 2/44 Einleitung Tuple Space pSpaces und goSpace Beispiele.. Tuple Spaces: Das

2 Halten und Warten (Hold and Wait): Ein Prozess kann eine Ressource anfordern (auf eine Ressource warten), w¨ ahrend er eine andere Ressource bereits belegt hat.. 3

Sind alle gemeinsamen Ressourcen durch eine totale Ordnung geordnet und jeder Prozess belegt seine ben¨ otigten Ressourcen in aufsteigender Reihenfolge bez¨ uglich der totalen