Gemäß der Terminologie des Betriebssystems sind Mutex und Semaphore Kernel-Ressourcen, die Synchronisierungsdienste bereitstellen, auch „ Synchronisationsprimitive . Die Prozesssynchronisierung spielt eine wichtige Rolle bei der Aufrechterhaltung der Konsistenz gemeinsam genutzter Daten. Zur Bewältigung kritischer Abschnittsprobleme sind sowohl Software- als auch Hardwarelösungen vorhanden. Hardwarelösungen für kritische Abschnittsprobleme sind jedoch recht schwierig zu implementieren. Mutex und Semaphor bieten beide Synchronisationsdienste, sind jedoch nicht dasselbe.
Was ist Mutex?
Mutex ist ein Objekt mit gegenseitigem Ausschluss, das den Zugriff auf eine Ressource synchronisiert. Es wird beim Start eines Programms mit einem eindeutigen Namen erstellt. Der Mutex-Sperrmechanismus stellt sicher, dass nur ein Thread den Mutex erwerben und in den kritischen Abschnitt gelangen kann. Dieser Thread gibt den Mutex nur frei, wenn er im kritischen Abschnitt beendet wird.
Es handelt sich um einen speziellen Typ eines binären Semaphors, der zur Steuerung des Zugriffs auf die gemeinsam genutzte Ressource verwendet wird. Es enthält einen Mechanismus zur Prioritätsvererbung, um erweiterte Probleme bei der Prioritätsumkehr zu vermeiden. Dadurch können aktuelle Aufgaben mit höherer Priorität so kurz wie möglich im blockierten Zustand gehalten werden. Allerdings korrigiert die Prioritätsvererbung die Prioritätsumkehr nicht, sondern minimiert lediglich deren Auswirkung.
Beispiel
Dies wird anhand des folgenden Beispiels gezeigt:
wait (mutex); ..... Critical Section ..... signal (mutex);
Verwendung von Mutex
Ein Mutex sorgt für gegenseitigen Ausschluss, sodass entweder der Produzent oder der Konsument über den Schlüssel (Mutex) verfügen und mit seiner Arbeit fortfahren kann. Solange der Produzent den Puffer füllt, muss der Benutzer warten und umgekehrt. Bei der Mutex-Sperre kann immer nur ein einzelner Thread mit dem gesamten Puffer arbeiten.
Wenn ein Programm startet, 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. Immer wenn der Programmthread die Ressource verwenden möchte, belegt er die Sperre für das Mutex-Objekt, nutzt 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 erlangt 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 erlangen 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:
- Bei Mutex handelt es sich lediglich um einfache Sperren, die vor dem Eintritt in den kritischen Abschnitt und der anschließenden Freigabe erhalten werden.
- Da sich immer nur ein Thread in seinem kritischen Abschnitt befindet, gibt es keine Race Conditions 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 vorzeitig freigegeben wird, bewegt sich der andere Thread möglicherweise nicht weiter. Dies kann zum Verhungern führen.
- Es kann nicht in einem anderen Kontext als dem, in dem es erworben wurde, 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?
Semaphor ist einfach eine Variable, die nicht negativ ist und von Threads gemeinsam genutzt wird. Ein Semaphor ist ein Signalmechanismus, und ein anderer Thread kann einem Thread signalisieren, dass er auf einen Semaphor wartet.
Ein Semaphor verwendet zwei atomare Operationen:
1. Warten: Die Warteoperation dekrementiert den Wert ihres Arguments S, wenn dieser positiv ist. Wenn S negativ oder Null ist, wird keine Operation ausgeführt.
wait(S) { while (S<=0); s--; } < pre> <p> <strong>2. Signal for the process synchronization:</strong> The signal operation increments the value of its argument S.</p> <pre> signal(S) { S++; } </pre> <p>A semaphore either allows or reject access to the resource, depending on how it is set up.</p> <h3>Use of Semaphore</h3> <p>In the case of a single buffer, we can separate the 4 KB buffer into four buffers of 1 KB. Semaphore can be associated with these four buffers, allowing users and producers to work on different buffers simultaneously.</p> <h3>Types of Semaphore</h3> <p>Semaphore is distinguished by the operating system in two categories <strong>Counting semaphore</strong> and <strong>Binary semaphore</strong> .</p> <p> <strong>1. Counting Semaphore:</strong> The semaphore S value is initialized to the <strong>number of resources</strong> present in the system. Whenever a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and <strong>decrements</strong> the semaphore value by one. When it releases the resource, it performs <strong>the signal()</strong> operation on the semaphore and <strong>increments</strong> the semaphore value by one.</p> <p>When the semaphore count goes to 0, it means the processes occupy all resources. A process needs to use a resource when the semaphore count is 0. It executes the <strong>wait()</strong> operation and gets <strong>blocked</strong> until the semaphore value becomes greater than 0.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-3.webp" alt="Mutex vs Semaphore"> <p> <strong>2. Binary semaphore:</strong> The value of a semaphore ranges between <strong>0</strong> and <strong>1</strong> . It is similar to mutex lock, but mutex is a locking mechanism, whereas the semaphore is a signaling mechanism. In binary semaphore, if a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and decrements the value of the semaphore from 1 to 0. When it releases the resource, it performs a <strong>signal</strong> <strong>()</strong> operation on the semaphore and increments its value to 1. Suppose the value of the semaphore is 0 and a process wants to access the resource. In that case, it performs <strong>wait()</strong> operation and block itself till the current process utilizing the resources releases the resource.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-4.webp" alt="Mutex vs Semaphore"> <h3>Advantages of Semaphore</h3> <p>Here are the following advantages of semaphore, such as:</p> <ul> <li>It allows more than one thread to access the critical section.</li> <li>Semaphores are machine-independent.</li> <li>Semaphores are implemented in the machine-independent code of the microkernel.</li> <li>They do not allow multiple processes to enter the critical section.</li> <li>As there is busy and waiting in semaphore, there is never wastage of process time and resources.</li> <li>They are machine-independent, which should be run in the machine-independent code of the microkernel.</li> <li>They allow flexible management of resources.</li> </ul> <h3>Disadvantage of Semaphores</h3> <p>Semaphores also have some disadvantages, such as:</p> <ul> <li>One of the biggest limitations of a semaphore is priority inversion.</li> <li>The operating system has to keep track of all calls to wait and signal semaphore.</li> <li>Their use is never enforced, but it is by convention only.</li> <li>The Wait and Signal operations require to be executed in the correct order to avoid deadlocks in semaphore.</li> <li>Semaphore programming is a complex method, so there are chances of not achieving mutual exclusion.</li> <li>It is also not a practical method for large scale use as their use leads to loss of modularity.</li> <li>Semaphore is more prone to programmer error</li> <li>, and it may cause deadlock or violation of mutual exclusion due to programmer error.</li> </ul> <h3>Difference between Mutex and Semaphore</h3> <p>The basic difference between semaphore and mutex is that semaphore is a signalling mechanism, i.e. processes perform wait() and signal() operation to indicate whether they are acquiring or releasing the resource. In contrast, a mutex is a locking mechanism, and the process has to acquire the lock on a mutex object if it wants to acquire the resource. Here are some more differences between semaphore and mutex, such as:</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-5.webp" alt="Mutex vs Semaphore"> <br> <table class="table"> <tr> <th>Terms</th> <th>Mutex</th> <th>Semaphore</th> </tr> <tr> <td>Definition</td> <td>The mutex is a locking mechanism, as to acquire a resource, a process needs to lock the mutex object, and while releasing a resource process has to unlock the mutex object.</td> <td>Semaphore is a signalling mechanism as wait() and signal() operations performed on the semaphore variable indicate whether a process is acquiring or releasing the resource.</td> </tr> <tr> <td>Existence</td> <td>A mutex is an object.</td> <td>Semaphore is an integer variable.</td> </tr> <tr> <td>Function</td> <td>Mutex allows multiple program threads to access a single resource but not simultaneously.</td> <td>Semaphore allows multiple program threads to access a finite instance of resources.</td> </tr> <tr> <td>Ownership</td> <td>Mutex object lock is released only by the process that has acquired the lock on the mutex object.</td> <td>Semaphore value can be changed by any process acquiring or releasing the resource by performing wait() and signal() operation.</td> </tr> <tr> <td>Categorize</td> <td>Mutex is not categorized further.</td> <td>The semaphore can be categorized into counting semaphore and binary semaphore.</td> </tr> <tr> <td>Operation</td> <td>The mutex object is locked or unlocked by the process of requesting or releasing the resource.</td> <td>Semaphore value is modified using wait() and signal() operation apart from initialization.</td> </tr> <tr> <td>Resources Occupied</td> <td>If a mutex object is already locked, then the process desiring to acquire resource waits and get queued by the system till the resource is released and the mutex object gets unlocked.</td> <td>Suppose the process acquires all the resources, and no resource is free. In that case, the process desiring to acquire resource performs wait() operation on semaphore variable and blocks itself till the count of semaphore become greater than 0.</td> </tr> </table> <hr></=0);>
Ein Semaphor erlaubt oder verweigert den Zugriff auf die Ressource, je nachdem, wie es eingerichtet ist.
Verwendung von Semaphor
Im Falle eines einzelnen Puffers können wir den 4-KB-Puffer in vier Puffer zu je 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 wird vom Betriebssystem in zwei Kategorien unterschieden Zählsemaphor Und Binärer Semaphor .
1. Zählsemaphor: Der Semaphor-S-Wert wird auf initialisiert Anzahl der Ressourcen im System vorhanden. Immer wenn ein Prozess auf die Ressource zugreifen möchte, führt er dies aus das Warten() Betrieb am Semaphor und Dekremente den Semaphorwert um eins. Wenn die Ressource freigegeben wird, wird sie ausgeführt das Signal() Betrieb am Semaphor und Schritte den Semaphorwert um eins.
Wenn die Semaphoranzahl auf 0 geht, bedeutet dies, dass die Prozesse alle Ressourcen belegen. Ein Prozess muss eine Ressource verwenden, wenn die Semaphoranzahl 0 ist. Er führt die aus Warten() Betrieb und bekommt verstopft bis der Semaphorwert größer als 0 wird.
2. Binäres Semaphor: Der Wert eines Semaphors liegt zwischen 0 Und 1 . Es ähnelt der Mutex-Sperre, aber Mutex ist ein Sperrmechanismus, während das Semaphor ein Signalmechanismus ist. Wenn ein Prozess im binären Semaphor auf die Ressource zugreifen möchte, führt er dies aus das Warten() Operation am Semaphor und dekrementiert den Wert des Semaphors von 1 auf 0. Wenn die Ressource freigegeben wird, führt sie a aus Signal () Operation am Semaphor und erhöht seinen Wert auf 1. Angenommen, der Wert des Semaphors ist 0 und ein Prozess möchte auf die Ressource zugreifen. In diesem Fall funktioniert es Warten() Operation und blockiert sich selbst, bis der aktuelle Prozess, der die Ressourcen nutzt, die Ressource freigibt.
Vorteile von Semaphor
Hier sind die folgenden Vorteile von Semaphoren, wie zum Beispiel:
- Dadurch kann mehr als ein Thread auf den kritischen Abschnitt zugreifen.
- Semaphore sind maschinenunabhängig.
- Semaphore werden im maschinenunabhängigen Code des Mikrokernels implementiert.
- Sie erlauben nicht, dass mehrere Prozesse in den kritischen Abschnitt gelangen.
- Da im Semaphor viel los ist und gewartet wird, kommt es nie zu einer Verschwendung von Prozesszeit und Ressourcen.
- Sie sind maschinenunabhängig und sollten im maschinenunabhängigen Code des Mikrokernels ausgeführt werden.
- Sie ermöglichen eine flexible Verwaltung der Ressourcen.
Nachteil von Semaphoren
Semaphore haben auch einige Nachteile, wie zum Beispiel:
- Eine der größten Einschränkungen eines Semaphors ist die Prioritätsumkehr.
- Das Betriebssystem muss alle Aufrufe verfolgen, um zu warten und Semaphore zu signalisieren.
- Ihre Verwendung wird niemals erzwungen, sondern erfolgt nur durch Konvention.
- Die Wait- und Signal-Operationen müssen in der richtigen Reihenfolge ausgeführt werden, um Deadlocks im Semaphor zu vermeiden.
- Da es sich bei der Semaphorprogrammierung um eine komplexe Methode handelt, besteht die Möglichkeit, dass ein gegenseitiger Ausschluss nicht 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.
- Semaphor ist anfälliger für Programmierfehler
- Dies 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, d. h. Prozesse führen die Operationen „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:
Bedingungen | Mutex | Semaphor |
---|---|---|
Definition | Der Mutex ist ein Sperrmechanismus, denn um eine Ressource zu erhalten, muss ein Prozess das Mutex-Objekt sperren und beim Freigeben einer Ressource muss der Prozess das Mutex-Objekt entsperren. | Semaphore ist ein Signalisierungsmechanismus, da die an der Semaphorvariablen ausgeführten Wait()- und Signal()-Operationen anzeigen, ob ein Prozess die Ressource erwirbt oder freigibt. |
Existenz | Ein Mutex ist ein Objekt. | Semaphor 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. |
Eigentum | Die Mutex-Objektsperre wird nur von dem Prozess freigegeben, der die Sperre für das Mutex-Objekt erworben hat. | Der Semaphorwert kann von jedem Prozess geändert werden, der die Ressource durch Ausführen der Operationen wait() und signal() erwirbt oder freigibt. |
Kategorisieren | Mutex wird nicht weiter kategorisiert. | Der Semaphor kann in Zählsemaphor und Binärsemaphor eingeteilt werden. |
Betrieb | Das Mutex-Objekt wird durch den Prozess des Anforderns oder Freigebens der Ressource gesperrt oder entsperrt. | Der Semaphorwert wird neben der Initialisierung auch mithilfe der Operationen wait() und signal() geändert. |
Ressourcen belegt | 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 eine Ressource abrufen möchte, die Operation „wait()“ für die Semaphorvariable aus und blockiert sich selbst, bis die Anzahl der Semaphoren größer als 0 wird. |
=0);>