Informatik

Thread in der Informatik einfach erklärt

Thread in der Informatik einfach erklärt
Thread in der Informatik einfach erklärt
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Ein Thread ist ein Ausführungsstrang innerhalb eines laufenden Programms. Mehrere Threads eines Prozesses können verschiedene Aufgaben bearbeiten. Sie teilen wichtige Ressourcen, besitzen aber jeweils einen eigenen Ausführungszustand.

Auf dieser Seite lernst du, Threads von Prozessen zu unterscheiden, ihre Ausführung einzuordnen und Risiken beim gemeinsamen Datenzugriff zu erkennen.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Was ist ein Thread?

Stell dir eine Textverarbeitung vor: Während du schreibst, kann das Programm im Hintergrund speichern und die Rechtschreibung prüfen. Solche Teilaufgaben lassen sich verschiedenen Threads zuordnen.

Definition

Thread

Ein Thread ist eine sequenzielle Folge von Programmanweisungen innerhalb eines Prozesses. Er wird auch Ausführungsstrang oder Programmfaden genannt.

Ein Thread besitzt einen eigenen Ausführungszustand. Dazu gehören insbesondere:

  • ein eigener Befehlszeiger, der die nächste Anweisung bestimmt,
  • eigene Register für aktuell benötigte Werte,
  • ein eigener Stack für Funktionsaufrufe und lokale Daten.

Threads desselben Prozesses teilen dagegen typischerweise den Adressraum und weitere Prozessressourcen, zum Beispiel geöffnete Dateien oder Netzwerkverbindungen.

Merke

Eigener Ablauf, gemeinsame Umgebung: Jeder Thread hat seinen eigenen Ausführungszustand, arbeitet aber mit Ressourcen seines Prozesses.

Das Wort „Thread“ kann auch eine zusammengehörige Folge von Beiträgen in sozialen Medien oder Chats bezeichnen. Diese Bedeutung ist nicht technisch mit einem Programm-Thread gleichzusetzen.

Teste dich
Frage 1 von 1LeichtWelche Aussage beschreibt einen Programm-Thread richtig?
Lösung: Ein Thread ist ein Ausführungsstrang innerhalb eines Prozesses. — Ein Thread beschreibt einen Ablauf von Anweisungen. Speicher gehört zu seiner Arbeitsumgebung, ist aber nicht der Thread selbst.
Wie unterscheiden sich Thread und Prozess?

Ein Prozess ist eine laufende Instanz eines Programms. Ihm sind ein eigener Adressraum und weitere Betriebssystemressourcen zugeordnet. Ein Prozess enthält mindestens einen Thread und kann weitere Threads besitzen.

MerkmalProzessThread
RolleUmgebung eines laufenden ProgrammsAusführungsstrang innerhalb dieser Umgebung
Speicherbesitzt einen eigenen Adressraumteilt den Adressraum mit Threads desselben Prozesses
Ausführungszustandumfasst einen oder mehrere Threadsbesitzt unter anderem eigenen Befehlszeiger, Register und Stack
Abschirmunggegenüber anderen Prozessen stärker isoliertgegenüber Threads desselben Prozesses nicht durch getrennten Adressraum isoliert
Datenaustauschbenötigt eine Verbindung zwischen getrennten Prozessräumenkann gemeinsamen Speicher direkt verwenden

Weil Threads gemeinsame Ressourcen verwenden, ist ihre Verwaltung meist weniger aufwendig als die getrennter Prozesse. Der Vorteil hat jedoch eine Kehrseite: Ein fehlerhafter Thread kann gemeinsam genutzte Daten des ganzen Prozesses beschädigen.

Beispiel

Ein Browser kann als Prozess laufen und mehrere Aufgaben in Threads bearbeiten. Ein Thread verarbeitet eine Eingabe, während ein anderer Daten lädt. Beide gehören zum selben Prozess und können dessen Ressourcen nutzen.

Wären die Aufgaben vollständig getrennte Prozesse, wären sie stärker voneinander abgeschirmt. Der Datenaustausch wäre dafür aufwendiger.

Teste dich
Frage 1 von 1MittelZwei Ausführungsstränge sollen häufig dieselben Programmdaten verwenden. Was spricht für Threads im selben Prozess?
Lösung: Sie können über den gemeinsamen Adressraum unmittelbar auf gemeinsame Daten zugreifen. — Der gemeinsame Speicher erleichtert den Austausch. Er macht aber eine sorgfältige Koordination nötig.
Welche Zustände kann ein Thread haben?

