Betriebssystem - Multithreading
Was ist Thread?
Ein Thread ist ein Ausführungsfluss durch den Prozesscode mit einem eigenen Programmzähler, der verfolgt, welcher Befehl als nächstes ausgeführt werden soll, Systemregistern, die seine aktuellen Arbeitsvariablen enthalten, und einem Stapel, der den Ausführungsverlauf enthält.
Ein Thread teilt mit seinen Peer-Threads nur wenige Informationen wie Codesegment, Datensegment und geöffnete Dateien. Wenn ein Thread ein Codesegment-Speicherelement ändert, sehen dies alle anderen Threads.
Ein Thread wird auch als bezeichnet lightweight process. Threads bieten eine Möglichkeit, die Anwendungsleistung durch Parallelität zu verbessern. Threads stellen einen Softwareansatz zur Verbesserung der Leistung des Betriebssystems dar, indem der Overhead-Thread reduziert wird. Dies entspricht einem klassischen Prozess.
Jeder Thread gehört zu genau einem Prozess und es kann kein Thread außerhalb eines Prozesses existieren. Jeder Thread repräsentiert einen separaten Kontrollfluss. Threads wurden erfolgreich bei der Implementierung von Netzwerkservern und Webservern verwendet. Sie bieten auch eine geeignete Grundlage für die parallele Ausführung von Anwendungen auf Multiprozessoren mit gemeinsamem Speicher. Die folgende Abbildung zeigt die Funktionsweise eines Single-Threaded- und eines Multithread-Prozesses.
Unterschied zwischen Prozess und Thread
SN | Prozess | Faden |
---|---|---|
1 | Der Prozess ist schwer oder ressourcenintensiv. | Der Faden ist leicht und benötigt weniger Ressourcen als ein Prozess. |
2 | Prozessumschaltung erfordert Interaktion mit dem Betriebssystem. | Thread-Switching muss nicht mit dem Betriebssystem interagieren. |
3 | In mehreren Verarbeitungsumgebungen führt jeder Prozess denselben Code aus, verfügt jedoch über eigene Speicher- und Dateiressourcen. | Alle Threads können denselben Satz offener Dateien und untergeordneter Prozesse gemeinsam nutzen. |
4 | Wenn ein Prozess blockiert ist, kann kein anderer Prozess ausgeführt werden, bis der erste Prozess entsperrt ist. | Während ein Thread blockiert ist und wartet, kann ein zweiter Thread in derselben Task ausgeführt werden. |
5 | Mehrere Prozesse ohne Verwendung von Threads verbrauchen mehr Ressourcen. | Prozesse mit mehreren Threads verbrauchen weniger Ressourcen. |
6 | In mehreren Prozessen arbeitet jeder Prozess unabhängig von den anderen. | Ein Thread kann die Daten eines anderen Threads lesen, schreiben oder ändern. |
Vorteile von Thread
- Threads minimieren die Kontextwechselzeit.
- Die Verwendung von Threads bietet Parallelität innerhalb eines Prozesses.
- Effiziente Kommunikation.
- Das Erstellen und Kontextwechseln von Threads ist wirtschaftlicher.
- Threads ermöglichen die Verwendung von Multiprozessor-Architekturen in größerem Maßstab und mit größerer Effizienz.
Arten von Thread
Threads werden auf zwei Arten implementiert:
User Level Threads - Benutzerverwaltete Threads.
Kernel Level Threads - Vom Betriebssystem verwaltete Threads, die auf den Kernel, einen Betriebssystemkern, wirken.
Threads auf Benutzerebene
In diesem Fall ist dem Thread-Verwaltungskern die Existenz von Threads nicht bekannt. Die Thread-Bibliothek enthält Code zum Erstellen und Zerstören von Threads, zum Weiterleiten von Nachrichten und Daten zwischen Threads, zum Planen der Thread-Ausführung sowie zum Speichern und Wiederherstellen von Thread-Kontexten. Die Anwendung beginnt mit einem einzelnen Thread.
Vorteile
- Für das Thread-Switching sind keine Berechtigungen für den Kernel-Modus erforderlich.
- Thread auf Benutzerebene kann auf jedem Betriebssystem ausgeführt werden.
- Die Planung kann im Thread auf Benutzerebene anwendungsspezifisch sein.
- Threads auf Benutzerebene lassen sich schnell erstellen und verwalten.
Nachteile
- In einem typischen Betriebssystem werden die meisten Systemaufrufe blockiert.
- Multithread-Anwendungen können Multiprocessing nicht nutzen.
Threads auf Kernebene
In diesem Fall erfolgt die Threadverwaltung über den Kernel. Im Anwendungsbereich befindet sich kein Thread-Verwaltungscode. Kernel-Threads werden direkt vom Betriebssystem unterstützt. Jede Anwendung kann für Multithreading programmiert werden. Alle Threads in einer Anwendung werden in einem einzigen Prozess unterstützt.
Der Kernel verwaltet Kontextinformationen für den gesamten Prozess und für einzelne Threads innerhalb des Prozesses. Die Planung durch den Kernel erfolgt auf Thread-Basis. Der Kernel führt die Erstellung, Planung und Verwaltung von Threads im Kernelbereich durch. Kernel-Threads sind im Allgemeinen langsamer zu erstellen und zu verwalten als die Benutzer-Threads.
Vorteile
- Der Kernel kann gleichzeitig mehrere Threads desselben Prozesses für mehrere Prozesse planen.
- Wenn ein Thread in einem Prozess blockiert ist, kann der Kernel einen anderen Thread desselben Prozesses planen.
- Kernel-Routinen selbst können Multithread-fähig sein.
Nachteile
- Kernel-Threads sind im Allgemeinen langsamer zu erstellen und zu verwalten als die Benutzer-Threads.
- Die Übertragung der Kontrolle von einem Thread auf einen anderen innerhalb desselben Prozesses erfordert einen Moduswechsel zum Kernel.
Multithreading-Modelle
Einige Betriebssysteme bieten eine kombinierte Thread-Funktion auf Benutzerebene und auf Kernel-Ebene. Solaris ist ein gutes Beispiel für diesen kombinierten Ansatz. In einem kombinierten System können mehrere Threads innerhalb derselben Anwendung auf mehreren Prozessoren parallel ausgeführt werden, und ein blockierender Systemaufruf muss nicht den gesamten Prozess blockieren. Es gibt drei Arten von Multithreading-Modellen
- Viele zu viele Beziehungen.
- Viele zu einer Beziehung.
- Eins zu eins Beziehung.
Viele zu viele Modelle
Das Viele-zu-Viele-Modell multiplext eine beliebige Anzahl von Benutzer-Threads auf eine gleiche oder kleinere Anzahl von Kernel-Threads.
Das folgende Diagramm zeigt das Viele-zu-Viele-Threading-Modell, bei dem 6 Threads auf Benutzerebene mit 6 Threads auf Kernelebene multiplexen. In diesem Modell können Entwickler so viele Benutzer-Threads wie nötig erstellen und die entsprechenden Kernel-Threads können parallel auf einem Multiprozessor-Computer ausgeführt werden. Dieses Modell bietet die beste Genauigkeit bei der Parallelität. Wenn ein Thread einen blockierenden Systemaufruf ausführt, kann der Kernel einen anderen Thread für die Ausführung planen.
Viele zu einem Modell
Das Many-to-One-Modell ordnet viele Threads auf Benutzerebene einem Thread auf Kernel-Ebene zu. Die Thread-Verwaltung erfolgt im Benutzerbereich durch die Thread-Bibliothek. Wenn der Thread einen blockierenden Systemaufruf ausführt, wird der gesamte Prozess blockiert. Es kann jeweils nur ein Thread auf den Kernel zugreifen, sodass mehrere Threads auf Multiprozessoren nicht parallel ausgeführt werden können.
Wenn die Thread-Bibliotheken auf Benutzerebene im Betriebssystem so implementiert sind, dass das System sie nicht unterstützt, verwenden die Kernel-Threads die Viele-zu-Eins-Beziehungsmodi.
Eins zu Eins Modell
Es gibt eine Eins-zu-Eins-Beziehung zwischen Thread auf Benutzerebene und Thread auf Kernelebene. Dieses Modell bietet mehr Parallelität als das Viele-zu-Eins-Modell. Außerdem kann ein anderer Thread ausgeführt werden, wenn ein Thread einen blockierenden Systemaufruf ausführt. Es unterstützt mehrere Threads, die parallel auf Mikroprozessoren ausgeführt werden.
Nachteil dieses Modells ist, dass zum Erstellen eines Benutzer-Threads der entsprechende Kernel-Thread erforderlich ist. OS / 2, Windows NT und Windows 2000 verwenden ein Eins-zu-Eins-Beziehungsmodell.
Unterschied zwischen Thread auf Benutzerebene und Kernel-Ebene
SN | Threads auf Benutzerebene | Thread auf Kernebene |
---|---|---|
1 | Threads auf Benutzerebene lassen sich schneller erstellen und verwalten. | Threads auf Kernel-Ebene lassen sich langsamer erstellen und verwalten. |
2 | Die Implementierung erfolgt durch eine Thread-Bibliothek auf Benutzerebene. | Das Betriebssystem unterstützt die Erstellung von Kernel-Threads. |
3 | Thread auf Benutzerebene ist generisch und kann auf jedem Betriebssystem ausgeführt werden. | Thread auf Kernel-Ebene ist spezifisch für das Betriebssystem. |
4 | Multithread-Anwendungen können Multiprocessing nicht nutzen. | Kernel-Routinen selbst können Multithread-fähig sein. |