Betrachten wir zunächst den theoretischen Aspekt. Sie müssen verstehen, was ein Prozess konzeptionell ist, um den Unterschied zwischen einem Prozess und einem Thread zu verstehen und was die beiden gemeinsam haben.
Wir haben folgendes in Abschnitt 2.2.2 Das klassische Fadenmodell von Moderne Betriebssysteme 3e von Tanenbaum:
Das Prozessmodell basiert auf zwei unabhängigen Konzepten: Ressourcen Gruppierung und Ausführung. Manchmal ist es sinnvoll, sie zu trennen; Hier kommen die Threads ins Spiel....
Er fährt fort:
Eine Möglichkeit, einen Prozess zu betrachten, ist, dass er eine Möglichkeit ist zusammenhängende Ressourcen zu gruppieren. Ein Prozess hat einen Adressraum der Programmtext und Daten sowie andere Ressourcen enthält. Diese Ressourcen können offene Dateien, Kindprozesse, anstehende Alarme Signalhandler, Buchhaltungsinformationen und vieles mehr. Indem man sie Indem man sie in Form eines Prozesses zusammenfasst, können sie leichter verwaltet werden. Das andere Konzept eines Prozesses ist ein Ausführungsstrang (thread of execution), gewöhnlich abgekürzt als Thread. Der Thread hat einen Programmzähler, der festhält der festhält, welche Anweisung als nächstes ausgeführt werden soll. Er hat Register, die seine aktuellen Arbeitsvariablen enthalten. Er hat einen Stack, der die Ausführungshistorie enthält, mit einem Rahmen für jede aufgerufene Prozedur, die noch nicht noch nicht zurückgegeben wurde. Obwohl ein Thread in einem Prozess ausgeführt werden muss, sind der Thread und sein Prozess sind unterschiedliche Konzepte und können getrennt behandelt werden. getrennt behandelt werden. Prozesse werden verwendet, um Ressourcen zusammenzufassen; Threads sind die Einheiten, die für die Ausführung auf der CPU vorgesehen sind.
Weiter unten finden Sie die folgende Tabelle:
Per process items | Per thread items
------------------------------|-----------------
Address space | Program counter
Global variables | Registers
Open files | Stack
Child processes | State
Pending alarms |
Signals and signal handlers |
Accounting information |
Beschäftigen wir uns mit der Hardware-Multithreading Problem. Klassischerweise unterstützt eine CPU einen einzigen Ausführungsstrang (Thread), wobei der Zustand des Threads über eine einzige Programmzähler (PC), und eine Reihe von Registern. Aber was passiert, wenn ein Cache-Fehler auftritt? Es dauert lange, die Daten aus dem Hauptspeicher zu holen, und währenddessen sitzt die CPU einfach nur da und ist untätig. So kam jemand auf die Idee, im Grunde zwei Sätze von Thread-Status (PC + Register) zu haben, damit ein anderer Thread (vielleicht im selben Prozess, vielleicht in einem anderen Prozess) seine Arbeit erledigen kann, während der andere Thread auf den Hauptspeicher wartet. Es gibt mehrere Namen und Implementierungen dieses Konzepts, wie z.B. Hyperthreading y simultanes Multithreading (kurz: SMT).
Betrachten wir nun die Software-Seite. Es gibt grundsätzlich drei Möglichkeiten, wie Threads auf der Softwareseite implementiert werden können.
- Userspace-Threads
- Kernel-Threads
- Eine Kombination der beiden
Alles, was Sie für die Implementierung von Threads benötigen, ist die Fähigkeit, den CPU-Status zu speichern und mehrere Stapel zu verwalten, was in vielen Fällen im Userspace erfolgen kann. Der Vorteil von User-Space-Threads ist die superschnelle Thread-Umschaltung, da man nicht in den Kernel trappen muss, und die Möglichkeit, die Threads so zu planen, wie man es möchte. Der größte Nachteil ist die Unmöglichkeit, blockierende E/A durchzuführen (was den gesamten Prozess und alle seine Benutzer-Threads blockieren würde), was einer der Hauptgründe ist, warum wir überhaupt Threads verwenden. Die Blockierung von E/A mithilfe von Threads vereinfacht das Programmdesign in vielen Fällen erheblich.
Kernel-Threads haben den Vorteil, dass sie blockierende E/A verwenden können und alle Fragen der Zeitplanung dem Betriebssystem überlassen. Allerdings muss bei jedem Threadwechsel in den Kernel gewechselt werden, was potenziell relativ langsam ist. Wenn Sie jedoch wegen blockierter E/A zwischen den Threads wechseln, ist dies nicht wirklich ein Problem, da Sie durch die E/A-Operation wahrscheinlich ohnehin schon in den Kernel geraten sind.
Ein anderer Ansatz besteht darin, beide zu kombinieren, wobei mehrere Kernel-Threads jeweils mehrere Benutzer-Threads haben.
Um auf Ihre Frage nach der Terminologie zurückzukommen, können Sie sehen, dass ein Prozess und ein Ausführungsstrang zwei unterschiedliche Konzepte sind, und die Wahl des zu verwendenden Begriffs hängt davon ab, worüber Sie sprechen. Was den Begriff "leichtgewichtiger Prozess" angeht, so sehe ich persönlich keinen Sinn darin, da er nicht so gut vermittelt, was vor sich geht, wie der Begriff "Ausführungsstrang".
2 Stimmen
Verwandt: stackoverflow.com/questions/32294367/
10 Stimmen
Es ist wahrscheinlich gerechtfertigt zu sagen, dass jedes Betriebssystem eine andere Vorstellung davon hat, was ein "Thread" oder "Prozess" ist. Einige gängige Betriebssysteme haben kein Konzept für "Threads", und es gibt auch einige eingebettete Betriebssysteme, die nur "Threads" haben.
4 Stimmen
TLDR: Geschwisterliche "Threads" (in den meisten Betriebssystemen) teilen sich den gleichen virtuellen Adressraum, die gleichen Sockets und offenen Dateien, alle gleichen Ressourcen. "Prozesse" hingegen sind voneinander isoliert/geschützt, und sie teilen nichts, es sei denn, sie fordern explizit die gemeinsame Nutzung bestimmter Dinge an. In einem Betriebssystem, das sowohl "Prozesse" als auch "Threads" hat, kann ein Prozess oft als Container für einen oder mehrere Threads und für alle Ressourcen, die sie gemeinsam nutzen, betrachtet werden.