<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Monitor_%28Informatik%29</id>
	<title>Monitor (Informatik) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Monitor_%28Informatik%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Monitor_(Informatik)&amp;action=history"/>
	<updated>2026-05-28T05:21:29Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Monitor_(Informatik)&amp;diff=60132&amp;oldid=prev</id>
		<title>imported&gt;ChipsEssen: /* growthexperiments-addlink-summary-summary:2|0|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Monitor_(Informatik)&amp;diff=60132&amp;oldid=prev"/>
		<updated>2025-02-21T13:18:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:2|0|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Dieser Artikel|beschäftigt sich mit dem Konstrukt &amp;#039;&amp;#039;Monitor&amp;#039;&amp;#039; als Mittel der Prozesssynchronisation. Für die Bedeutung als Computerprogramm siehe [[Maschinencode-Monitor]].}}&lt;br /&gt;
&lt;br /&gt;
{{Belege fehlen|Siehe [[Diskussion:Monitor (Informatik)#Einzelnachweise|Diskussion]] --[[Benutzer:MartinThoma|Martin Thoma]] 15:09, 3. Mär. 2013 (CET)}}&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Monitor&amp;#039;&amp;#039;&amp;#039; in der [[Informatik]] ist ein programmiersprachliches Konzept zur Synchronisation von Zugriffen zeitlich verschränkt oder [[Nebenläufigkeit|parallel laufender Prozesse]] oder [[Thread (Informatik)|Threads]] auf gemeinsam genutzten Datenstrukturen oder Ressourcen. Inkonsistente Zustände der Datenstrukturen werden vermieden, ohne dass Programmierer&lt;br /&gt;
Synchronisationsprimitive wie z.&amp;amp;nbsp;B. [[Semaphor (Informatik)|Semaphore]] explizit nutzen müssen. Ein [[Mutex|wechselseitiger Ausschluss]] bei Zugriffen auf die gemeinsam genutzte [[Datenstruktur]] wird erreicht, indem ein [[Compiler]] bei der Übersetzung eines Programmteils, das vom Programmierer mit Elementen der Programmiersprache als Monitor gekennzeichnet wurde, entsprechende Synchronisationsprimitive einfügt. Das Konzept wird z.&amp;amp;nbsp;B. von den Programmiersprachen [[Ada (Programmiersprache)|Ada]], [[Modula-2|Modula]], Concurrent Pascal oder [[Java (Programmiersprache)|Java]] realisiert.&lt;br /&gt;
&lt;br /&gt;
== Das Monitorkonzept ==&lt;br /&gt;
Bei parallelem oder zeitlich verzahntem Ablauf von Prozessen (oder Threads) treten Situationen auf, in denen Datenstrukturen oder Ressourcen, die von den Prozessen gemeinsam genutzt werden, in inkonsistente Zustände geraten können, wenn nicht ein [[Mutex|wechselseitiger Ausschluss]] vorgenommen wird. Synchronisationsprimitive wie [[Semaphor (Informatik)|Semaphore]] werden eingesetzt, die ausschließen, dass mehrere Prozesse gleichzeitig oder irgendwie zeitlich verzahnt die gemeinsam genutzten Datenstrukturen verändern. Korrekte Anwendung durch Programmierer vorausgesetzt, garantieren diese Primitive, dass innerhalb eines Zeitraums nur ein Prozess verändernd auf die Datenstruktur zugreift. Da die korrekte Anwendung aber durch Eigenschaften der Synchronisationsprimitive erschwert wird, entwickelten 1974 [[Tony Hoare|C.A.R. Hoare]] und 1975 [[Per Brinch Hansen]] ein auf höherem Abstraktionsniveau angesiedeltes Synchronisationsmittel, den Monitor.&lt;br /&gt;
&lt;br /&gt;
Ein Monitor ist ein Modul (ein [[abstrakter Datentyp]], eine [[Klasse (objektorientierte Programmierung)|Klasse]]), in dem die von Prozessen gemeinsam genutzten Daten und ihre Zugriffsprozeduren (oder Methoden) zu einer Einheit zusammengeführt sind. Zugriffsprozeduren mit [[Kritischer Abschnitt|kritischen Abschnitten]] auf den Daten werden als Monitor-Operationen speziell gekennzeichnet. Zugriffsprozeduren ohne kritische Abschnitte können vom Modul zusätzlich angeboten werden.&lt;br /&gt;
&lt;br /&gt;
Die Monitor-Operationen werden unter wechselseitigem Ausschluss ausgeführt, ohne dass im Programmcode Synchronisationsanweisungen notiert werden müssen. Ein Programmierer kann sich somit auf die Funktionalität des Moduls konzentrieren und das Synchronisationsproblem außer Acht lassen. Bei Benutzung sorgt ein Monitor selbständig dafür, dass seine Monitor-Operationen immer nur von einem Prozess ausgeführt werden. Sollte ein Prozess A eine Monitor-Operation aufrufen, während diese oder eine andere Monitor-Operation bereits von einem Prozess B ausgeführt wird, so wird der Prozess A blockiert. Wechselseitiger Ausschluss, Blockieren und Deblockieren eines Prozesses werden mittels Synchronisationsprimitive erreicht, die bei Übersetzung des Monitors eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
Ein Monitor wird oft als ein Raum angesehen, in dem nur ein Akteur (Prozess) Platz findet. Wollen weitere Akteure in den Monitorraum, so müssen sie warten, bis im Monitorraum Platz frei geworden ist.&lt;br /&gt;
&lt;br /&gt;
== Bedingungssynchronisation ==&lt;br /&gt;
Kooperationssituationen (s. z.&amp;amp;nbsp;B. [[Erzeuger-Verbraucher-Problem|Erzeuger/Verbraucher-Problem]]), in denen ein Prozess während der Ausführung einer Monitor-Operation feststellt, dass die Datenstruktur sich in einem Zustand befindet, der eine weitere Ausführung nicht sinnvoll erscheinen lässt, können mit dem Monitor der beschriebenen Form nicht behandelt werden. Ohne weitere Synchronisationsmechanismen müsste der Prozess die Monitor-Operation beenden und den Monitor verlassen. Er muss dann später noch einmal die Operation aufrufen,&lt;br /&gt;
um zu prüfen, ob der Zustand diesmal der erwartete ist. Dies läuft auf ein unerwünschtes mehrfaches Prüfen und Warten hinaus.&lt;br /&gt;
&lt;br /&gt;
Monitore bieten daher eine Möglichkeit der Synchronisation von Aktivitäten innerhalb des Monitors.&lt;br /&gt;
Beim Entwurf des Monitors und seiner Operationen werden Bedingungen definiert, die erfüllt sind oder nicht. Bedingungen werden mittels &amp;#039;&amp;#039;Bedingungsvariablen&amp;#039;&amp;#039; (condition variables) repräsentiert. Auf Bedingungsvariablen sind zwei Operationen definiert: &amp;#039;&amp;#039;wait()&amp;#039;&amp;#039; und &amp;#039;&amp;#039;signal()&amp;#039;&amp;#039;.&lt;br /&gt;
Wenn ein Prozess während der Ausführung einer Monitor-Operation für eine Bedingungsvariable &amp;#039;&amp;#039;b&amp;#039;&amp;#039; die Operation &amp;#039;&amp;#039;wait()&amp;#039;&amp;#039; aufruft, wird der Prozess blockiert und außerhalb des Monitors in eine Warteschlange zu dieser Bedingungsvariable eingefügt. Da nun kein Prozess mehr im Monitor aktiv ist, kann ein anderer Prozess den Monitor von außen betreten und eine Monitor-Operation ausführen. Der blockierte Prozess wird deblockiert, wenn ein anderer Prozess während seiner Ausführung einer Monitor-Operation die Operation &amp;#039;&amp;#039;signal()&amp;#039;&amp;#039; an der Bedingungsvariablen &amp;#039;&amp;#039;b&amp;#039;&amp;#039; aufruft. Wenn zum Zeitpunkt des Aufrufs von &amp;#039;&amp;#039;signal()&amp;#039;&amp;#039; kein Prozess an der Bedingungsvariablen &amp;#039;&amp;#039;b&amp;#039;&amp;#039; wartet, ist der Aufruf ohne Auswirkung.&lt;br /&gt;
&lt;br /&gt;
Ein Monitor, der über die Fähigkeit zur Bedingungssynchronisation verfügt, besteht aus einer geschlossenen Einheit von Daten und Prozeduren. Er besitzt oftmals eine implizite Lock-Variable und eine Warteschlange (die Monitor-Warteschlange) sowie eine beliebige Anzahl von Bedingungsvariablen. Jeder Bedingungsvariable ist eine weitere Warteschlange zugeordnet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Monitor Informatik.png|zentriert|Monitor mit Prozeduren, Warteschlangen und Bedingungsvariablen]]&lt;br /&gt;
{{center|1=&amp;#039;&amp;#039;&amp;#039;Aufbau eines Monitors mit Bedingungssynchronisation&amp;#039;&amp;#039;&amp;#039;}}&lt;br /&gt;
&lt;br /&gt;
Wird mittels &amp;#039;&amp;#039;signal&amp;#039;&amp;#039; an einer Bedingungsvariablen ein Prozess aus der Warteschlange zur Bedingungsvariablen deblockiert, so könnte dieser die Ausführung der Monitor-Operation an der Stelle, an der er das &amp;#039;&amp;#039;wait&amp;#039;&amp;#039; abgesetzt hat, fortsetzen, wenn sich nicht noch der signalisierende Prozess im Monitor befinden würde. Zwei Formen der Behandlung dieser Situation wurden entwickelt.&lt;br /&gt;
&lt;br /&gt;
=== Hoare-Typ ===&lt;br /&gt;
Beim &amp;#039;&amp;#039;signal&amp;#039;&amp;#039;-Aufruf wird geprüft, ob die Warteschlange der Bedingungsvariablen Prozesse enthält. Falls diese nicht leer ist, wird der signalisierende Prozess blockiert und in die Monitor-Warteschlange eingetragen. Ein Prozess aus der Warteschlange der Bedingungsvariablen wird deblockiert. Der signalisierende Prozess wird demnach i.&amp;amp;nbsp;d.&amp;amp;nbsp;R. fortgesetzt, nachdem der deblockierte Prozess den Monitor verlassen hat. Hoare-Monitore werden auch &amp;#039;&amp;#039;Signal and Wait&amp;#039;&amp;#039; genannt.&lt;br /&gt;
&lt;br /&gt;
=== Mesa-Typ ===&lt;br /&gt;
Neben dem Hoare-Typ gibt es noch den Mesa-Monitor-Typ, der Ende der [[1970]]er Jahre von einer Gruppe bei [[Xerox]] entwickelt wurde. Im Gegensatz zum Hoare-Typ blockiert &amp;#039;&amp;#039;signal&amp;#039;&amp;#039; den signalisierenden Prozess nicht. Dieser wird stets fortgesetzt. &amp;#039;&amp;#039;signal&amp;#039;&amp;#039; reiht stattdessen einen Prozess von der Warteschlange der Bedingungsvariablen in die Monitor-Warteschlange um. Mesa-Typ-Monitore werden auch &amp;#039;&amp;#039;Signal-and-Continue&amp;#039;&amp;#039;-Monitore (etwa: signalisieren und fortfahren) genannt.&lt;br /&gt;
&lt;br /&gt;
== Monitore in Java ==&lt;br /&gt;
In Java verfügt jedes Objekt prinzipiell über Monitorfähigkeiten. Methoden einer Klasse, die kritische Abschnitte auf Attributen implementieren, sind mittels des Schlüsselworts &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; als Monitor-Operationen zu kennzeichnen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Something {&lt;br /&gt;
    private SomeType sharedData;&lt;br /&gt;
    &lt;br /&gt;
    public synchronized void fct1 (...) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void fct2 (...) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt der Klasse agiert dann als Monitor für seine Attribute. Aufrufe von &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt;-Methoden von mehreren Threads am selben Objekt werden unter wechselseitigem Ausschluss ausgeführt: zu jedem Zeitpunkt greift höchstens ein Thread im Rahmen einer &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt;-Methode auf die Objektattribute zu.&lt;br /&gt;
&lt;br /&gt;
Die Sprache Java sieht keine Bedingungsvariablen vor. Für die Bedingungssynchronisation sind in der Klasse &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; folgende Methoden definiert:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt;:&amp;#039;&amp;#039;&amp;#039; Blockiert den aufrufenden Thread und gibt den Monitor&amp;amp;nbsp;– das Objekt, dessen &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt;-Methode er gerade ausführt&amp;amp;nbsp;– frei.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;notify()&amp;lt;/code&amp;gt;:&amp;#039;&amp;#039;&amp;#039; Entblockiert (irgend)einen an diesem Monitor blockierten Thread; dieser kann weiterlaufen, sobald der Monitor frei ist. (Dieses Verhalten ist nicht „fair“ im Sinne von [[Fairness#Informatik|Fairness]].)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;notifyAll()&amp;lt;/code&amp;gt;:&amp;#039;&amp;#039;&amp;#039; Entblockiert alle an diesem Monitor blockierten Threads; sie können weiterlaufen, sobald der Monitor frei ist.&lt;br /&gt;
&lt;br /&gt;
Wegen der fehlenden Bedingungsvariablen muss ein deblockierter Thread die Bedingung, auf die er wartet, erneut prüfen&amp;amp;nbsp;– sie könnte noch nicht gültig sein oder schon durch schnellere Threads wieder invalidiert worden sein.&lt;br /&gt;
&lt;br /&gt;
== Verwandte Themen ==&lt;br /&gt;
* [[Mutex]] – Oberbegriff für Verfahren, die wechselseitigen Ausschluss von Datenzugriffen ermöglichen.&lt;br /&gt;
* [[Semaphor (Informatik)|Semaphor]] – Verfahren zur [[Prozesssynchronisation]] mittels Betriebssystemdiensten&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Parallelverarbeitung]]&lt;br /&gt;
[[Kategorie:Betriebssystemtheorie]]&lt;/div&gt;</summary>
		<author><name>imported&gt;ChipsEssen</name></author>
	</entry>
</feed>