Wikipedia · einfach zusammengefasst · Stand
Monitor (Informatik)
Erzeuger/Verbraucher-Problem), in denen ein Prozess während der Ausführung einer Monitor-Operation feststellt, dass die Datenstruktur sich in einem Zustand …
Inhalt5 Abschnitte
Grundidee des Monitors
Ein Monitor ist ein programmiersprachliches Konzept, das Zugriffe parallel oder zeitlich verschränkt laufender Prozesse oder Threads auf gemeinsame Datenstrukturen oder Ressourcen synchronisiert. Er verhindert inkonsistente Zustände, indem er wechselseitigen Ausschluss sicherstellt: Während ein Prozess eine kritische Monitor-Operation ausführt, kann kein anderer Prozess gleichzeitig eine solche Operation desselben Monitors ausführen.
Ein Monitor ist ein Modul, also ein abstrakter Datentyp oder eine Klasse. Er fasst gemeinsam genutzte Daten und ihre Zugriffsprozeduren bzw. Methoden zusammen. Methoden mit kritischen Abschnitten werden als Monitor-Operationen gekennzeichnet; weitere Methoden ohne kritische Abschnitte können ebenfalls angeboten werden. Ruft Prozess A eine Monitor-Operation auf, obwohl Prozess B bereits eine Monitor-Operation ausführt, wird A blockiert. Compiler bzw. Laufzeitsystem fügen dafür die nötigen Synchronisationsprimitive ein. Programmierende müssen Semaphore daher nicht ausdrücklich einsetzen.
Anschaulich ist ein Monitor ein Raum mit Platz für nur einen Akteur: Weitere Prozesse müssen außerhalb warten, bis der Raum frei wird. Das Konzept wurde 1974 von C.A.R. Hoare und 1975 von Per Brinch Hansen als Synchronisationsmittel auf höherem Abstraktionsniveau entwickelt.
Warten auf Bedingungen
Wechselseitiger Ausschluss allein genügt nicht für Kooperationssituationen, etwa beim Erzeuger/Verbraucher-Problem. Ein Prozess kann innerhalb einer Monitor-Operation feststellen, dass ein bestimmter Zustand der Daten noch nicht erreicht ist. Ohne zusätzliche Mechanismen müsste er den Monitor verlassen und die Operation später erneut aufrufen; das führt zu unerwünschtem wiederholtem Prüfen und Warten.
Dafür dienen Bedingungsvariablen (condition variables). Sie stehen für Bedingungen, die erfüllt oder nicht erfüllt sein können, und bieten zwei Operationen:
wait(): Der aufrufende Prozess wird blockiert und in die Warteschlange dieser Bedingungsvariablen eingereiht. Er verlässt dabei den Monitor, sodass ein anderer Prozess eintreten und eine Monitor-Operation ausführen kann.signal(): Ein wartender Prozess derselben Bedingungsvariablen wird deblockiert. Wartet dort niemand, bleibt der Aufruf ohne Wirkung.
Ein Monitor mit Bedingungssynchronisation enthält typischerweise eine implizite Lock-Variable, eine Monitor-Warteschlange sowie beliebig viele Bedingungsvariablen. Jede Bedingungsvariable besitzt ihre eigene Warteschlange.
Hoare- und Mesa-Monitore
Wenn signal() einen wartenden Prozess weckt, kann dieser nicht sofort an der Stelle seines wait() fortfahren, solange der signalisierende Prozess noch im Monitor ist. Dafür gibt es zwei Regelungen.
Beim Hoare-Typ wird beim signal() geprüft, ob an der Bedingungsvariablen Prozesse warten. Ist die Warteschlange nicht leer, wird der signalisierende Prozess blockiert und in die Monitor-Warteschlange eingetragen. Ein wartender Prozess wird deblockiert und setzt seine Ausführung fort. Der signalisierende Prozess läuft in der Regel erst weiter, nachdem der deblockierte Prozess den Monitor verlassen hat. Hoare-Monitore heißen deshalb auch Signal and Wait.
Beim Mesa-Typ, der Ende der 1970er Jahre von einer Gruppe bei Xerox entwickelt wurde, blockiert signal() den signalisierenden Prozess nicht. Dieser führt seine Arbeit immer fort. Stattdessen wird ein Prozess aus der Warteschlange der Bedingungsvariablen in die Monitor-Warteschlange umgereiht. Mesa-Monitore heißen auch Signal-and-Continue-Monitore.
Monitore in Java
In Java hat grundsätzlich jedes Objekt Monitorfähigkeiten. Methoden, die kritische Abschnitte auf Objektattributen enthalten, werden mit synchronized gekennzeichnet. Mehrere Threads, die synchronized-Methoden desselben Objekts aufrufen, werden unter wechselseitigem Ausschluss ausgeführt: Zu jedem Zeitpunkt greift höchstens ein Thread innerhalb einer solchen Methode auf die Objektattribute zu.
Java verwendet keine Bedingungsvariablen. Stattdessen stellt die Klasse Object diese Methoden bereit:
wait(): Blockiert den aufrufenden Thread und gibt den Monitor, also das Objekt der gerade ausgeführtensynchronized-Methode, frei.notify(): Entblockiert irgendeinen an diesem Monitor wartenden Thread. Er kann fortfahren, sobald der Monitor frei ist; die Auswahl ist nicht fair im Sinne von Fairness.notifyAll(): Entblockiert alle an diesem Monitor wartenden Threads. Sie können fortfahren, sobald der Monitor frei ist.
Nach dem Entblockieren muss ein Thread die erwartete Bedingung erneut prüfen. Sie könnte weiterhin ungültig sein oder inzwischen durch schnellere Threads wieder ungültig geworden sein.
Einordnung
Ein Mutex ist ein Oberbegriff für Verfahren, die wechselseitigen Ausschluss bei Datenzugriffen ermöglichen. Ein Semaphor ist ein Verfahren zur Prozesssynchronisation mittels Betriebssystemdiensten. Monitore bauen auf derselben Aufgabe auf, kapseln die Synchronisation jedoch zusammen mit Daten und Zugriffsoperationen.
Lernvideos zu Monitor (Informatik)
3:49
Synchronisation mit Monitoren 1 (Version B)
Thomas Rau · 918 Aufrufe
25:36
L-3.4: Critical Section Problem | Mutual Exclusion, Progress and Bounded Waiting | Operating System
Gate Smashers · 1,7 Mio. Aufrufe
12:13
C-Programmierung – Producer-Consumer
Josef Hammer · 1.115 Aufrufe
1:18
Mutex Lock
Udacity · 115.698 Aufrufe