Mutex vs Semaphore
Gemäß der Betriebssystemterminologie sind Mutex und Semaphore Kernelressourcen, die Synchronisationsdienste bereitstellen, auch Synchronisationsprimitive genannt. Die Prozesssynchronisierung spielt eine wichtige Rolle bei der Aufrechterhaltung der Konsistenz freigegebener Daten. Sowohl die Software- als auch die Hardwarelösungen sind vorhanden, um kritische Abschnittsprobleme zu lösen. Hardwarelösungen für kritische Abschnittsprobleme sind jedoch ziemlich schwierig zu implementieren. Mutex und Semaphore bieten beide Synchronisierungsdienste an, sind jedoch nicht identisch.
Was ist Mutex?
Mutex ist ein gegenseitiges Ausschlussobjekt, das den Zugriff auf eine Ressource synchronisiert. Es wird zu Beginn eines Programms mit einem eindeutigen Namen erstellt. Der Mutex-Verriegelungsmechanismus stellt sicher, dass nur ein Thread den Mutex erfassen und in den kritischen Abschnitt gelangen kann. Dieser Thread gibt den Mutex nur frei, wenn er im kritischen Abschnitt beendet wird.
Es ist ein spezieller Typ von binärem Semaphor, der zur Steuerung des Zugriffs auf die gemeinsam genutzte Ressource verwendet wird. Es enthält einen Prioritätsvererbungsmechanismus, um Probleme mit der erweiterten Prioritätsinversion zu vermeiden. Dadurch können aktuelle Aufgaben mit höherer Priorität für die kürzestmögliche Zeit im blockierten Zustand gehalten werden. Die Prioritätsvererbung korrigiert jedoch nicht die Prioritätsinversion, sondern minimiert nur deren Wirkung.
Beispiel
Dies wird anhand des folgenden Beispiels gezeigt,
Verwendung von Mutex
Ein Mutex bietet gegenseitigen Ausschluss, entweder Produzent oder Verbraucher, die den Schlüssel (Mutex) haben und mit ihrer Arbeit fortfahren können. Solange der Produzent den Puffer füllt, muss der Benutzer warten und umgekehrt. In der Mutex-Sperre kann immer nur ein einzelner Thread mit dem gesamten Puffer arbeiten.
Wenn ein Programm gestartet wird, fordert es das System auf, ein Mutex-Objekt für eine bestimmte Ressource zu erstellen. Das System erstellt das Mutex-Objekt mit einem eindeutigen Namen oder einer eindeutigen ID. Wann immer der Programmthread die Ressource verwenden möchte, belegt er die Sperre für das Mutex-Objekt, verwendet die Ressource und gibt nach der Verwendung die Sperre für das Mutex-Objekt frei. Dann darf der nächste Prozess die Sperre für das Mutex-Objekt erwerben.
In der Zwischenzeit hat ein Prozess die Sperre für das Mutex-Objekt erworben, und kein anderer Thread oder Prozess kann auf diese Ressource zugreifen. Wenn das Mutex-Objekt bereits gesperrt ist, muss der Prozess, der die Sperre für das Mutex-Objekt erhalten möchte, warten und wird vom System in die Warteschlange gestellt, bis das Mutex-Objekt entsperrt ist.
Vorteile von Mutex
Hier sind die folgenden Vorteile des Mutex, wie zum Beispiel:
- Mutex besteht nur aus einfachen Sperren, die erhalten werden, bevor der kritische Abschnitt betreten und dann freigegeben wird.
- Da sich zu einem bestimmten Zeitpunkt nur ein Thread in seinem kritischen Abschnitt befindet, gibt es keine Race-Bedingungen und die Daten bleiben immer konsistent.
Nachteile von Mutex
Mutex hat auch einige Nachteile, wie zum Beispiel:
- Wenn ein Thread eine Sperre erhält und in den Ruhezustand wechselt oder vorbelegt wird, bewegt sich der andere Thread möglicherweise nicht vorwärts. Dies kann zu Hunger führen.
- Es kann nicht aus einem anderen Kontext als dem, der es erworben hat, gesperrt oder entsperrt werden.
- Im kritischen Abschnitt sollte jeweils nur ein Thread zulässig sein.
- Die normale Implementierung kann zu einem ausgelasteten Wartezustand führen, der CPU-Zeit verschwendet.
Was ist Semaphor?
Semaphore ist einfach eine Variable, die nicht negativ ist und von Threads gemeinsam genutzt wird. Ein Semaphor ist ein Signalmechanismus, und ein anderer Thread kann einen Thread signalisieren, der auf ein Semaphor wartet.
Ein Semaphor verwendet zwei atomare Operationen,
1. Warten: Die Warteoperation dekrementiert den Wert ihres Arguments S, wenn es positiv ist. Wenn S negativ oder Null ist, wird keine Operation ausgeführt.
2. Signal für die Prozesssynchronisierung: Die Signaloperation erhöht den Wert ihres Arguments S.
Ein Semaphor erlaubt oder lehnt den Zugriff auf die Ressource ab, je nachdem, wie sie eingerichtet ist.
Verwendung des Semaphors
Im Falle eines einzelnen Puffers können wir den 4-KB-Puffer in vier Puffer von 1 KB aufteilen. Semaphore kann diesen vier Puffern zugeordnet werden, sodass Benutzer und Produzenten gleichzeitig an verschiedenen Puffern arbeiten können.
Arten von Semaphoren
Semaphore unterscheidet sich durch das Betriebssystem in zwei Kategorien: Semaphore und Binäres Semaphor.
1. Zählen des Semaphors: Der Wert des Semaphors wird mit der Anzahl der im System vorhandenen Ressourcen initialisiert. Immer wenn ein Prozess auf die Ressource zugreifen möchte, führt er die Operation wait () für das Semaphor aus und dekrementiert den Semaphor-Wert um eins. Wenn die Ressource freigegeben wird, führt sie die Operation signal () für das Semaphor aus und erhöht den Semaphor-Wert um eins.
Wenn die Anzahl der Semaphore auf 0 geht, bedeutet dies, dass die Prozesse alle Ressourcen belegen. Ein Prozess muss eine Ressource verwenden, wenn die Anzahl der Semaphore 0 beträgt. Es führt die wait() -Operation aus und wird blockiert, bis der Semaphor-Wert größer als 0 wird.
2. Binäres Semaphor: Der Wert eines Semaphors liegt zwischen 0 und 1. Es ist ähnlich wie Mutex lock, aber Mutex ist ein Verriegelungsmechanismus, während das Semaphor ein Signalmechanismus ist. Wenn ein Prozess im binären Semaphor auf die Ressource zugreifen möchte, führt er die Operation wait () für das Semaphor aus und dekrementiert den Wert des Semaphors von 1 auf 0. Wenn die Ressource freigegeben wird, führt sie eine signal () -Operation für das Semaphor aus und erhöht ihren Wert auf 1. Angenommen, der Wert des Semaphors ist 0 und ein Prozess möchte auf die Ressource zugreifen. In diesem Fall führt es die Operation wait () aus und blockiert sich selbst, bis der aktuelle Prozess, der die Ressourcen verwendet, die Ressource freigibt.
Vorteile von Semaphore
Hier sind die folgenden Vorteile von Semaphore, wie zum Beispiel:
- Es ermöglicht mehr als einem Thread, auf den kritischen Abschnitt zuzugreifen.
- Semaphore sind maschinenunabhängig.
- Semaphore sind im maschinenunabhängigen Code des Mikrokerns implementiert.
- Sie erlauben nicht, dass mehrere Prozesse in den kritischen Abschnitt gelangen.
- Da in Semaphore viel los ist und gewartet wird, werden Prozesszeit und -ressourcen niemals verschwendet.
- Sie sind maschinenunabhängig und sollten im maschinenunabhängigen Code des Mikrokerns ausgeführt werden.
- Sie ermöglichen ein flexibles Management von Ressourcen.
Nachteil von Semaphoren
Semaphore haben auch einige Nachteile, wie zum Beispiel:
- Eine der größten Einschränkungen eines Semaphors ist die Prioritätsinversion.
- Das Betriebssystem muss alle Aufrufe von wait und signal Semaphore verfolgen.
- Ihre Verwendung wird niemals erzwungen, sondern nur durch Konvention.
- Die Warte- und Signaloperationen müssen in der richtigen Reihenfolge ausgeführt werden, um Deadlocks im Semaphor zu vermeiden.
- Die Semaphor-Programmierung ist eine komplexe Methode, daher besteht die Möglichkeit, dass kein gegenseitiger Ausschluss erreicht wird.
- Es ist auch keine praktische Methode für den Einsatz in großem Maßstab, da ihre Verwendung zu einem Verlust der Modularität führt.
- Semaphore ist anfälliger für Programmierfehler
- und kann aufgrund eines Programmierfehlers zu einem Deadlock oder einer Verletzung des gegenseitigen Ausschlusses führen.
Unterschied zwischen Mutex und Semaphor
Der grundlegende Unterschied zwischen Semaphor und Mutex besteht darin, dass Semaphor ein Signalmechanismus ist, dh Prozesse führen wait() und signal() aus, um anzuzeigen, ob sie die Ressource erwerben oder freigeben. Im Gegensatz dazu ist ein Mutex ein Sperrmechanismus, und der Prozess muss die Sperre für ein Mutex-Objekt erwerben, wenn er die Ressource erwerben möchte. Hier sind einige weitere Unterschiede zwischen Semaphor und Mutex, wie zum Beispiel:
Begriffe | Mutex | Semaphor |
---|---|---|
Definition | Der Mutex ist ein Sperrmechanismus, um eine Ressource zu erhalten, muss ein Prozess das Mutex-Objekt sperren, und während der Freigabe einer Ressource muss der Prozess das Mutex-Objekt entsperren. | Semaphore ist ein Signalmechanismus, da wait() – und signal() -Operationen, die an der Semaphore-Variablen ausgeführt werden, anzeigen, ob ein Prozess die Ressource erfasst oder freigibt. |
Existenz | Ein Mutex ist ein Objekt. | Semaphore ist eine ganzzahlige Variable. |
Funktion | Mutex ermöglicht mehreren Programmthreads den Zugriff auf eine einzelne Ressource, jedoch nicht gleichzeitig. | Semaphore ermöglicht mehreren Programmthreads den Zugriff auf eine endliche Instanz von Ressourcen. |
Die | Mutex-Objektsperre wird nur von dem Prozess freigegeben, der die Sperre für das Mutex-Objekt erworben hat. | Der Semaphor-Wert kann von jedem Prozess geändert werden, der die Ressource durch Ausführen der Operationen wait() und signal() erfasst oder freigibt. |
Categorize | Mutex wird nicht weiter kategorisiert. | Das Semaphor kann in Zählsemaphor und Binärsemaphor unterteilt werden. |
Operation | Das Mutex-Objekt wird durch den Prozess des Anforderns oder Freigebens der Ressource gesperrt oder entsperrt. | Der Semaphor-Wert wird neben der Initialisierung mit den Operationen wait() und signal() geändert. |
Resources Occupied | Wenn ein Mutex-Objekt bereits gesperrt ist, wartet der Prozess, der eine Ressource erwerben möchte, und wird vom System in die Warteschlange gestellt, bis die Ressource freigegeben und das Mutex-Objekt entsperrt wird. | Angenommen, der Prozess erwirbt alle Ressourcen und keine Ressource ist frei. In diesem Fall führt der Prozess, der die Ressource erwerben möchte, die Operation wait () für die Semaphor-Variable aus und blockiert sich selbst, bis die Anzahl der Semaphore größer als 0 wird. |
Leave a Reply