Wikipedia · einfach zusammengefasst · Stand
Kritischer Abschnitt
Kritische Abschnitte bestehen aus mehreren Einzelanweisungen, deren Zwischenergebnisse inkonsistente Zustände darstellen, auf die die anderen Threads keinen …
Inhalt4 Abschnitte
Bedeutung kritischer Abschnitte
Ein kritischer Abschnitt ist in der Informatik eine Folge von Programmanweisungen zur Ablaufsteuerung. Zu einem Zeitpunkt darf sich darin nur ein Prozess oder Thread befinden. Dadurch werden gemeinsam genutzte Betriebsmittel geschützt, etwa Datenstrukturen, Speicherbereiche, Verbindungen, Geräte oder Datenbankinhalte.
Kritische Abschnitte enthalten mehrere Einzelanweisungen. Deren Zwischenergebnisse können inkonsistent sein und dürfen deshalb für andere Threads nicht zugänglich sein. Nach außen soll nur das gesamte Ergebnis als unteilbare Einheit sichtbar werden. Bei Datenbanken gehen diese Konzepte in die Transaktionsverarbeitung über.
Warum gleichzeitiger Zugriff problematisch ist
Sollen zwei Threads die gemeinsame Variable s inkrementieren, kann ein falsches Ergebnis entstehen, wenn ihre Anweisungen zeitlich verschränkt ausgeführt werden. Ein Inkrementieren besteht im einfachen Fall aus drei Schritten: den Wert von zaehler in eine lokale Variable lesen, die lokale Variable um 1 erhöhen und sie wieder in zaehler schreiben.
Führen Thread X und Thread Y diese Schritte verschränkt aus, lesen beide zunächst denselben ursprünglichen Wert. Beide erhöhen nur ihre private Kopie um 1. Schreiben anschließend beide ihren Wert zurück, überschreibt die letzte Schreibaktion die andere. Im beschriebenen Ablauf schreibt Thread Y zuletzt; das Endergebnis ist dann fälschlich 1 statt des erwarteten Ergebnisses.
Wird zusätzlich ein zweiter kritischer Abschnitt eingeführt, der dieselbe Variable zaehler dekrementiert, stehen beide Abschnitte in Beziehung zueinander. Aus Konsistenzgründen darf dann insgesamt höchstens ein Thread zugleich in einem dieser beiden kritischen Abschnitte sein.
Kennzeichnung im Programm
Programmier- und Modellierungssprachen verwenden gelegentlich Direktiven zur Markierung eines kritischen Abschnitts, zum Beispiel:
- Begin_CriticalSection und End_CriticalSection
- EnterCriticalSection() und LeaveCriticalSection()
Wechselseitiger Ausschluss und seine Anforderungen
Ein kritischer Abschnitt liegt vor, wenn ein Thread auf ein gemeinsam genutztes Betriebsmittel zugreift, das während einer verändernden Nutzung exklusiv verwendet werden muss. Zeitlich verschränkte Ausführungen solcher Abschnitte müssen verhindert werden, weil sie unvorhersagbare Ergebnisse oder inkonsistente Zustände verursachen können.
Erforderlich ist wechselseitiger Ausschluss: Befindet sich ein Thread in einem kritischen Abschnitt zu einem Betriebsmittel, darf kein anderer Thread einen kritischen Abschnitt zum selben Betriebsmittel betreten. Die kritischen Abschnitte werden dazu in beliebiger Reihenfolge nacheinander ausgeführt. Eine feste Reihenfolge ist nicht nötig.
Dies ist schwächer als die oft genannte vollständige Ununterbrechbarkeit: Der Abschnitt darf ausgeführt werden, solange er nicht zugunsten eines kritischen Abschnitts eines anderen Prozesses zum gleichen Betriebsmittel unterbrochen wird.
Eine Lösung muss vier Anforderungen erfüllen:
- Wechselseitiger Ausschluss: Höchstens ein Thread befindet sich zu jedem Zeitpunkt im kritischen Abschnitt zu einem Betriebsmittel.
- Fortschritt: Das Beenden oder Anhalten eines Prozesses außerhalb eines kritischen Abschnitts darf die übrigen Prozesse nicht aufhalten.
- Begrenzte Wartezeit: Kein Thread darf beliebig lange vom Eintritt ausgeschlossen werden.
- Es dürfen keine Annahmen über die Ausführungsgeschwindigkeit der Threads nötig sein.
Werden diese Anforderungen erfüllt, bleibt die Konsistenz der Betriebsmittel erhalten. Außerdem erreicht jeder Thread seinen kritischen Abschnitt in endlicher Zeit und wird nicht grundsätzlich am Eintritt gehindert.
Lernvideos zu Kritischer Abschnitt
25:36
L-3.4: Critical Section Problem | Mutual Exclusion, Progress and Bounded Waiting | Operating System
Gate Smashers · 1,7 Mio. Aufrufe
2:30
Operating systems - Critical sections
Alon Lalezari - אלון ללזרי · 276 Aufrufe
6:54
Race Conditions and How to Prevent Them - A Look at Dekker's Algorithm
Spanning Tree · 247.760 Aufrufe
3:49
Synchronisation mit Monitoren 1 (Version B)
Thomas Rau · 918 Aufrufe