Zum Inhalt springen
L

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
  1. 1. Grundidee des Monitors
  2. 2. Warten auf Bedingungen
  3. 3. Hoare- und Mesa-Monitore
  4. 4. Monitore in Java
  5. 5. Einordnung

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ührten synchronized-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)

Weiterlesen

Informatik Als einfache Rechengeräte leisteten Abakus und später der Rechenschieber unschätzbare Dienste. 1641 konstruierte Blaise Pascal eine mechanische … Nebenläufigkeit Die Nebenläufigkeit, mitunter auch Parallelität (englisch concurrency) genannt, ist in der Informatik die Eigenschaft eines Systems, mehrere Aufgaben, … Thread (Informatik) Kritischer Abschnitt · Nebenläufigkeit · Parallele Programmierung · Prozess · Threadsicherheit. Literatur. Bearbeiten. Peter Ziesche: Nebenläufige & verteilte … Semaphor (Informatik) Semaphor (Informatik) Methode. Erzeuger und Verbraucher, sowie zur Koordination asynchroner Abläufe. Ein Semaphor ist eine Datenstruktur mit einer … Mutex Ein kritischer Abschnitt (engl. critical section oder critical region) ist derjenige Teil im ausführbaren Code, in dem ein wegen des Mutex ungestörter … Datenstruktur In der Informatik und Softwaretechnik ist eine Datenstruktur ein Objekt, welches zur Speicherung und Organisation von Daten dient. Es handelt sich um eine … Compiler Ein Übersetzer zur Übertragung von Assembler-Quellprogrammen in Maschinensprache wird als Assembler oder Assemblierer bezeichnet. Geschichte. Bearbeiten. Java (Programmiersprache) Java ist eine objektorientierte Programmiersprache und eine eingetragene Marke des Unternehmens Sun Microsystems, welches 2010 von Oracle übernommen wurde. Tony Hoare Hoare erlangte hohes Ansehen durch die Entwicklung des Quicksort-Algorithmus sowie des Hoare-Kalküls, durch den sich die Korrektheit von Algorithmen beweisen … Abstrakter Datentyp Ein Abstrakter Datentyp (ADT) ist ein Verbund von Daten zusammen mit der Definition aller zulässigen Operationen, die auf sie zugreifen. Kritischer Abschnitt Kritische Abschnitte bestehen aus mehreren Einzelanweisungen, deren Zwischenergebnisse inkonsistente Zustände darstellen, auf die die anderen Threads keinen … Erzeuger-Verbraucher-Problem Das Erzeuger-Verbraucher-Problem (englisch producer–consumer problem, PCP) ist eine klassische, abstrakt formulierte Problemstellung der Prozesssynchronisation.