4 auf 1 - Betriebssysteme und verteilte Systeme
4 auf 1 - Betriebssysteme und verteilte Systeme
4 auf 1 - Betriebssysteme und verteilte Systeme
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
3.1.5 Klassische Synchronisationsprobleme ...<br />
Das Problem des schlafenden Friseurs<br />
➥ Friseursalon:<br />
3.1.5 Klassische Synchronisationsprobleme ...<br />
Lösung für das Problem des schlafenden Friseurs<br />
int waiting = 0;<br />
Semaphor mutex = 1;<br />
Semaphor customers = 0;<br />
Semaphor barbers = 0;<br />
K<strong>und</strong>e<br />
➥ ein Friseur, ein Friseurstuhl, N Stühle zum Warten<br />
➥ Falls kein K<strong>und</strong>e zu bedienen: Friseur schläft<br />
➥ K<strong>und</strong>e muß Friseur ggf. wecken<br />
➥ Falls Friseur schon einen K<strong>und</strong>en bedient:<br />
➥ weitere K<strong>und</strong>en setzen sich, falls Stuhl frei<br />
➥ falls kein Stuhl frei: Laden verlassen<br />
➥ Gesucht: Synchronisation ohne Race Conditions<br />
c○2004, Roland Wismüller 05-18<br />
Gemeinsame Variable <strong>und</strong> Semaphore<br />
P(mutex)<br />
if (waiting < N) {<br />
waiting++;<br />
V(customers);<br />
V(mutex);<br />
P(barbers);<br />
getHaircut();<br />
} else {<br />
V(mutex);<br />
}<br />
Anzahl wartender K<strong>und</strong>en<br />
für wechselseitigen Ausschluß<br />
Anzahl wartender K<strong>und</strong>en<br />
Anzahl wartender Friseure<br />
Friseur<br />
while (true) {<br />
P(customers);<br />
P(mutex);<br />
waiting−−;<br />
V(barbers);<br />
V(mutex);<br />
cutHair();<br />
}<br />
c○2004, Roland Wismüller 05-22<br />
3.1.6 Monitore<br />
Motivation<br />
➥ Programmierung mit Semaphoren ist schwierig<br />
➥ Reihenfolge der P/V-Operationen: Verklemmungsgefahr<br />
➥ Synchronisation über gesamtes Programm verteilt<br />
Monitor (Hoare, 1974; Brinch Hansen 1975)<br />
➥ Modul mit Daten, Prozeduren <strong>und</strong> Initialisierungscode<br />
➥ Zugriff <strong>auf</strong> die Daten nur über Monitor-Prozeduren<br />
➥ (entspricht in etwa einer Klasse)<br />
➥ Alle Prozeduren stehen unter wechselseitigem Ausschluß<br />
➥ nur jeweils ein Prozeß kann Monitor benutzen<br />
➥ Programmiersprachkonstrukt: Realisierung durch Übersetzer<br />
c○2004, Roland Wismüller 05-23<br />
3.1.6 Monitore ...<br />
Bedingungsvariable (Zustandsvariable, condition variables)<br />
➥ Zur weiteren Synchronisation zwischen Monitor-Prozeduren<br />
➥ für anwendungsspezifische Bedingungen<br />
➥ z.B. voller Puffer im Erzeuger/Verbraucher-Problem<br />
➥ Bedingungsvariable verwaltet Warteschlange blockierter<br />
Prozesse<br />
➥ Zwei Operationen:<br />
➥ wait(): Blockieren des <strong>auf</strong>rufenden Prozesses<br />
➥ signal(): Aufwecken blockierter Prozesse<br />
➥ Bedingungsvariable hat ” kein Gedächtnis“:<br />
➥ signal() weckt nur einen Prozeß, der wait() bereits<br />
<strong>auf</strong>gerufen hat<br />
c○2004, Roland Wismüller 05-24