Semaphor gegen Mutex
Semaphore ist eine Datenstruktur, die verwendet wird, um sicherzustellen, dass mehrere Prozesse in parallelen Programmierumgebungen nicht gleichzeitig auf eine gemeinsame Ressource oder einen kritischen Abschnitt zugreifen. Semaphore werden verwendet, um Deadlocks und Race-Conditions zu vermeiden. Mutex (Mutual Exclusion Object) wird auch verwendet, um den gleichzeitigen Zugriff mehrerer gleichzeitig ablaufender Prozesse auf eine gemeinsame Ressource zu vermeiden.
Was ist ein Semaphor?
Semaphore ist eine Datenstruktur, die verwendet wird, um kritische Abschnitte gegenseitig auszuschließen. Semaphoren unterstützen hauptsächlich zwei Operationen namens Warten (historisch bekannt als P) und Signal (historisch bekannt als V). Die Warteoperation blockiert einen Prozess, bis das Semaphor geöffnet ist, und die Signaloperation erlaubt einem anderen Prozess (Thread) den Eintritt. Jedem Semaphor ist eine Warteschlange wartender Prozesse zugeordnet. Wenn die Warteoperation von einem Thread aufgerufen wird, kann der Thread fortfahren, wenn das Semaphor geöffnet ist. Wenn die Semaphore geschlossen wird, wenn die Wait-Operation von einem Thread aufgerufen wird, wird der Thread blockiert und muss in der Warteschlange warten. Die Signaloperation öffnet ein Semaphor, und wenn bereits ein Thread in der Warteschlange wartet, darf dieser Prozess fortfahren, und wenn keine Threads in der Warteschlange warten, wird das Signal für die nächsten Threads gespeichert. Es gibt zwei Arten von Semaphoren, die Mutex-Semaphore und Zählsemaphore genannt werden. Mutex-Semaphore ermöglichen einen einzelnen Zugriff auf eine Ressource und Zählsemaphore ermöglichen mehreren Threads den Zugriff auf eine Ressource (die mehrere verfügbare Einheiten hat).
Was ist ein Mutex?
Wenn eine Computeranwendung gestartet wird, erstellt sie einen Mutex und hängt ihn an eine Ressource an. Wenn die Ressource von einem Thread verwendet wird, wird sie gesperrt und andere Threads können sie nicht verwenden. Wenn ein anderer Thread dieselbe Ressource verwenden möchte, muss er eine Anfrage stellen. Dann wird dieser Thread in eine Warteschlange gestellt, bis der erste Thread mit der Ressource fertig ist. Wenn der erste Thread mit der Ressource fertig ist, wird die Sperre entfernt und der Thread, der in der Warteschlange wartet, kann Zugriff auf die Ressource erh alten. Wenn mehrere Threads in der Warteschlange warten, erh alten sie abwechselnd Zugriff. Wenn der Mutex den Zugriff auf eine Ressource zwischen mehreren Threads wechselt, ist dies in der Praxis sichtbar, da mehrere Threads gleichzeitig eine Ressource verbrauchen. Aber intern greift immer nur ein einzelner Thread auf die Ressource zu.
Was ist der Unterschied zwischen Semaphor und Mutex?
Obwohl sowohl Semaphore als auch Mutex-Objekte verwendet werden, um einen gegenseitigen Ausschluss in parallelen Programmierumgebungen zu erreichen, weisen sie einige Unterschiede auf. Ein Mutex-Objekt erlaubt nur einem einzelnen Thread, eine Ressource oder einen kritischen Abschnitt zu verbrauchen, während Semaphoren eine begrenzte Anzahl gleichzeitiger Zugriffe auf eine Ressource (unter einer maximal zulässigen Anzahl) zulassen. Bei Mutex-Objekten müssen andere Threads, die auf die Ressource zugreifen wollen, in einer Warteschlange warten, bis der aktuelle Thread die Nutzung der Ressource beendet hat.