3.2.9 Threads

Threads haben sehr viel Ähnlichkeit mit Prozessen. Zunächst die Definition:


Definition: Thread (Leichtgewichtiger Prozess)

Definition

Unter einem Thread oder Leichtgewichtigen Prozess versteht man einen Teil eines Prozesses, der einen unabhängigen Kontrollfluss repräsentiert.

Ein Prozess kann aus mehreren Threads bestehen, somit ergeben sich mehrere voneinander unabhängige, nebenläufige Kontrollflüsse. Vereinfachend kann man sich vorstellen, dass ein Thread so etwas wie "ein Prozess in einem Prozess" ist. Bei mehreren Threads innerhalb eines Prozesses hat man somit "mehrere Prozesse innerhalb eines Prozesses". Jedoch gibt es unterschiedliche Verfahrensweisen bei der Nutzung von Betriebsmitteln, was weiter unten auf dieser Seite noch erläutert wird.


Beispiel

Man betrachte zunächst ein einfaches Beispiel für einen Prozess mit mehreren Threads:

Beispiel

Ein Textverarbeitungsprogramm wird gestartet. Somit existiert auf dem Computersystem ein Textverarbeitungs-Prozess. Dieser Prozess startet intern mehrere Threads, die jeweils bestimmte Aufgaben übernehmen:

  • Thread 1:
    realisiert den Texteditor. Er reagiert also auf Eingaben des Users mit Tastatur oder Maus.
  • Thread 2:
    realisiert eine "Alle 10 Minuten automatisch im Hintergrund speichern"-Funktion. D.h. dieser Thread wartet 10 Minuten, speichert dann den aktuellen Inhalt des Texteditors in einer (temporären) Datei auf der Festplatte, wartet wieder 10 Minuten, speichert wieder... usw.
  • Thread 3:
    realisiert die automatische Rechtschreibprüfung. D.h. in kleinen zeitlichen Abständen werden eingegebene Wörter geprüft und ggf. rot unterstrichen.

Das Thread-Konzept wird heute von den meisten relevanten Betriebssystemen unterstützt. Threads können deshalb auf Kernel-Ebene realisiert sein. Falls das Betriebssystem keine Threads unterstützt, so können Threads immer noch auf User-Ebene realisiert werden. Denkbar sind auch Mischformen: Das Betriebssystem unterstützt Threads auf Kernel-Ebene und zusätzlich ist das Thread-Konzept noch auf User-Ebene implementiert.


Threads auf Kernel-Ebene

Unterstützt das Betriebssystem Threads, so kann auch das Betriebssystem deren Verwaltung übernehmen. Dies geschieht sehr ähnlich zur Verwaltung von Prozessen, beispielsweise existiert i.d.R. ein Threadkontrollblock (Thread Control Block, TCB), analog zum Prozesskontrollblock.


Threads auf User-Ebene

Unterstützt das Betriebssystem keine Threads, so kann auf der User-Ebene ein spezielles Programm (Mandl 2013 nennt dies in Kapitel 4.2.2 die Threadbibliothek) deren Bereitstellung übernehmen. Ein Beispiel dafür ist die Java-Laufzeitumgebung (Java Runtime Environment, kurz JRE), welche eine eigene Threadverwaltung implementiert, und somit auch Threads auf Nicht-Thread-unterstützenden Betriebssystemen ermöglicht.


Beispiel einer Mischform

Wird die Java-Laufzeitumgebung auf einem Betriebssystem installiert, welches bereits Threads unterstützt, so können Threads sowohl auf Kernel-Ebene (also vom Betriebssystem) verwaltet werden, als auch auf User-Ebene (also von der JRE).


Hinweis

Bei Systemen ohne jegliche Thread-Unterstützung

Angenommen, du hast es mit einem System zu tun, welches gar keine Threads unterstützt, also weder auf Kernel-Ebene, noch auf User-Ebene. Dann ist ein Prozess praktisch gleichzusetzen mit einem Thread.

Der Prozess ist in diesem Fall ein Thread, und der Thread ist ein Prozess!


Hinweis

Wenn ein Prozess nur einen Thread besitzt