Das Betriebssystem kann nicht jeden rechenbereiten Thread jederzeit ausführen. Es verwaltet deshalb verschiedene Zustände.

ZustandBedeutung
aktivDer Thread führt gerade Anweisungen auf einem Prozessor aus.
bereitDer Thread könnte weiterarbeiten, wartet aber auf die Zuteilung von Prozessorzeit.
blockiertDer Thread wartet auf ein Ereignis, zum Beispiel auf das Ende einer Ein- oder Ausgabe.
inaktivDer Thread wird eingerichtet, ist beendet oder kann entfernt beziehungsweise wiederverwendet werden.

Ein Scheduler ist der Teil des Systems, der entscheidet, welcher bereite Thread Prozessorzeit erhält. Die genaue Reihenfolge kann sich zwischen zwei Programmläufen unterscheiden.

Beispiel

Ein Thread fordert Daten von einem Laufwerk an. Solange die Daten noch nicht verfügbar sind, ist er blockiert. Ein anderer bereiter Thread kann in dieser Zeit ausgeführt werden. Treffen die Daten ein, kann der wartende Thread wieder bereit werden.

Teste dich
Frage 1 von 1LeichtEin Thread wartet auf den Abschluss einer Ein-/Ausgabe. In welchem Zustand befindet er sich?
Lösung: blockiert — Solange das notwendige Ereignis fehlt, kann der Thread seine nächsten Anweisungen nicht ausführen und bleibt blockiert.
Laufen mehrere Threads wirklich gleichzeitig?

Mehrere Threads können nebenläufig sein: Ihre Ausführungen überschneiden sich zeitlich. Das bedeutet nicht automatisch, dass ihre Anweisungen im selben Augenblick verarbeitet werden.

Auf einem einzelnen Prozessorkern kann der Scheduler schnell zwischen Threads wechseln. Die Ausführung ist dann zeitlich verschachtelt. Auf mehreren verfügbaren Kernen können verschiedene Threads tatsächlich gleichzeitig und damit parallel ausgeführt werden.

Definition

Nebenläufigkeit und Parallelität

Nebenläufigkeit bedeutet, dass mehrere Aufgaben in überlappenden Zeiträumen bearbeitet werden. Parallelität bedeutet, dass mindestens zwei Aufgaben im selben Zeitraum tatsächlich gleichzeitig ausgeführt werden.

Merke

Parallel ausgeführte Threads sind nebenläufig. Nebenläufige Threads müssen aber nicht parallel laufen.

Threads können eine Anwendung reaktionsfähiger machen und geeignete Aufgaben auf mehrere Kerne verteilen. Sie garantieren jedoch keinen Geschwindigkeitsgewinn. Zusätzliche Threads verursachen Verwaltungs- und Koordinationsaufwand.

Teste dich
Frage 1 von 1MittelZwei Threads wechseln sich auf einem einzigen Prozessorkern ab. Welche Einordnung passt?
Lösung: Die Threads sind nebenläufig, aber nicht gleichzeitig parallel ausgeführt. — Der schnelle Wechsel erzeugt eine zeitlich verschachtelte Ausführung. Echte Parallelität setzt hier mehrere gleichzeitig arbeitende Ausführungseinheiten voraus.
Warum brauchen gemeinsame Daten Schutz?

Der Scheduler kann einen Thread zwischen einzelnen Arbeitsschritten unterbrechen. Greifen mehrere Threads ohne Abstimmung auf dieselben veränderlichen Daten zu, kann das Ergebnis deshalb von der zufälligen Reihenfolge ihrer Schritte abhängen.

Definition

Race Condition

Eine Race Condition ist eine Wettlaufsituation: Das Ergebnis hängt davon ab, in welcher Reihenfolge mehrere Threads auf gemeinsame Daten zugreifen oder sie verändern.

Beispiel

In einem Buchungssystem ist ein Sitz zunächst als „frei“ gespeichert.

  1. Thread A liest den Zustand „frei“.
  2. Bevor A die Reservierung speichert, liest auch Thread B den Zustand „frei“.
  3. Beide Threads halten eine Buchung für möglich.
  4. Beide speichern ihre Reservierung für denselben Sitz.

Jeder Thread hat für sich nachvollziehbar gehandelt. Zusammen erzeugen die verschachtelten Schritte aber einen falschen Zustand.

