Nebenläufigkeit (englisch concurrency) bedeutet: Mehrere Aufgaben existieren gleichzeitig, werden zeitlich überlappend ausgeführt und können sich in beliebiger Reihenfolge abwechseln. Anders als die Parallelität (mehrere Aufgaben wirklich gleichzeitig auf mehreren Kernen) ist Nebenläufigkeit eine strukturelle Eigenschaft: Sie funktioniert bereits auf einem einzelnen Prozessorkern, weil der Scheduler des Betriebssystems den Aufgaben abwechselnd Zeitanteile (Zeitscheiben) gibt.
Nebenläufig ist nicht parallel
Ein Webserver, der Tausende Verbindungen auf einem einzigen Kern bedient, ist nebenläufig, aber nicht parallel. Derselbe Server auf einem Multikern-Prozessor ist zusätzlich parallel, weil die Aufgaben auf mehrere Kerne verteilt werden. Merksatz: Nebenläufigkeit handelt vom Umgang mit vielen Aufgaben (Struktur), Parallelität vom gleichzeitigen Ausführen (Ausführung).
Techniken und Risiken
- Threads und Prozesse: Ein Thread teilt sich den Speicher mit seinen Geschwistern, ein Prozess hat einen eigenen Speicherbereich — geteilter Zustand ist die häufigste Fehlerquelle nebenläufiger Programme.
- Synchronisation: Locks, Semaphore, atomare Operationen und Message Passing ordnen die Zugriffe auf gemeinsame Ressourcen.
- Asynchrone Modelle: Event-Loops und Coroutinen (z. B. asyncio, Go-Goroutinen, Node.js) erreichen Nebenläufigkeit ohne Threads.
- Gefahren: Ohne Synchronisation entstehen Race Conditions, Verklemmungen (Deadlocks) oder „verhungernde“ Aufgaben.
Während Nebenläufigkeit die Struktur beschreibt, beantwortet das Gustafsonsche Gesetz die Frage, wie stark parallele Arbeit skaliert, und Hyper-Threading ist eine Hardware-Technik, die logische Prozessoren nebenläufig nutzt.
Verwandte Grundlagen: Thread, Prozess, Multikern-Prozessor.