- Critical Section
-
Als Kritischer Abschnitt wird in der Informatik ein Abschnitt im Programm eines Prozesses/Threads bezeichnet, in dem Betriebsmittel (z. B. Datenstrukturen, Verbindungen, Geräte usw.) verändert werden und der nicht parallel oder zeitlich verzahnt zu Programmabschnitten anderer Prozesse/Threads ausgeführt werden darf, in denen die gleichen Betriebsmittel ebenfalls verändert werden. Andernfalls kommt es zu inkonsistenten Zuständen der Betriebsmittel.
Beispiel
Folgende einfache Ausführungssituation mit einem Programmabschnitt, in dem in einer Variablen zähler etwas gezählt wird, soll veranschaulichen, was einen Programmabschnitt zu einem kritischen Abschnitt macht. Die Veränderung des Variableninhalts kann nicht direkt auf der Variablen ausgeführt werden, sondern muss lokal in dem ausführenden Thread erfolgen. Der Programmabschnitt lautet:
zähler in lokale Variable lesen lokale Variable um 1 erhöhen lokale Variable in zähler schreiben
Nun werde dieser Programmabschnitt von zwei Threads zeitlich verschränkt ausgeführt. Die zeitliche Verschränkung wird vom Laufzeitsystem/Betriebssystem vorgenommen. Die Threads haben darauf keinen Einfluss. Beide Threads greifen dann unabhängig voneinander auf die Zählvariable zu, verarbeiten und verändern sie:
Thread A Thread B 1: zähler lesen 2: zähler lesen 3: um 1 erhöhen 4: um 1 erhöhen 5: zähler schreiben 6: zähler schreiben
Vor dem Schritt 3 wird von beiden Threads der gleiche ursprüngliche Wert der Variablen zähler gelesen. Die Threads haben diesen Wert als private Kopie. In den Schritten 3 und 4 addieren beide Threads jeweils 1 zu ihrer privaten Kopie. In den Schritten 5 und 6 speichern die Threads dann den neuen Wert aus ihren privaten Kopien zurück in die Variable zähler. Dabei „gewinnt“ Thread B, da seine Schreibaktion zuletzt ausgeführt wird. Eine solche Situation wird auch eine Wettlaufsituation (engl. race condition) genannt.
Der Programmabschnitt wird zweimal ausgeführt. Erwartet wird daher, dass der Wert von zähler um 2 erhöht wird. Die zweimalige Ausführung erfolgt zeitlich verschränkt. Es wird jedoch nur die Veränderung durch den Thread B sichtbar. Trotz zweimaliger Ausführung des Programmabschnitts wird zähler nur um 1 erhöht. Wird der Programmabschnitt hingegen zweimal zeitlich hintereinander ausgeführt, so ergibt sich das erwartete Ergebnis. Die Abhängigkeit des Ergebnisses einer mehrfachen Ausführung des Programmabschnitts von der Art der zeitlichen Ausführung ist nicht erwünscht.
Merkmal und Behandlung kritischer Abschnitte
Werden Prozesse oder Threads parallel oder zeitlich verzahnt ausgeführt und benutzen sie Daten (Speicherbereiche) oder allgemein Betriebsmittel (z. B. Verbindungen, Geräte) gemeinsam, so gibt es Betriebsmittel, die ihrer Natur nach nur exklusiv benutzt werden sollten: während der Ausführung eines Programmabschnitts von einem Prozess/Thread, in dem das Betriebsmittel verändernd verwendet wird, darf das Betriebsmittel für andere Prozesse/Threads nicht zugreifbar sein. Ein Programmabschnitt im Programm eines Prozesses/Threads, in dem auf ein gemeinsam genutztes, aber exklusiv zu nutzendes Betriebsmittel zugegriffen wird, ist ein kritischer Abschnitt.
Es gilt, eine zeitlich verschränkte Ausführung kritischer Abschnitte paralleler Prozesse/Threads zu verhindern, da diese zu unvorhersagbaren Ergebnissen oder inkonsistenten Zuständen der Betriebsmittel führt. Es ist aber nicht erforderlich, eine strenge Reihenfolge der Nutzung des Betriebsmittels festzulegen. Es ist ausreichend, für einen wechselseitigen Ausschluss der Zugriffe zu sorgen. Wenn sich ein Prozess/Thread in seinem kritischen Abschnitt bezüglich eines Betriebsmittels befindet, darf kein anderer Prozess/Thread in seinen kritischen Abschnitt bezüglich des gleichen Betriebsmittels gelangen. Dies wird durch eine beliebige Sequentialisierung der Ausführung kritischer Abschnitte der zugreifenden Prozesse/Threads erreicht. Dies ist eine schwächere Anforderung als die Anforderung nach Ununterbrechbarkeit der Ausführung eines kritischen Abschnitts, die oftmals im Zusammenhang mit kritischen Abschnitten erwähnt wird. Wird ein kritischer Abschnitt ausgeführt, so darf dieser nur nicht zugunsten der Ausführung des kritischen Abschnitts (bezüglich des gleichen, gemeinsam genutzten Betriebsmittels) eines anderen Prozesses unterbrochen werden.
An eine Lösung für das Problem des wechselseitigen Ausschlusses zum Umgang mit kritischen Abschnitten werden folgende Anforderungen gestellt:
- Zu jedem Zeitpunkt befindet sich höchstens ein Prozess/Thread in einem kritischen Abschnitt.
- Eine Beendigung oder ein Anhalten eines Prozesses außerhalb seines kritischen Abschnitts darf keinen Einfluss auf den Fortschritt der verbleibenden Prozesse haben.
- Kein Prozess/Thread darf beliebig lange vom Betreten seines kritischen Abschnitts ausgeschlossen werden.
- Die Lösung darf keine Annahme über die Ausführungsgeschwindigkeit der Prozesse/Threads machen.
Sind diese Anforderungen erfüllt, dann ist die Konsistenz der Betriebsmittel gewährleistet. Ferner kommt jeder Prozess/Thread in endlicher Zeit in seinen kritische Abschnitt und wird nicht grundsätzlich am Eintritt in seinen kritischen Abschnitt gehindert.
Siehe auch
Wikimedia Foundation.