Der Teil, in dem der Sitz geprüft und reserviert wird, ist ein kritischer Abschnitt. Dort greift das Programm auf gemeinsam veränderliche Daten zu, ohne dass sich die zusammengehörigen Schritte gefahrlos überlappen dürfen.

Eine Synchronisation kann dafür sorgen, dass jeweils nur ein Thread diesen Abschnitt ausführt. Locks, Mutexe, Monitore oder Semaphore sind mögliche Mechanismen. Welcher Mechanismus passt, hängt von der Aufgabe ab.

Gut zu wissen

Synchronisation soll nicht einfach möglichst viel Programmcode sperren. Ein unnötig großer geschützter Bereich kann andere Threads lange aufhalten. Ein zu kleiner Bereich schützt dagegen möglicherweise nicht alle zusammengehörigen Schritte.

Auch die Synchronisation selbst kann Fehler verursachen. Bei einem Deadlock warten Threads dauerhaft auf Ressourcen, die von den jeweils anderen gehalten werden. Bei einem Livelock bleiben Threads aktiv und reagieren aufeinander, erzielen aber keinen Fortschritt.

Teste dich
Frage 1 von 2MittelWelche Maßnahme verhindert die doppelte Sitzvergabe im Beispiel am unmittelbarsten?
Lösung: Prüfung und Reservierung werden als zusammengehöriger kritischer Abschnitt geschützt. — Entscheidend ist, dass kein zweiter Thread zwischen Prüfung und Reservierung denselben Sitz als frei behandeln kann.
Frage 2 von 2SchwerEin Programm schützt jeden Datenzugriff, hält die Sperre aber auch während langer, unabhängiger Arbeiten. Welche Verbesserung ist sinnvoll?
Lösung: Den geschützten Bereich auf die zusammengehörigen Zugriffe auf gemeinsame Daten begrenzen. — Eine passende Granularität schützt den vollständigen kritischen Vorgang, ohne unabhängige Arbeit unnötig zu blockieren.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Thread
    • eigener Ausführungszustand: Befehlszeiger, Register, Stack
    • gemeinsame Prozessressourcen: Adressraum, Dateien, Verbindungen
    • Zustände: aktiv, bereit, blockiert, inaktiv
    • Ausführung: zeitlich verschachtelt oder auf mehreren Kernen parallel
    • Nutzen: Aufgaben zerlegen und Anwendung reaktionsfähig halten
    • Risiko: Race Condition bei ungeschützten gemeinsamen Daten
    • Schutz: kritische Abschnitte passend synchronisieren
Abschluss-Check

Prüfe nun, ob du die zentralen Entscheidungen selbst treffen kannst.

Teste dich
Frage 1 von 4LeichtWas gehört typischerweise zum eigenen Ausführungszustand eines Threads?
Lösung: sein Stack — Ein Thread besitzt unter anderem einen eigenen Stack, Befehlszeiger und Register. Viele andere Ressourcen gehören zum gemeinsamen Prozess.
Frage 2 von 4MittelEin Thread ist rechenbereit, erhält aber gerade keine Prozessorzeit. Welcher Zustand passt?
Lösung: bereit — Ein bereiter Thread kann weiterarbeiten, sobald der Scheduler ihm Prozessorzeit zuweist.
Frage 3 von 4SchwerZwei Threads bearbeiten verschiedene Dateien und verändern keine gemeinsamen Daten. Welche Aussage ist am besten begründet?
Lösung: Für diese Arbeit ist möglicherweise weniger Synchronisation nötig, weil kein gemeinsamer veränderlicher Datenbestand genannt ist. — Ob Synchronisation nötig ist, hängt von den tatsächlich gemeinsam genutzten Ressourcen und den zusammengehörigen Arbeitsschritten ab.
Frage 4 von 4SchwerEin Fehler tritt nur bei manchen Ablaufreihenfolgen auf, während mehrere Threads denselben Datensatz verändern. Was solltest du zuerst untersuchen?
Lösung: Ob ein kritischer Abschnitt unvollständig geschützt ist und dadurch eine Race Condition entsteht. — Die Abhängigkeit von der Ablaufreihenfolge ist ein starkes Zeichen für einen unkoordinierten Zugriff auf gemeinsame veränderliche Daten.

Du hast den Kern verstanden, wenn du bei einem Beispiel drei Fragen beantworten kannst: Was besitzt der Thread selbst? Was teilt er mit anderen Threads? Welche gemeinsamen Änderungen müssen als zusammengehöriger kritischer Abschnitt geschützt werden?

Passend dazu