Semaphor vs. Monitore - was ist der Unterschied?

233

Was sind die Hauptunterschiede zwischen einem Monitor und einem Semaphor ?

user919860
quelle
8
Sie können sich Monitor als binäres Semaphor vorstellen.
Maxim Egorushkin
ähnlich: stackoverflow.com/q/3547030/158779
Brian Gideon
1
Bitte gehen Sie diese albahari.com/threading/part2.aspx durch . Ich habe diesen Artikel gelesen, den besten, den ich je über Threading gelesen habe
Shantanu Gupta
5
Ich glaube nicht, dass du recht hast, Maxim. Ein Semaphor ist eine "untergeordnete" Struktur, wenn ich mich nicht irre, während ein Monitor ein ausgewachsenes Objekt ist. Ich erinnere mich, dass wir in meiner Klasse für Betriebssysteme im College kurz über Monitore gesprochen haben, aber ich erinnere mich nicht, wie sich ein Monitor von einem Mutex unterschied, abgesehen davon, dass er objektorientiert war. Ich erinnere mich, dass ein Problem mit Monitoren gelöst werden konnte, aber wir konnten diese Methode im Unterricht aufgrund der Einschränkungen der C-Sprache nicht verwenden.
user919860
1
Semaphor und Monitor unterscheiden sich stark, sind jedoch in der Leistung gleichwertig, da Sie sie voneinander implementieren können. Sie können Hoares Originalarbeit lesen, die ihre Gleichwertigkeit von hier
Thanh DK

Antworten:

529

Ein Monitor ist ein Objekt, auf das von mehreren Threads aus zugegriffen werden kann. Die Elementfunktionen oder -methoden eines Überwachungsobjekts erzwingen den gegenseitigen Ausschluss, sodass zu einem bestimmten Zeitpunkt möglicherweise nur ein Thread eine Aktion für das Objekt ausführt. Wenn ein Thread derzeit eine Mitgliedsfunktion des Objekts ausführt, muss jeder andere Thread, der versucht, eine Mitgliedsfunktion dieses Objekts aufzurufen, warten, bis die erste beendet ist.

Ein Semaphor ist ein untergeordnetes Objekt. Sie können auch ein Semaphor verwenden, um einen Monitor zu implementieren. Ein Semaphor ist im Wesentlichen nur ein Zähler. Wenn der Zähler positiv ist und ein Thread versucht, das Semaphor zu erfassen, ist dies zulässig, und der Zähler wird dekrementiert. Wenn ein Thread fertig ist, gibt er das Semaphor frei und erhöht den Zähler.

Wenn der Zähler bereits Null ist, wenn ein Thread versucht, das Semaphor abzurufen, muss er warten, bis ein anderer Thread das Semaphor freigibt. Wenn mehrere Threads warten, wenn ein Thread ein Semaphor veröffentlicht, erhält einer von ihnen es. Der Thread, der ein Semaphor freigibt, muss nicht derselbe Thread sein, der es erworben hat.

Ein Monitor ist wie eine öffentliche Toilette. Es kann jeweils nur eine Person teilnehmen. Sie schließen die Tür ab, um zu verhindern, dass andere hereinkommen, erledigen ihre Sachen und schließen sie dann auf, wenn sie gehen.

Ein Semaphor ist wie ein Fahrradverleih. Sie haben eine bestimmte Anzahl von Fahrrädern. Wenn Sie versuchen, ein Fahrrad zu mieten, das kostenlos ist, können Sie es mitnehmen, andernfalls müssen Sie warten. Wenn jemand sein Fahrrad zurückgibt, kann es jemand anderes nehmen. Wenn Sie ein Fahrrad haben, können Sie es jemand anderem zur Rückgabe geben - dem Fahrradverleih ist es egal, wer es zurückgibt, solange er sein Fahrrad zurückbekommt.

