Semaphore void Passieren (semaphore &s) { if (s > 0) { s--; } else { WaitOn (s); } void Verlassen (semaphore &s) { if (ProcessAreWaitingOn (s)) { Signal (s); s++; Semaphore
Was sind Semaphore? Semaphore sind geschützte Variablen. binäre Semaphore/zählende Semaphore Semaphore können nur über die Funktionen P(s) und V(s) verändert werden. P(s) und V(s) sind nicht unterbrechbar (uninterruptible). Verwendung von Semaphoren gegenseitiger Ausschluss von Prozessen Synchronisation von Prozessen
Wie arbeiten Semaphore? void Passieren (semaphore &s) { if (s > 0) { s--; } else { WaitOn (s);} } void Verlassen (semaphore &s) { if (ProcessAreWaitingOn (s)) { Signal (s); } else { s++;}
gegenseitiger Ausschluss zwei Prozesse sollen nicht gleichzeitig im kritischen Bereich sein. semaphore aktiv= 1; void prozess_1() { for (;;) { P(aktiv); kritischer Bereich_1(); V(aktiv); macheWasAnderes(); } } void prozess_2() { for (;;) { P(aktiv); kritischer Bereich_2(); V(aktiv); macheWasAnderes(); } }
Prozess-Synchronisation notwendig z.B. wenn ein Prozess von anderem Prozess abhängig ist semaphore ereignis=0; void prozess_1() { vorher_1(); P(ereignis); nachher_1(); } void prozess_2() { vorher_2(); V(ereignis); nachher_2(); }
Erzeuger-Verbraucher Problem semaphore geleert=1; semaphore gefuellt = 0; int puffer; void erzeuger () { int ergebnis; for (;;) { berechne (ergebnis) P(geleert); puffer = ergebnis; V(gefuellt); } } void verbraucher () { int wert; for (;;) { P(gefuellt) V(geleert); wert = puffer; verarbeite (wert); } }
Monitore Ein Monitor enthält Daten und Methoden/Prozeduren. Nur eine Zugangsmethode kann zur gleichen Zeit aktiv sein. Der Monitor ist besetzt, sobald eine Zugangsmethode ausgeführt wird, Prozesse müssen warten. Pascal, Modula, Java unterstützen Monitor-Konzept.
Literatur www.pst.informatik.uni-muenchen.de/personen/ kroeger/Info-NF-2-Skript.pdf Stefan Middendorf, Reiner Singer: Java, dpunkt.verlag, 1999 Holger Jakobs: Betriebssysteme - Theorie, Skript b.i.b.