Angenommen, dein System unterstützt Threads, aber der betrachtete Prozess besteht nur aus einem einzelnen Thread. Dann ist dieser betrachtete Prozess praktisch gleichzusetzen mit seinem Thread.

Falls du bereits einmal eine Anwendung programmiert hast, dabei von dir aber nicht ausdrücklich mehrere Threads implementiert wurden, so bestand deine Anwendung nach dem Start nur aus einem einzelnen Thread.

Falls du bislang vielleicht noch gar nichts über Threads wusstest, so haben deine selbstprogrammierten Anwendungen vermutlich immer nur aus einem einzigen Thread bestanden.


Weiterhin nur eine CPU

Es sei nochmals verwiesen auf die Ausführungen im Kapitel Nur ein Prozessor mit einem Kern. Damit wurde bereits deutlich, dass immer nur ein Prozess zur Zeit auf der CPU ausgeführt werden kann. Besteht dieser Prozess nun aus mehreren Threads, so ist klar, dass davon nur ein einziger Thread aktiv auf der CPU ausgeführt werden kann. Die Threads eines Prozesses müssen sich auf der CPU also ebenso abwechseln, wie die verschiedenen Prozesse.

In Bezug auf Prozesse wurde bereits der Begriff Kontextwechsel erläutert. Analog lässt sich der Begriff Thread-Kontextwechsel definieren:


Definition: Thread-Kontextwechsel

Definition

Unter einem Thread-Kontextwechsel auf der CPU versteht man alle erforderlichen Tätigkeiten, um einen gerade auf der CPU aktiven Thread A, durch einen anderen Thread B zu ersetzen.

Dabei kann stillschweigend davon ausgegangen werden, dass beide Threads demselben Prozess zugeordnet sind, denn falls die Threads A und B unterschiedlichen Prozessen zugeordnet wären, so handelt es sich offensichtlich um einen (Prozess-) Kontextwechsel.


Vorteile von Threads

  • Ein Thread-Kontextwechsel ist einfacher, und damit schneller durchführbar, als ein Prozess-Kontextwechsel.
  • Alle Threads eines Prozesses haben Zugriff auf alle Betriebsmittel, welche diesem Prozess zugeordnet sind. (Dies ist gleichzeitig ein Vor- und ein Nachteil!)
  • Der Anwendungsprogrammierer kann die Funktionalität der Gesamtanwendung in unterschiedliche Threads aufteilen, welche jeder für sich einfacher zu implementieren ist. (Ein Beispiel für die in der Informatik gerne verwendete Teile-und-herrsche-Strategie.)


Nachteile von Threads

  • Alle Threads eines Prozesses haben Zugriff auf alle Betriebsmittel, welche diesem Prozess zugeordnet sind. (Dies ist gleichzeitig ein Vor- und ein Nachteil!)
  • Anwendungsprogrammierer müssen über spezielle Kenntnisse bei der Programmierung von Threads verfügen. (Andernfalls kann es zu unerwünschten Nebeneffekten kommen.)


Aufgabe 1

Aufgabe

Warum benötigt ein Thread-Kontextwechsel weniger Zeit als ein Prozess-Kontextwechsel? Erläutere!


Aufgabe 2

Aufgabe

Warum ist die Zugriffsmöglichkeit auf alle Betriebsmittel eines Prozesses durch die verschiedenen Threads dieses Prozesses gleichzeitig ein Vor- und ein Nachteil? Erläutere!


Aufgabe 3

Aufgabe

Da der Begriff Kontextwechsel sich sowohl auf Prozesse, wie auch auf Threads beziehen lässt, stellt sich hier die Frage, ob Zustände analog für Prozesse (siehe Prozesszustände) und für Threads definiert werden können?

Achte beim Durcharbeiten der folgenden beiden Kapitel mal darauf!


Aufgabe 4

Aufgabe

Bei den Nachteilen von Threads ist von "unerwünschten Nebeneffekten" die Rede. Überlege, recherchiere und diskutiere in deiner Lerngruppe: Finde zwei mögliche negative Effekte, die auftreten können, wenn ein Prozess aus mehreren Threads besteht!


Alternative Webquelle zum Thema



Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png