Was sind die Hauptunterschiede zwischen einem Monitor und einem Semaphor ?
Was sind die Hauptunterschiede zwischen einem Monitor und einem Semaphor ?
Antworten:
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.
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.
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.)
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.
java.util.ArrayList
es 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.
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".
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:
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: