Dieses Konzept stellt sicher, dass sich immer nur ein Prozess innerhalb eines
Monitors befindet. Für die Programmierung ist das aber nicht ausreichend. Es
sollte zusätzlich durch Befehle möglich sein, Prozesse zu blockieren und wieder
aufzuwecken. Dazu führt man einen neuen Typ von Variablen ein:
condition. Es gibt zwei Operationen wait und signal,
die auf Variablen vom Typ condition anwendbar sind. Die Operation
wait blockiert einen Prozess bezüglich einer
condition-Variablen. signal weckt einen beliebigen Prozess
bezüglich einer condition-Variablen wieder auf. Nehmen wir nun an ein
Prozess
weckt einen Prozess
auf. In dieser Situation gibt es mehrere
Möglichkeiten, die eintreten können:
In der Praxis gibt es verschiedene Implementierungen. Wir werden später eine
Implementierung für Fall 1 angeben.
In der existierenden
Programmiersprache Concurrent Pascal sind Monitore aber beispielsweise
so realisiert,
dass
sofort den Monitor verlässt, wenn
aufgeweckt wurde. Das bedeutet allerdings,
dass jeder Prozess innerhalb eines Monitors nur ein signal senden kann.
Betrachten wir nun einen Lösungsansatz für das Erzeuger-Verbraucher-Problem
mit einem Monitor (Abbildung
).
Abschließend geben wir noch eine mögliche Übersetzung von Monitoren an. Für jeden Monitor
führen wir einen Semaphor mutex ein (initialisiert mit 1). Beim
Eintreten in dem Monitor muss downmutex ausgeführt werden. Zusätzlich
wird noch ein Semaphor next und eine Integer-Variable
next-count eingeführt, welche die Prozesse
zählt, die auf den Eintritt in den Monitor warten. Jede Prozedur
eines
Monitors wird dann übersetzt nach:
Für jede condition-Variable x wird ein Semaphor x-sem und
eine Integer-Variable x-count eingeführt (beide mit 0
initialisiert). Die Operation wait(x) wird dann wie folgt implementiert:
Bleibt noch die Übersetzung der Operation signal(x):