3.2.9 Threads

[gesichtete Version][gesichtete Version]
(LOOP2 Upgrade)
Zeile 7: Zeile 7:
== Definition: Thread (Leichtgewichtiger Prozess) ==
== Definition: Thread (Leichtgewichtiger Prozess) ==
<p>
<p>
<loop_index>Thread|Leichtgewichtiger Prozess</loop_index>
<loop_index id="5fa97882e451c">Thread|Leichtgewichtiger Prozess</loop_index>
<loop_area type="definition">
<loop_area type="definition">
<p>
<p>
Zeile 42: Zeile 42:
== Threads auf Kernel-Ebene ==
== Threads auf Kernel-Ebene ==
<p>
<p>
<loop_index>Threadkontrollblock|Thread Control Block|TCB|Thread, Kernel-Ebene</loop_index>
<loop_index id="5fa97882e452d">Threadkontrollblock|Thread Control Block|TCB|Thread, Kernel-Ebene</loop_index>
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 [[Verwalten_von_Prozessen#Definition:_Prozesskontrollblock|Prozesskontrollblock]].
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 [[Verwalten_von_Prozessen#Definition:_Prozesskontrollblock|Prozesskontrollblock]].
</p>
</p>
Zeile 49: Zeile 49:
== Threads auf User-Ebene ==
== Threads auf User-Ebene ==
<p>
<p>
<loop_index>Threadbibliothek|Thread, User-Ebene|Java-Laufzeitumgebung|Java Runtime Environment|JRE</loop_index>
<loop_index id="5fa97882e453c">Threadbibliothek|Thread, User-Ebene|Java-Laufzeitumgebung|Java Runtime Environment|JRE</loop_index>
Unterstützt das Betriebssystem keine Threads, so kann auf der User-Ebene ein spezielles Programm (<cite>Mandl+2013</cite> nennt dies in Kapitel 4.2.2 die ''Threadbibliothek'') deren Bereitstellung übernehmen. Ein Beispiel dafür ist die [http://de.wikipedia.org/wiki/Java-Laufzeitumgebung Java-Laufzeitumgebung (Java Runtime Environment, kurz JRE)], welche eine eigene Threadverwaltung implementiert, und somit auch Threads auf Nicht-Thread-unterstützenden Betriebssystemen ermöglicht.
Unterstützt das Betriebssystem keine Threads, so kann auf der User-Ebene ein spezielles Programm (<cite id="5fa97882e454b">Mandl+2013</cite> nennt dies in Kapitel 4.2.2 die ''Threadbibliothek'') deren Bereitstellung übernehmen. Ein Beispiel dafür ist die [http://de.wikipedia.org/wiki/Java-Laufzeitumgebung Java-Laufzeitumgebung (Java Runtime Environment, kurz JRE)], welche eine eigene Threadverwaltung implementiert, und somit auch Threads auf Nicht-Thread-unterstützenden Betriebssystemen ermöglicht.
</p>
</p>


Zeile 56: Zeile 56:
== Beispiel einer Mischform ==
== Beispiel einer Mischform ==
<p>
<p>
<loop_index>Thread, Mischform</loop_index>
<loop_index id="5fa97882e4558">Thread, Mischform</loop_index>
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).
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).
</p>
</p>
Zeile 96: Zeile 96:


<p>
<p>
<loop_index>Kontextwechsel|CPU, Kontextwechsel|Thread-Kontextwechsel|Kontextwechsel, Thread</loop_index>
<loop_index id="5fa97882e4567">Kontextwechsel|CPU, Kontextwechsel|Thread-Kontextwechsel|Kontextwechsel, Thread</loop_index>
In Bezug auf Prozesse wurde bereits der Begriff [[Vom_Batch-Job_zum_Multitasking#Definition:_Kontextwechsel|Kontextwechsel]] erläutert. Analog lässt sich der Begriff Thread-Kontextwechsel definieren:
In Bezug auf Prozesse wurde bereits der Begriff [[Vom_Batch-Job_zum_Multitasking#Definition:_Kontextwechsel|Kontextwechsel]] erläutert. Analog lässt sich der Begriff Thread-Kontextwechsel definieren:
</p>
</p>
Zeile 133: Zeile 133:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Geschwindigkeitsvorteil">
<loop_task title="Geschwindigkeitsvorteil" id="5fa97882e4575">
<p>
<p>
Warum benötigt ein Thread-Kontextwechsel weniger Zeit als ein Prozess-Kontextwechsel? Erläutere!
Warum benötigt ein Thread-Kontextwechsel weniger Zeit als ein Prozess-Kontextwechsel? Erläutere!
Zeile 145: Zeile 145:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Vor- und Nachteil des Betriebsmittelzugriffs">
<loop_task title="Vor- und Nachteil des Betriebsmittelzugriffs" id="5fa97882e4583">
<p>
<p>
Warum ist die Zugriffsmöglichkeit auf alle Betriebsmittel eines Prozesses durch die verschiedenen Threads dieses Prozesses gleichzeitig ein Vor- und ein Nachteil? Erläutere!
Warum ist die Zugriffsmöglichkeit auf alle Betriebsmittel eines Prozesses durch die verschiedenen Threads dieses Prozesses gleichzeitig ein Vor- und ein Nachteil? Erläutere!
Zeile 156: Zeile 156:
== Aufgabe 3 ==
== Aufgabe 3 ==
<p>
<p>
<loop_index>Threadzustand|Zustand, Thread</loop_index>
<loop_index id="5fa97882e4590">Threadzustand|Zustand, Thread</loop_index>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Threadzustände">
<loop_task title="Threadzustände" id="5fa97882e459d">
<p>
<p>
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?
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?
Zeile 175: Zeile 175:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Unerwünschte Nebeneffekte bei mehreren Threads">
<loop_task title="Unerwünschte Nebeneffekte bei mehreren Threads" id="5fa97882e45ab">
<p>
<p>
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!
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!

Version vom 9. November 2020, 19:12 Uhr

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