Auf theoretischer Ebene unterscheiden sie sich semantisch nicht. Sie können eine Mutex mit Semaphoren implementieren oder umgekehrt (siehe aquí für ein Beispiel). In der Praxis sind die Implementierungen unterschiedlich, und sie bieten leicht unterschiedliche Dienste an.
Der praktische Unterschied (in Bezug auf die sie umgebenden Systemdienste) besteht darin, dass die Implementierung eines Mutex darauf abzielt, ein leichtgewichtigerer Synchronisierungsmechanismus zu sein. In der Oracle-Sprache sind Mutexe bekannt als Verriegelungen und Semaphoren sind bekannt als wartet auf .
Auf der untersten Ebene verwenden sie eine Art von atomaren testen und einstellen Mechanismus. Dieser liest den aktuellen Wert einer Speicherstelle, berechnet eine Art von Bedingung und schreibt einen Wert an dieser Stelle in einem einzigen Befehl aus, der kann nicht unterbrochen werden . Das bedeutet, dass Sie eine Mutex erwerben und testen können, ob jemand anderes sie vor Ihnen hatte.
Bei einer typischen Mutex-Implementierung führt ein Prozess oder Thread die Anweisung test-and-set aus und prüft, ob ein anderer Prozess den Mutex gesetzt hat. Ein wichtiger Punkt hierbei ist, dass es keine Interaktion mit dem Planer Wir haben also keine Ahnung (und es ist uns egal), wer das Schloss angebracht hat. Dann geben wir entweder unsere Zeitscheibe auf und versuchen es erneut, wenn die Aufgabe neu geplant wird, oder wir führen eine Spin-Lock . Ein Spinlock ist ein Algorithmus wie:
Count down from 5000:
i. Execute the test-and-set instruction
ii. If the mutex is clear, we have acquired it in the previous instruction
so we can exit the loop
iii. When we get to zero, give up our time slice.
Wenn wir die Ausführung unseres geschützten Codes beendet haben (bekannt als kritischer Abschnitt ) setzen wir den Mutex-Wert einfach auf Null oder was auch immer 'clear' bedeutet. Wenn mehrere Aufgaben versuchen, die Mutex zu übernehmen, erhält die nächste Aufgabe, die zufällig nach der Freigabe der Mutex geplant wird, Zugriff auf die Ressource. Normalerweise verwendet man Mutexe, um eine synchronisierte Ressource zu kontrollieren, bei der der exklusive Zugriff nur für sehr kurze Zeiträume benötigt wird, normalerweise um eine gemeinsame Datenstruktur zu aktualisieren.
Ein Semaphor ist eine synchronisierte Datenstruktur (typischerweise unter Verwendung eines Mutex), die einen Zähler und einige Systemaufrufe enthält, die mit dem Scheduler etwas tiefer interagieren, als es die Mutex-Bibliotheken tun würden. Semaphoren werden inkrementiert und dekrementiert und verwendet, um Block Aufgaben, bis etwas anderes fertig ist. Siehe Erzeuger/Verbraucher-Problem für ein einfaches Beispiel dafür. Semaphore werden auf einen bestimmten Wert initialisiert - ein binäres Semaphor ist nur ein Spezialfall, bei dem das Semaphor auf 1 initialisiert wird. Ein Posting an eine Semaphore hat den Effekt, dass ein wartender Prozess aufgeweckt wird.
Ein grundlegender Semaphor-Algorithmus sieht folgendermaßen aus:
(somewhere in the program startup)
Initialise the semaphore to its start-up value.
Acquiring a semaphore
i. (synchronised) Attempt to decrement the semaphore value
ii. If the value would be less than zero, put the task on the tail of the list of tasks waiting on the semaphore and give up the time slice.
Posting a semaphore
i. (synchronised) Increment the semaphore value
ii. If the value is greater or equal to the amount requested in the post at the front of the queue, take that task off the queue and make it runnable.
iii. Repeat (ii) for all tasks until the posted value is exhausted or there are no more tasks waiting.
Im Falle eines binären Semaphors besteht der wichtigste praktische Unterschied zwischen den beiden in der Art der Systemdienste, die die eigentliche Datenstruktur umgeben.
EDIT: Wie evan richtig bemerkt hat, verlangsamen Spinlocks einen Einzelprozessorrechner. Sie würden ein Spinlock nur auf einem Multiprozessorrechner verwenden, da auf einem Einzelprozessor der Prozess, der die Mutex hält, diese niemals zurücksetzen wird, während eine andere Aufgabe läuft. Spinlocks sind nur auf Multiprozessor-Architekturen sinnvoll.
18 Stimmen
Semantisch sind sie gleich, aber in der Praxis werden Sie seltsame Unterschiede feststellen (besonders unter Windows).
10 Stimmen
@Michael Foukarakis: Was sind die merkwürdigen Unterschiede?
5 Stimmen
Ich nehme an, seltsam war nicht der richtige Ausdruck. Ein Mutex unterstützt auch den Besitz und manchmal den Wiedereintritt. Dies ist in Windows der Fall. Darüber hinaus sind Semaphoren in Windows auf Event-Objekte implementiert, aber ich bin mir nicht sicher, welche praktischen Auswirkungen dies hat.
1 Stimmen
Ähnliche Diskussion in stackoverflow.com/questions/4039899/
1 Stimmen
Sie sind ein und dasselbe. Z.B. Hoare 1972 Monitore: Ein Strukturierungskonzept für Betriebssysteme "Offensichtlich benötigen wir für jeden Monitor eine boolesche Semaphore" rnutex "um sicherzustellen, dass sich die Körper der lokalen Prozeduren gegenseitig ausschließen. Die Semaphore wird auf 1 initialisiert; eine P(mutex) muss beim Eintritt in jede lokale Prozedur ausgeführt werden, und ein V(mutex) muss normalerweise beim Verlassen des Programms ausgeführt werden." Verschiedene Systeme, Sprachen, Bibliotheken usw. verwenden generische Begriffe mit spezieller Bedeutung. Ein Wort bedeutet das, worüber sich die Leute einig sind, was es bedeutet. (Wenn sie es schaffen.) Definieren Sie Ihre Begriffe und lassen Sie andere ihre definieren.
0 Stimmen
Dieses Video sagt mehr als tausend Worte: youtube.com/watch?v=DvF3AsTglUU
1 Stimmen
Übrigens, Sie sollten eine Antwort annehmen :) Es gibt so viele gute Antworten, die darauf warten, angenommen zu werden, aber ich würde sagen, dass die Antwort von @Benoit ziemlich gut ist.
4 Stimmen
@philipxy Gut verstecktes 'rn' anstelle von 'm'.
4 Stimmen
@Mooncrater Wow. Gutes Auge. Ich nehme an, es liegt an der OCR. (Ja, das ist sie.)
0 Stimmen
Sehen Sie sich dieses Vorlesungsvideo von MIT 6004 an. youtube.com/watch?v=TVkQ1VeRKt4
0 Stimmen
Ich sehe viele Antworten, die kopiert und eingefügt wurden von gauss.ececs.uc.edu/Courses/c3003/extra/
0 Stimmen
@MichaelFoukarakis: Bitte entfernen Sie Ihren Kommentar - binäre Semaphoren sind wirklich nicht das gleiche wie Mutex'es.
0 Stimmen
Falls jemand ein Video bevorzugt, schaut euch das an ( youtu.be/8wcuLCvMmF8 ) Video werden Sie ein klares Verständnis bekommen