Semaphore vs. Mutex

Einführung

Ein Betriebssystem-Prozess interagiert mit anderen Prozessen, die im selben System ausgeführt werden, um eine gemeinsame Aufgabe auszuführen. Prozesse, die mit anderen Prozessen interagieren, werden als kooperative Prozesse bezeichnet.

Basierend auf den IPC-Strategien (Inter-Process Communication), die von einem Prozess implementiert werden, kann er entweder seinen Adressraum mit anderen Prozessen teilen oder durch Nachrichtenaustausch kommunizieren. Bei der ersteren Technik ist es wichtig, die Kommunikation zu steuern, da beide Prozesse einen gemeinsamen Adressraum haben.

Diese Art der Prozesskommunikation wird als Synchronisation bezeichnet. Ohne ordnungsgemäße Synchronisation können Prozesse veraltete Daten lesen oder andere Prozessdaten überschreiben.

Semaphore und Mutex sind zwei Mechanismen, mit denen wir die Synchronisation implementieren und die Prozesskoordination verwalten können. In diesem Artikel werden wir uns diese beiden Synchronisierungsdienstprogramme ansehen und verschiedene Eigenschaften vergleichen.

Verständnis des kritischen Abschnitts

Bevor wir Semaphore und Mutex diskutieren, sollten wir das Problem des kritischen Abschnitts verstehen.

Nehmen wir an, wir haben ein System, das n Prozesse enthält. Jeder dieser Prozesse verfügt über ein Codesegment, in dem der Prozess eine gemeinsame Variablenaktualisierung, eine Tabellenaktualisierung oder das Schreiben in eine Datei durchführen kann. Dieses Codesegment wird als kritischer Abschnitt eines Prozesses bezeichnet.

2.1. Merkmale eines kritischen Abschnittsproblems

Das wesentliche Merkmal des kritischen Abschnitts besteht darin, dass ein Prozess, sobald er mit der Ausführung seines kritischen Abschnitts beginnt, seinen kritischen Abschnitt nicht mehr ausführen darf. Das heißt, keine zwei Prozesse können ihren kritischen Abschnitt gleichzeitig ausführen. Dieses kritische Abschnittproblem besteht darin, ein Protokoll so zu entwerfen, dass Prozesse die Zusammenarbeit nutzen können.

Jeder Prozess muss die Berechtigung zum Betreten seines kritischen Abschnitts einholen. Der Code, der die Berechtigung implementiert, wird als Eintrag bezeichnet. In ähnlicher Weise wird der Code, der den Exit des kritischen Abschnitts implementiert, als Exit-Abschnitt bezeichnet.

2.2. Kriterien eines kritischen Abschnittsproblems

Die Lösung eines kritischen Abschnittsproblems muss die folgenden Kriterien erfüllen:

  • Gegenseitiger Ausschluss: Wenn ein Prozess seinen kritischen Abschnitt ausführt, kann kein anderer Prozess seinen kritischen Abschnitt ausführen
  • Fortschritt: Wenn kein Prozess seinen kritischen Abschnitt ausführt, können andere Prozesse entscheiden, ihren kritischen Abschnitt auszuführen. Basierend auf der Lösung und der Implementierung wird ein Prozess ausgewählt, der seinen kritischen Abschnitt ausführen kann. Die bemerkenswerten Merkmale sind, dass Prozesse die Möglichkeit haben, zu einem Auswahlprozess überzugehen, um seinen kritischen Abschnitt auszuführen
  • Begrenztes Warten: Es sollte ein begrenztes Warten auf einen Prozess geben, wenn er seinen kritischen Abschnittseintragsabschnitt angefordert hat und wie oft ein anderer Prozess seinen kritischen Abschnitt ausführt

Mutex-Sperren

Es gibt mehrere Dienstprogramme, um das Problem des kritischen Abschnitts in einem Betriebssystem zu lösen. Der gegenseitige Ausschluss (Mutex) Sperren oder der Mutex ist die einfachste Lösung. Wir verwenden die Mutex-Sperren, um den kritischen Abschnitt zu schützen und die Rennbedingungen zu verhindern. Ein Prozess muss die Sperre erwerben, bevor er auf seinen kritischen Abschnitt zugreift, und die Sperre wird freigegeben, sobald die Ausführung des kritischen Abschnitts abgeschlossen ist.

3.1. Wie funktioniert eine Mutex-Sperre?

Diese beiden Funktionen zum Erfassen und Freigeben von Sperren werden durch zwei Funktionen dargestellt – acquire() und release(). Die Acquire-Funktion erfasst die Sperre, und die Freigabe gibt die Sperre frei. Eine Mutex-Sperre hat eine boolesche Variable, die entscheidet, ob die Sperre verfügbar ist oder nicht. Wenn die Sperre verfügbar ist, ist die Methode acquire () erfolgreich und die Sperre wird als nicht verfügbar betrachtet. Jeder Prozess, der versucht, auf eine nicht verfügbare Sperre zuzugreifen, wird blockiert, bis die Sperre freigegeben wird.

Der folgende Pseudocode zeigt die acquire() -Methode:

 Gerendert von QuickLaTeX.com

Der folgende Pseudocode zeigt die release() -Methode:

 Gerendert von QuickLaTeX.com

3.2. Nachteile von Mutexen

Der Hauptnachteil einer Mutexsperre besteht darin, dass der Thread Spinlock kann, wenn die Sperre nicht verfügbar ist.

