Nebenläufigkeit
Nebenläufigkeit
Nebenläufigkeit bedeutet, dass mehrere Abläufe logisch gleichzeitig Fortschritt machen. Sie müssen nicht zwingend exakt zur selben Zeit auf mehreren CPUs laufen.
Parallelität bedeutet, dass mehrere Abläufe tatsächlich gleichzeitig ausgeführt werden, zum Beispiel auf mehreren CPU-Kernen.
Nebenläufigkeit vs. Parallelität
| Begriff | Bedeutung |
|---|---|
| Nebenläufigkeit | Mehrere Aufgaben wechseln sich ab oder laufen überlappend. |
| Parallelität | Mehrere Aufgaben laufen wirklich gleichzeitig. |
Ein Single-Core-System kann nebenläufig sein. Ein Multi-Core-System kann zusätzlich parallel arbeiten.
Datenparallelität und Aufgabenparallelität
| Art | Beschreibung |
|---|---|
| Datenparallelität | Gleiche Operation auf mehreren Datenbereichen. |
| Aufgabenparallelität | Unterschiedliche Aufgaben laufen gleichzeitig oder überlappend. |
Mehr Threads bedeuten aber nicht automatisch mehr Geschwindigkeit. Nach Amdahl's Law begrenzt der nicht parallelisierbare Teil eines Programms den maximalen Speedup.
Race Conditions
Eine Race Condition entsteht, wenn das Ergebnis eines Programms von der zeitlichen Reihenfolge nebenläufiger Zugriffe abhängt.
Typisches Beispiel:
- Thread A liest einen Wert.
- Thread B liest denselben Wert.
- Thread A schreibt einen neuen Wert.
- Thread B schreibt seinen neuen Wert.
Ein Update geht verloren, obwohl beide Threads scheinbar korrekt arbeiten.
Kritischer Abschnitt
Ein kritischer Abschnitt ist ein Codebereich, in dem gemeinsam genutzte Daten verändert werden.
Ziel:
- maximal ein Thread im kritischen Abschnitt
- keine verlorenen Updates
- keine inkonsistenten Daten
- keine endlosen Wartezustände
Mutex
Ein Mutex funktioniert wie ein einzelner Schlüssel zu einem Raum.
- Wer den Schlüssel hat, darf hinein.
- Alle anderen müssen warten.
- Beim Verlassen wird der Schlüssel wieder freigegeben.
Mutexe schützen kritische Abschnitte, können aber bei falscher Nutzung zu Deadlocks führen.
Semaphore
Eine Semaphore ist wie eine Ampel oder ein Türsteher mit begrenzter Kapazität.
Sie erlaubt nicht nur einen einzigen Zugriff, sondern eine definierte Anzahl gleichzeitiger Zugriffe.
Beispiel: Maximal drei Threads dürfen eine Ressource gleichzeitig verwenden.
Petersons Algorithmus
Petersons Algorithmus ist ein klassisches Verfahren, um kritische Abschnitte zwischen zwei Prozessen ohne spezielle Hardware-Instruktionen zu koordinieren.
Er ist vor allem didaktisch wichtig, weil er zeigt:
- gegenseitiger Ausschluss ist möglich
- Reihenfolge und Absicht müssen sichtbar gemacht werden
- Synchronisation ist anspruchsvoll
Starvation
Starvation bedeutet, dass ein Prozess oder Thread dauerhaft keine Ressource bekommt.
Ursachen:
- schlechte Prioritätsvergabe
- unfairer Scheduler
- dauerhaft bevorzugte andere Prozesse
- ungünstige Sperrlogik
Gegenmaßnahmen:
- faire Scheduling-Verfahren
- Aging
- klare Zeitlimits
- saubere Prioritätsregeln
Deadlocks
Ein Deadlock entsteht, wenn mehrere Prozesse gegenseitig auf Ressourcen warten und keiner weitermachen kann.
Beispiel:
- Prozess A hält Ressource 1 und wartet auf Ressource 2.
- Prozess B hält Ressource 2 und wartet auf Ressource 1.
Typische Gegenmaßnahmen:
- feste Reihenfolge beim Sperren von Ressourcen
- Timeouts
- Deadlock-Erkennung
- Deadlock-Vermeidung
- Ressourcenfreigabe bei Fehlern
Klassische Synchronisationsprobleme
In Betriebssystemen werden häufig klassische Denkmodelle verwendet:
- Sleeping Barber
- Dining Philosophers
- Producer-Consumer
- Cigarette Smokers
- Readers-Writers
Diese Beispiele zeigen, wie leicht Nebenläufigkeit zu Warteproblemen, Race Conditions oder Deadlocks führen kann.
Merksatz
Nebenläufigkeit macht Systeme leistungsfähiger, aber auch schwieriger. Sicherheit entsteht durch klare Sperren, faire Planung und kontrollierten Zugriff auf gemeinsame Daten.
Zuletzt aktualisiert: 6. Juni 2026