Kritischer Abschnitt & Mutual Exclusion
Kritischer Abschnitt & Mutual Exclusion
Der kritische Abschnitt ist eine Code-Strecke, die nur von einem Prozess/Thread gleichzeitig durchlaufen werden darf. Das erfordert wechselseitigen Ausschluss (Mutual Exclusion) — beim Eintritt sind explizite Operationen nötig.
Worum es geht
Um Race Conditions zu vermeiden, müssen Abschnitte geschützt werden, in denen parallel auf gemeinsame Daten zugegriffen wird:
Kritischer Abschnitt/Pfad: Code-Strecke, die nur von einem Prozess/Thread gleichzeitig durchlaufen werden darf.
Ein kritischer Pfad erfordert mutual exclusion konkurrierender Prozesse:
- Jeweils nur ein Prozess kann im kritischen Abschnitt sein.
- Für den Eintritt sind explizite Operationen nötig.
Die typische Struktur
while (TRUE) {
/* ... unkritischer Code ... */
enter_critical(...); // Eintritt anfordern
/* ... kritischer Abschnitt ... */
leave_critical(...); // Austritt
/* ... unkritischer Code ... */
}
Die Frage ist nur: Wie implementiert man enter_critical() / leave_critical()? Genau das beantworten die Verfahren der Synchronisation.
Klassifikation der Verfahren
Synchronisationsverfahren unterscheiden sich nach:
- Zustand des Wartenden: aktiv (Schleife, spinning → Spinlocks) oder passiv (blockiert, sleeping → Semaphoren).
- Beteiligung des OS: mit oder ohne explizite OS-Unterstützung.
- Hardware-Unterstützung: manche nutzen spezielle atomare Befehle (z.B.
TestAndSet).
Verwandte Notes
Race Conditions · Spinlocks · Semaphoren · Deadlocks