Anthony Williams
quelle
162
+1 Tolle Analogie zu den öffentlichen Bädern und dem Fahrradverleih. Ich werde den Unterschied zwischen den beiden jetzt nie vergessen.
Drupad Panchal
4
Ihre Antwort scheint stackoverflow.com/a/7336799/632951 zu widersprechen. Also , wer hat Recht?
Pacerier
6
@ Pacerier: Ich bin :-) Der einzige Widerspruch ist das High-Level / Low-Level-Ding. Sie können einen Monitor aus Semaphoren erstellen, er ist einfach nicht sehr aufgeräumt, gerade weil ein Monitor eine übergeordnete Struktur als ein Semaphor ist. Ein Semaphor ist nur ein Zähler mit Warten. Ich schlage vor, "Das kleine Buch der Semaphoren" zu lesen greenteapress.com/semaphores
Anthony Williams
3
@AnthonyWilliams: Ich bezweifle vielleicht die Vorstellung, dass man Monitore nur aus Semaphoren bauen kann. Der andere Weg ist ebenfalls möglich, und aus diesem Grund können wir nicht genau sagen, dass der Monitor eine übergeordnete Einheit als Semaphoren ist.
Kavish Dwivedi
5
Ja, Sie können ein Semaphor von einem Monitor aus erstellen. Sie können immer Objekte auf niedriger Ebene aus Objekten auf hoher Ebene erstellen. Bei den High / Low-Level-Dingen geht es um Fähigkeiten und Funktionsumfang, nicht darum, welche zum Erstellen des anderen verwendet werden können.
Anthony Williams
11

Die folgende Erklärung erklärt tatsächlich, wie sich wait () und signal () des Monitors von P und V des Semaphors unterscheiden.

Die Operationen wait () und signal () für Bedingungsvariablen in einem Monitor ähneln den Operationen P und V für das Zählen von Semaphoren .

Eine wait-Anweisung kann die Ausführung eines Prozesses blockieren, während eine signal-Anweisung dazu führen kann, dass ein anderer Prozess entsperrt wird. Es gibt jedoch einige Unterschiedezwischen ihnen. Wenn ein Prozess eine P-Operation ausführt, blockiert er diesen Prozess nicht unbedingt, da das Zählsemaphor größer als Null sein kann. Wenn dagegen eine wait-Anweisung ausgeführt wird, blockiert sie immer den Prozess. Wenn eine Aufgabe eine V-Operation für ein Semaphor ausführt, wird entweder eine auf dieses Semaphor wartende Aufgabe entsperrt oder der Semaphorzähler erhöht, wenn keine Aufgabe zum Entsperren vorhanden ist. Wenn andererseits ein Prozess eine Signalanweisung ausführt, während kein anderer Prozess entsperrt werden muss, hat dies keine Auswirkung auf die Bedingungsvariable. Ein weiterer Unterschied zwischen Semaphoren und Monitoren besteht darin, dass Benutzer, die durch eine V-Operation geweckt werden, die Ausführung unverzüglich wieder aufnehmen können. Im Gegensatz dazu werden Benutzer, die durch eine Signaloperation geweckt werden, nur neu gestartet, wenn der Monitor entsperrt ist. Zusätzlich,

Link: hier zur weiteren Lektüre. Ich hoffe es hilft.

Abu Shumon
quelle
6

Einzeilige Antwort:

Monitor: Steuert, dass jeweils nur EIN Thread im Monitor ausgeführt werden kann. (muss gesperrt werden, um den einzelnen Thread auszuführen)

Semaphor: Eine Sperre, die eine gemeinsam genutzte Ressource schützt. (Sie müssen die Sperre erwerben, um auf die Ressource zugreifen zu können.)

Billz
quelle
5

Mit Semaphore können mehrere Threads (bis zu einer festgelegten Anzahl) auf ein freigegebenes Objekt zugreifen. Monitore ermöglichen den sich gegenseitig ausschließenden Zugriff auf ein freigegebenes Objekt.

Monitor

Semaphor

tafoo85
quelle
10
Aber wie würde sich ein Monitor von einem MutEx unterscheiden? Eine gegenseitige Ausschlusssperre macht genau das Gleiche wie ein Semaphor, erlaubt jedoch jeweils nur einem Thread den Zugriff auf den kritischen Bereich.
user919860
2
Ja, was ist der Unterschied zwischen einem Mnitor und einem Mutex?
Pacerier
2
Beachten Sie, dass Semaphoren nicht den Zugriff auf ein freigegebenes Objekt steuern, sondern auf eine gemeinsam genutzte Ressource (die mehrere Objekte enthält).
Xbonez
@xbonez: Wenn wir uns ansehen: Ist java.util.ArrayListes ein Objekt oder ein Container mit mehreren Objekten? Nun, es ist beides gleichzeitig. Ist ein Semaphor geeignet, um den Zugriff darauf zu kontrollieren? Ich würde sagen: nein.
dma_k
In der akzeptierten Antwort selbst wird erwähnt, dass Monitor den gegenseitigen Ausschluss implementiert. Bitte
lesen
2

