10.10.2013 Aufrufe

4 auf 1 - Betriebssysteme und verteilte Systeme

4 auf 1 - Betriebssysteme und verteilte Systeme

4 auf 1 - Betriebssysteme und verteilte Systeme

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!