Sie sind PAS die gleiche Sache. Sie werden für unterschiedliche Zwecke verwendet!
Obwohl beide Arten von Semaphoren einen Voll/Leer-Zustand haben und dieselbe API verwenden, ist ihre Verwendung sehr unterschiedlich.
Semaphore mit gegenseitigem Ausschluss
Semaphore mit gegenseitigem Ausschluss werden verwendet, um gemeinsam genutzte Ressourcen (Datenstruktur, Datei usw.) zu schützen.
Eine Mutex-Semaphore gehört der Aufgabe, die sie übernimmt. Wenn Task B versucht, eine Mutex, die sich im Besitz von Task A befindet, zu semGive, gibt der Aufruf von Task B einen Fehler zurück und schlägt fehl.
Mutexe verwenden immer die folgende Reihenfolge:
- SemTake
- Critical Section
- SemGive
Hier ist ein einfaches Beispiel:
Thread A Thread B
Take Mutex
access data
... Take Mutex <== Will block
...
Give Mutex access data <== Unblocks
...
Give Mutex
Binäres Semaphor
Binary Semaphore behandelt eine ganz andere Frage:
- Aufgabe B ist in der Warteschleife und wartet auf ein Ereignis (z. B. die Auslösung eines Sensors).
- Der Sensor wird ausgelöst und eine Unterbrechungsdienstroutine läuft. Sie muss eine Aufgabe über die Auslösung informieren.
-
Task B sollte laufen und die entsprechenden Maßnahmen für die Sensorauslösung ergreifen. Dann kehrt sie zum Warten zurück.
Task A Task B
... Take BinSemaphore <== wait for something
Do Something Noteworthy
Give BinSemaphore do something <== unblocks
Bei einem binären Semaphor ist es in Ordnung, wenn B das Semaphor nimmt und A es gibt.
Auch hier gilt, dass ein binäres Semaphor eine Ressource NICHT vor dem Zugriff schützt. Der Akt des Gebens und Nehmens eines Semaphors ist grundsätzlich entkoppelt.
In der Regel macht es wenig Sinn, wenn ein und dieselbe Aufgabe ein Geben und ein Nehmen auf demselben binären Semaphor darstellt.
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