Während ein Thread die Sperre erworben hat und sich in seinem kritischen Abschnitt befindet, befinden sich alle anderen Threads, die versuchen, die Sperre zu erhalten, in einer Schleife, in der der Thread regelmäßig überprüft, ob die Sperre verfügbar ist. Daher dreht es sich für die Sperre und verschwendet CPU-Zyklen, die von einigen anderen Threads produktiv verwendet werden könnten.

Dies ist ein Hauptproblem in einer einzelnen CPU-Maschine. Spinlock wird auch als Busy Waiting bezeichnet, da der Thread „busy“ ist und auf die Sperre wartet.

3.3. Vorteile von Mutexen

Obwohl Mutex-Sperren unter dem Problem des Spinlocks leiden, haben sie einen Vorteil. Da der Prozess in der CPU Spinlocks, entfällt die Notwendigkeit für den Prozesskontextwechsel, die sonst erforderlich gewesen wäre.

Der Kontextwechsel eines Prozesses ist ein zeitintensiver Vorgang, da die Prozessstatistik im Prozesssteuerungsblock (PCB) gespeichert und ein anderer Prozess in die CPU neu geladen werden muss. Es gibt Multiprozessor-CPUs, bei denen sich ein Prozess in einem Prozessorkern drehen kann und ein anderer seinen kritischen Abschnitt ausführen kann. Daher ist ein Spinlock von kurzer Dauer in einigen Szenarien nützlicher als ein Prozesskontextwechsel.

Semaphore

Ein Semaphor ist ein weiteres Dienstprogramm, das auch Synchronisationsfunktionen bietet, die Mutex-Sperren ähneln, jedoch robuster und ausgefeilter sind.

Ein Semaphor ist eine ganzzahlige Variable, auf die neben der Initialisierung über zwei atomare Standardoperationen zugegriffen wird – wait() und signal(). Die wait() -Operation wird als P und die signal() -Operation als V.

Schauen wir uns die wait() -Operation an:

 Gerendert von QuickLaTeX.com

Schauen wir uns zum Schluss die signal() -Operation an:

 Gerendert von QuickLaTeX.com

!

Alle Operationen auf den ganzzahligen Wert des Semaphors in der wait() und signal() atomar ausgeführt. Das heißt, sobald ein Prozess den Semaphor-Wert ändert, kann kein anderer Prozess gleichzeitig denselben Semaphor-Wert ändern.

Basierend auf dem Wert des Semaphors S wird es in zwei Kategorien eingeteilt – Zählsemaphor und Binärsemaphor. Der Wert eines Zählsemaphors kann über 0 bis zu einem endlichen Wert liegen. Der Wert eines binären Semaphors kann zwischen 0 und 1 liegen.

4.1. Zählen von Semaphoren

Das Zählen von Semaphoren kann die N Anzahl von Instanzen einer bestimmten Ressource steuern. Lassen Sie uns das Zählsemaphor mit einer Analogie erklären.

Nehmen wir an, es gibt eine Bibliothek mit drei Studienräumen, und es gibt einen Bibliothekar, der zehn Schlüssel hält, jeder für einen anderen Raum. Sobald ein Leser Zugang zu einem Raum benötigt, muss er einen Schlüssel erhalten, um den Raum nutzen zu können. Sobald ein Leser mit seiner Verwendung fertig ist, gibt er den Zimmerschlüssel an den Bibliothekar zurück. Sobald alle Räume genutzt werden, muss ein neuer Leser warten, bis ein Raum von einem vorhandenen Leser geräumt wird.

Im obigen Beispiel ist die Ressource ein Raum, und es gibt zehn Instanzen davon. Diese Instanzen werden über ein Zählsemaphor verwaltet, das mit zehn initialisiert wird. Dieser Semaphor-Wert wird durch die Methoden wait() und signal() des Semaphors gesteuert. Das folgende Diagramm veranschaulicht dies:

4.2. Binäre Semaphore

Ein binäres Semaphor hat zwei mögliche Werte, 0 und 1. Wenn die vom Semaphor verwaltete Ressource verfügbar ist, ist der Semaphor-Wert 1. Andernfalls wird es auf 0 gesetzt, was darauf hinweist, dass die Ressource nicht verfügbar ist.

Ein binäres Semaphor hat die gleiche Funktionalität wie eine Mutex-Sperre. Systeme, die keine Mutex-Sperren unterstützen, können binäre Semaphore nutzen, um dieselbe Funktionalität zu erreichen.

Das folgende Diagramm veranschaulicht das binäre Semaphor:

Semaphor vs. Mutex

Die folgende Tabelle fasst die wichtigen Eigenschaften von Semaphor- und Mutexsperren zusammen:

 Gerendert von QuickLaTeX.com

Fazit

In diesem Artikel haben wir verschiedene Aspekte von Mutexen und Semaphoren diskutiert.

Zunächst haben wir den kritischen Abschnitt und die Notwendigkeit eines Mutex oder Semaphors zur Steuerung der Ausführung kritischer Abschnitte erörtert. Wir haben dann über Mutex und Semaphore gesprochen.

Schließlich haben wir einen Vergleich von Semaphor und Mutex bereitgestellt.

Wenn Sie ein paar Jahre Erfahrung in der Informatik oder Forschung haben und diese Erfahrung mit der Community teilen möchten, werfen Sie einen Blick auf unsere Beitragsrichtlinien.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.