In Linux sind Semaphoren ein Synchronisationsprimitive, der zur Steuerung des Zugriffs auf gemeinsam genutzte Ressourcen durch mehrere Prozesse oder Threads verwendet wird. Sie fungieren im Wesentlichen als Zähler, die inkrementiert werden können (unter Verwendung von `sem_post`) und dekrementiert (mit` sem_wait`). Diese Operationen sind atomar, dh sie sind ununterbrochen und garantieren Konsistenz.
Hier ist eine Aufschlüsselung ihrer wichtigsten Eigenschaften und ihrer Nutzung:
* Synchronisationsmechanismus: Semaphoren verhindern Rassenbedingungen, bei denen mehrere Prozesse, die versuchen, gleichzeitig auf dieselbe Ressource zuzugreifen und zu ändern, zu unvorhersehbaren und falschen Ergebnissen führen können. Sie erzwingen eine kontrollierte Zugriffsbestellung.
* Gegenwert: Ein Semaphor unterhält einen nicht negativen Ganzzahlwert. Dieser Wert repräsentiert die Anzahl der verfügbaren Ressourcen oder Genehmigungen.
* `sem_wait ()` (oder `sem_trywait ()`): Diese Operation verringert den Wert des Semaphors. Wenn der Wert größer als Null ist, ist er dekrementiert und der Prozess wird fortgesetzt. Wenn der Wert Null ist, wird die Prozessblöcke (warten), bis der Wert des Semaphors größer als Null wird (ein anderer Prozess erhöht ihn mit `sem_post`). `sem_trywait ()` ist eine nicht blockierende Version; Es gibt einen Fehler zurück, wenn der Semaphorwert Null ist.
* `sem_post ()`: Dieser Vorgang erhöht den Wert des Semaphors. Wenn ein Prozess auf dem Semaphor blockiert ist, wird einer der Warteverfahren geweckt.
* Typen: Linux bietet benannte und unbenannte Semaphoren.
* Unbenannte Semaphoren: Diese werden mit `sem_init ()` erstellt und sind nur innerhalb des Prozess- oder Threadgruppe zugänglich, in dem sie erstellt wurden. Sie werden normalerweise für die Synchronisation innerhalb eines einzelnen Prozesses verwendet.
* Semaphores namens: Diese werden mit `sem_open ()` erstellt und existieren im gemeinsamen Speicher des Systems. Sie können durch mehrere Prozesse zugegriffen werden, um die Inter-Process Communication (IPC) zu ermöglichen. Benannte Semaphoren werden durch einen eindeutigen Namen identifiziert.
* Binäre Semaphoren: Ein Semaphor mit einem Höchstwert von 1 wird oft als binäres Semaphor bezeichnet. Es wirkt wie eine Mutex -Sperre (gegenseitige Ausschließung), sodass nur ein Prozess gleichzeitig auf die gemeinsame Ressource zugreifen kann.
* Semaphoren zählen: Ein Semaphor mit einem Wert von mehr als 1 ist ein Zählsemaphor. Es kann mehrere Instanzen einer Ressource darstellen, sodass mehrere Prozesse gleichzeitig bis zum Wert des Semaphors auf die Ressource zugreifen können.
Beispiel (konzeptionell):
Stellen Sie sich einen von mehreren Prozessen geteilten Drucker vor. Ein Zählsemaphor könnte verwendet werden, um den Zugriff zu kontrollieren:
1. Initialisierung: Das Semaphor wird auf die Anzahl der Drucker initialisiert (z. B. 3).
2. Prozess 1 möchte drucken: Es nennt `sem_wait ()`. Der Semaphorwert wird verringert (3 wird 2), und der Prozess wird drucken.
3. Prozess 2 möchte drucken: Es nennt `sem_wait ()`. Der Semaphorwert wird verringert (2 wird 1), und der Prozess wird drucken.
4. Prozess 3 möchte drucken: Es nennt `sem_wait ()`. Der Semaphorwert wird verringert (1 wird 0), und der Prozess wird drucken.
5. Prozess 4 möchte drucken: Es nennt `sem_wait ()`. Der Semaphorwert beträgt 0, sodass der Prozessblöcke blockiert, bis ein Drucker verfügbar ist.
6. Prozess 1 Fertigstellung des Drucks: Es ruft `sem_post ()` auf. Der Semaphorwert wird inkrementiert (0 wird 1) und der Prozess 4 wird geweckt.
Schlüsselbibliotheken: In Linux werden normalerweise auf Semaphoren mit den in `` deklarierten POSIX -Semaphorfunktionen zugegriffen. Beachten Sie, dass die spezifische Implementierung möglicherweise zwischen verschiedenen UNIX-ähnlichen Systemen variieren könnte.