Wenn ein Semaphor zum Schutz eines kritischen Bereichs verwendet wird, besteht keine direkte Beziehung zwischen dem Semaphor und den zu schützenden Daten. Dies ist einer der Gründe, warum Semaphoren im Code verteilt sein können und warum es leicht zu vergessen ist, wait oder notify aufzurufen . In diesem Fall besteht das Ergebnis darin, den gegenseitigen Ausschluss zu verletzen oder die Ressource dauerhaft zu sperren.

Im Gegensatz dazu kann mit einem Monitor nichts von diesen schlechten Dingen passieren. Ein Monitor ist direkt an den Daten müde (er kapselt die Daten), und da es sich bei den Monitoroperationen um atomare Aktionen handelt, ist es unmöglich, Code zu schreiben, der auf die Daten zugreifen kann, ohne das Eingabeprotokoll aufzurufen. Das Exit-Protokoll wird automatisch aufgerufen, wenn der Monitorvorgang abgeschlossen ist.

Ein Monitor verfügt über einen integrierten Mechanismus zur Bedingungssynchronisation in Form einer Bedingungsvariablen, bevor Sie fortfahren. Wenn die Bedingung nicht erfüllt ist, muss der Prozess warten, bis er über eine Änderung der Bedingung informiert wird. Wenn ein Prozess auf die Synchronisation der Bedingungen wartet, kümmert sich die Monitorimplementierung um das Problem des gegenseitigen Ausschlusses und ermöglicht einem anderen Prozess den Zugriff auf den Monitor.

Entnommen aus dem Kursmaterial der Open University M362 Unit 3 "Interacting Process".

e.doroskevic
quelle
Abgesehen davon, dass Semaphore zwar häufig in einer Sprache verfügbar gemacht und in Lehrbüchern als eine Art Variable mit begrenzten Atomoperatoren dargestellt werden, ist ein Semaphor ein Sonderfall eines Monitors - da es sich um eine Art Variable mit begrenzten Atomoperatoren handelt. denn das ist ein Monitor. Die obigen Argumente, dass Semaphoren "niedrigere Ebene" sind, sind spekulativ.
Philipxy
2

Semaphor:

Die Verwendung eines Zählers oder Flags zur Steuerung des Zugriffs auf einige gemeinsam genutzte Ressourcen in einem gleichzeitigen System impliziert die Verwendung von Semaphore .

Beispiel:

  1. Ein Schalter, an dem nur 50 Passagiere die 50 Sitzplätze (gemeinsam genutzte Ressource) eines Theaters / Busses / Zugs / einer lustigen Fahrt / eines Klassenzimmers erwerben können. Und einen neuen Passagier nur dann zuzulassen, wenn jemand einen Sitzplatz frei hat.
  2. Ein binäres Flag, das den freien / belegten Status eines Badezimmers anzeigt.
  3. Ampeln sind ein gutes Beispiel für Flaggen. Sie steuern den Durchfluss, indem sie den Durchgang von Fahrzeugen auf Straßen regulieren (gemeinsam genutzte Ressource).

Flags zeigen nur den aktuellen Status der Ressource an, keine Anzahl oder andere Informationen zu den wartenden oder laufenden Objekten in der Ressource.

Monitor:

Ein Monitor synchronisiert den Zugriff auf ein Objekt, indem er mit Threads kommuniziert, die an dem Objekt interessiert sind, und sie auffordert, Zugriff zu erhalten oder darauf zu warten, dass eine Bedingung erfüllt wird.

Beispiel:

  1. Ein Vater kann als Monitor für ihre Tochter fungieren und ihr erlauben, jeweils nur einen Mann zu treffen.
  2. Ein Schullehrer, der Schlagstock benutzt, um nur einem Kind zu erlauben, in der Klasse zu sprechen.
  3. Zuletzt eine technische Transaktion, bei der Transaktionen (über Threads) auf einem Kontoobjekt synchronisiert werden, um die Integrität aufrechtzuerhalten.
Barun
quelle
Ich denke, dass die Ampel am Straßenkreuz auch eine binäre Flagge ist: Entweder Autos auf einer Straße oder auf einer orthogonalen Straße können fahren (sich gegenseitig ausschließen), daher ist Beispiel (3) dasselbe wie (2). Ich denke auch, dass diese Beispiele Eckpunkte für Semaphoren sind (trivialer Fall), die mit Monitor implementiert werden können. Es gibt typischere Beispiele in Wikipedia .
dma_k