Kritische Abschnitte, race condition und Semaphore

Kritische Abschnitte

Möchten zwei unabhängige Programme oder Prozesse auf gemeinsame Daten zugreifen, tritt eine Konkurrenzsituation auf. Dies kann zu einer Kollision führen. Codesegmente, die auf gemeinsame Datenbereiche zugreifen und anfällig für Kollisionen sind, nennt man Kritische Abschnitte.

race condition

Die Fehlerursache „race conditions“ tritt häufig in schlecht programmierter Software auf, speziell dann wenn mehrere parallel laufende Prozesse ausgeführt werden. „race conditions“ bedeutet so viel wie Wettlaufsituation. Zwei Prozesse versuchen, die Systemantwort jeweils zuerst zu beeinflussen.

Semaphore

„Ein Semaphor ist eine Datenstruktur mit einer Initialisierungsoperation und zwei Nutzungsoperationen. Die Datenstruktur besteht aus einem Zähler und einer Warteschlange für die Aufnahme blockierter Prozesse.“
Quelle: https://de.wikipedia.org/wiki/Semaphor_%28Informatik%29#L.C3.B6sung_von_Dijkstra
Das Konzept stammt von Dijkstra und wurde im Jahre 1965 vorgestellt. Semaphore dienen als Lösungskonzept für das Problem des Kritischen Abschnitts. Dadurch sollen „race conditions“ vermieden werden.

Es gibt zwei elementare Operationen

Zu Beginn wird meist eine Variable (Zähler) vom Typ Integer initialisiert, die die maximale Zahl der Prozesse angibt, welche gleichzeitig eine Ressource nutzen können. Möchte ein Prozess auf die Ressource zugreifen, ruft er die Operation P(S): „Passieren“ auf. Falls sich bereits ein Prozess im Kritischen Abschnitt befindet, wird der aufrufende Prozess in die Warteschlange versetzt. Es dürfen sich nämlich nicht 2 Prozesse zur gleichen Zeit in ihren Kritischen Abschnitten befinden. (mutual exclusion = Wechselseitiger Ausschluss)
Wenn nicht wird der Zähler um 1 heruntergezählt.

Benötigt der Prozess die Ressource nicht mehr, ruft er die Operation V(S): „Verlassen“ auf. In diesem Fall wird der Zähler um 1 hochgezählt, um den anderen Prozessen den Zugriff auf den Kritischen Bereich zu gestatten. Grundsätzlich darf der Zähler nicht < 0 fallen. Es gibt binäre Semaphore und Allgemeine Semaphore. Binäre Semaphore können nur zwei verschiedene Werte annehmen. 0 für einen belegten Kritischen Codebereich, 1 gewährt den Eintritt. Allgemeine Semaphore können beliebig viele Werte annehmen.