Ich habe versucht, eine gute Definition zu finden und zu verstehen, was ein Thread wirklich ist.
Es scheint, dass mir etwas Offensichtliches fehlt, aber jedes Mal, wenn ich lese, was ein Thread ist, ist es fast eine zirkuläre Definition, a la "ein Thread ist ein Thread der Ausführung" oder "eine Möglichkeit, sich in laufende Aufgaben zu unterteilen". Äh, ähm. Huh?
Nach dem, was ich gelesen habe, ist ein Thread nicht wirklich etwas Konkretes, wie es ein Prozess ist. Es ist in der Tat nur ein Konzept. Soweit ich weiß, wie dies funktioniert, führt ein Prozessor einige Befehle für ein Programm aus (das als Ausführungsthread bezeichnet wurde ). Wenn er dann für eine Weile zur Verarbeitung für ein anderes Programm wechseln muss, speichert er den Status von Das Programm, für das es gerade ausgeführt wird (Thread Local Storage), und beginnt dann mit der Ausführung der Anweisungen des anderen Programms. Und hin und her. Ein Thread ist also eigentlich nur ein Konzept für "einen der Ausführungspfade" eines Programms, das gerade ausgeführt wird.
Im Gegensatz zu einem Prozess, der wirklich etwas ist - es ist ein Konglomerat von Ressourcen usw.
Als Beispiel für eine Definition, die mir nicht wirklich geholfen hat. . .
Aus Wikipedia :
"Ein Thread in der Informatik ist die Abkürzung für einen Ausführungsthread. Threads sind eine Möglichkeit für ein Programm, sich selbst in zwei oder mehr gleichzeitig (oder pseudo-gleichzeitig) laufende Aufgaben zu unterteilen (Threads und Prozesse werden von einer unterschieden) Betriebssystem zu einem anderen, aber im Allgemeinen ist ein Thread in einem Prozess enthalten, und verschiedene Threads im selben Prozess teilen sich dieselben Ressourcen, während verschiedene Prozesse im selben Multitasking-Betriebssystem dies nicht tun. "
Also habe ich recht? Falsch? Was ist ein Thread wirklich?
Edit: Anscheinend ein Thread auch einen eigenen Call - Stack gegeben, so dass ein wenig von einem Beton ist Sache .
quelle
Antworten:
Ein Thread ist ein unabhängiger Satz von Werten für die Prozessorregister (für einen einzelnen Kern). Da dies den Anweisungszeiger (auch Programmzähler genannt) enthält, steuert er, was in welcher Reihenfolge ausgeführt wird. Es enthält auch den Stapelzeiger, der besser auf einen eindeutigen Speicherbereich für jeden Thread verweist, da er sich sonst gegenseitig stört.
Threads sind die Softwareeinheit, die vom Steuerungsfluss betroffen ist (Funktionsaufruf, Schleife, goto), da diese Anweisungen auf dem Anweisungszeiger ausgeführt werden und zu einem bestimmten Thread gehören. Threads werden häufig nach einem bestimmten Priorisierungsschema geplant (obwohl es möglich ist, ein System mit einem Thread pro Prozessorkern zu entwerfen. In diesem Fall wird jeder Thread immer ausgeführt und es ist keine Planung erforderlich).
Tatsächlich reicht der Wert des Anweisungszeigers und der an dieser Stelle gespeicherten Anweisung aus, um einen neuen Wert für den Anweisungszeiger zu bestimmen. Bei den meisten Anweisungen wird die IP lediglich um die Größe der Anweisung erhöht, bei Steuerflussanweisungen wird die IP jedoch auf andere, vorhersehbare Weise geändert. Die Folge von Werten, die die IP annimmt, bildet einen Ausführungspfad, der sich durch den Programmcode schlängelt und den Namen "Thread" hervorbringt.
quelle
Ein Thread ist ein Ausführungskontext. Dies sind alle Informationen, die eine CPU benötigt, um einen Befehlsstrom auszuführen.
Angenommen, Sie lesen ein Buch und möchten gerade eine Pause einlegen, möchten aber in der Lage sein, genau an dem Punkt, an dem Sie aufgehört haben, wieder zu lesen. Eine Möglichkeit, dies zu erreichen, besteht darin, die Seitenzahl, die Zeilennummer und die Wortnummer aufzuschreiben. Ihr Ausführungskontext zum Lesen eines Buches sind also diese 3 Zahlen.
Wenn Sie eine Mitbewohnerin haben und sie dieselbe Technik anwendet, kann sie das Buch nehmen, während Sie es nicht verwenden, und das Lesen dort fortsetzen, wo sie aufgehört hat. Dann können Sie es zurücknehmen und von Ihrem Standort aus fortsetzen.
Threads funktionieren auf die gleiche Weise. Eine CPU gibt Ihnen die Illusion, dass sie mehrere Berechnungen gleichzeitig durchführt. Dies geschieht, indem für jede Berechnung etwas Zeit aufgewendet wird. Dies ist möglich, da für jede Berechnung ein Ausführungskontext vorhanden ist. So wie Sie ein Buch mit Ihrem Freund teilen können, können viele Aufgaben eine CPU teilen.
Auf einer technischeren Ebene besteht ein Ausführungskontext (daher ein Thread) aus den Werten der CPU-Register.
Zuletzt: Threads unterscheiden sich von Prozessen. Ein Thread ist ein Ausführungskontext, während ein Prozess eine Reihe von Ressourcen ist, die einer Berechnung zugeordnet sind. Ein Prozess kann einen oder mehrere Threads haben.
Erläuterung: Zu den einem Prozess zugeordneten Ressourcen gehören Speicherseiten (alle Threads in einem Prozess haben dieselbe Ansicht des Speichers), Dateideskriptoren (z. B. offene Sockets) und Sicherheitsanmeldeinformationen (z. B. die ID des Benutzers, der den Prozess gestartet hat) Prozess).
quelle
Um einen Thread formal zu definieren, müssen wir zuerst die Grenzen verstehen, an denen ein Thread arbeitet.
Ein Computerprogramm wird zu einem Prozess, wenn es aus einem Speicher in den Arbeitsspeicher des Computers geladen wird und mit der Ausführung beginnt. Ein Prozess kann von einem Prozessor oder einer Reihe von Prozessoren ausgeführt werden. Eine Prozessbeschreibung im Speicher enthält wichtige Informationen wie den Programmzähler, der die aktuelle Position im Programm verfolgt (dh welche Anweisung gerade ausgeführt wird), Register, Variablenspeicher, Dateihandles, Signale usw.
Ein Thread ist eine Folge solcher Anweisungen innerhalb eines Programms, die unabhängig von anderem Code ausgeführt werden können. Die Abbildung zeigt das Konzept:
Threads befinden sich im selben Prozessadressraum , sodass ein Großteil der in der Speicherbeschreibung des Prozesses enthaltenen Informationen von Threads gemeinsam genutzt werden kann.
Einige Informationen können nicht repliziert werden, z. B. der Stapel (Stapelzeiger auf einen anderen Speicherbereich pro Thread), Register und threadspezifische Daten. Diese Informationen reichen aus, um Threads unabhängig vom Hauptthread des Programms und möglicherweise einem oder mehreren anderen Threads innerhalb des Programms planen zu können .
Für die Ausführung von Multithread-Programmen ist eine explizite Betriebssystemunterstützung erforderlich. Glücklicherweise unterstützen die meisten modernen Betriebssysteme Threads wie Linux (über NPTL), BSD-Varianten, Mac OS X, Windows, Solaris, AIX, HP-UX usw. Betriebssysteme verwenden möglicherweise unterschiedliche Mechanismen, um Multithreading-Unterstützung zu implementieren.
Hier finden Sie weitere Informationen zum Thema. Das war auch meine Informationsquelle.
Lassen Sie mich nur einen Satz aus der Einführung in das eingebettete System von Edward Lee und Seshia hinzufügen :
quelle
Prozesse sind wie zwei Personen, die zwei verschiedene Computer verwenden und das Netzwerk verwenden, um bei Bedarf Daten gemeinsam zu nutzen. Threads sind wie zwei Personen, die denselben Computer verwenden und keine expliziten Daten freigeben müssen, sondern sich sorgfältig abwechseln müssen.
Konzeptionell sind Threads nur mehrere Arbeiterbienen, die im selben Adressraum herumschwirren. Jeder Thread hat einen eigenen Stapel, einen eigenen Programmzähler usw., aber alle Threads in einem Prozess teilen sich den gleichen Speicher. Stellen Sie sich zwei Programme vor, die gleichzeitig ausgeführt werden, aber beide auf dieselben Objekte zugreifen können.
Vergleichen Sie dies mit Prozessen. Prozesse haben jeweils einen eigenen Adressraum, dh ein Zeiger in einem Prozess kann nicht verwendet werden, um auf ein Objekt in einem anderen zu verweisen (es sei denn, Sie verwenden gemeinsam genutzten Speicher).
Ich denke, die wichtigsten Dinge, die zu verstehen sind, sind:
quelle
Ich werde viel Text aus dem Buch Operating Systems Concepts von ABRAHAM SILBERSCHATZ, PETER BAER GALVIN und GREG GAGNE zusammen mit meinem eigenen Verständnis der Dinge verwenden.
Prozess
Jede Anwendung befindet sich in Form von Text (oder Code) auf dem Computer.
Wenn wir eine Anwendung starten, erstellen wir eine Ausführungsinstanz. Diese Ausführungsinstanz wird als Prozess bezeichnet. EDIT: (Gemäß meiner Interpretation, analog zu einer Klasse und einer Instanz einer Klasse, wobei die Instanz einer Klasse ein Prozess ist.)
Ein Beispiel für Prozesse ist Google Chrome. Wenn wir Google Chrome starten, werden 3 Prozesse erzeugt:
Faden
Um dies zu beantworten, sollten Sie zunächst wissen, was ein Prozessor ist. Ein Prozessor ist die Hardware, die die Berechnungen tatsächlich ausführt. BEARBEITEN: (Berechnungen wie das Hinzufügen von zwei Zahlen, das Sortieren eines Arrays und das Ausführen des geschriebenen Codes)
Fahren Sie nun mit der Definition eines Threads fort.
EDIT: Definition eines Threads von der Intel-Website:
Wenn der Renderer-Prozess in der Chrome-Anwendung ein Array von Zahlen sortiert, erfolgt die Sortierung nach einem Thread / Thread der Ausführung. (Die Grammatik in Bezug auf Threads scheint mir verwirrend)
Meine Interpretation der Dinge
Ein Prozess ist eine Ausführungsinstanz. Threads sind die eigentlichen Worker, die die Berechnungen über den CPU-Zugriff durchführen. Wenn für einen Prozess mehrere Threads ausgeführt werden, stellt der Prozess gemeinsamen Speicher bereit.
BEARBEITEN: Andere Informationen, die ich nützlich fand, um mehr Kontext zu geben
Alle modernen Computer haben mehr als einen Thread. Die Anzahl der Threads in einem Computer hängt von der Anzahl der Kerne in einem Computer ab.
Concurrent Computing :
Aus Wikipedia:
Also könnte ich ein Programm schreiben, das die Summe von 4 Zahlen berechnet:
In dem Programm zur Berechnung dieser Summe (dies ist ein Prozess, der auf einem Ausführungsthread ausgeführt wird) kann ich einen anderen Prozess aufteilen, der auf einem anderen zu berechnenden Thread ausgeführt werden kann (4 + 5) und das Ergebnis an den ursprünglichen Prozess zurückgeben, während der Der ursprüngliche Prozess berechnet die Summe von (1 + 3).
quelle
Leider existieren Threads. Ein Faden ist etwas Greifbares. Sie können einen töten, und die anderen rennen weiter. Sie können neue Threads erzeugen. Obwohl jeder Thread kein eigener Prozess ist, werden sie innerhalb des Prozesses separat ausgeführt. Auf Multi-Core-Computern können 2 Threads gleichzeitig ausgeführt werden.
http://en.wikipedia.org/wiki/Simultaneous_multithreading
http://www.intel.com/intelpress/samples/mcp_samplech01.pdf
quelle
Ein Thread ist nichts anderes als ein Speicherkontext (oder wie Tanenbaum es besser ausdrückt, Ressourcengruppierung) mit Ausführungsregeln. Es ist ein Software-Konstrukt. Die CPU hat keine Ahnung, was ein Thread ist (einige Ausnahmen hier, einige Prozessoren haben Hardware-Threads), sie führt nur Anweisungen aus.
Der Kernel führt das Thread- und Prozesskonzept ein, um die Speicher- und Anweisungsreihenfolge auf sinnvolle Weise zu verwalten.
quelle
Dies wurde aus einer Yahoo-Antwort entnommen:
Einfacher ausgedrückt sind Threads jedoch wie verschiedene "Aufgaben". Denken Sie also daran, wenn Sie etwas tun, zum Beispiel, schreiben Sie eine Formel auf ein Papier. Das kann als ein Thread betrachtet werden. Dann schreiben Sie in einem anderen Thread etwas anderes auf ein anderes Blatt Papier. Hier kommt Multitasking ins Spiel.
Intel-Prozessoren sollen "Hyper-Threading" haben (AMD hat es auch) und es soll in der Lage sein, mehrere "Threads" oder Multitasking viel besser auszuführen.
Ich bin mir nicht sicher, wie ein Thread logistisch gehandhabt wird. Ich erinnere mich, dass ich gehört habe, dass der Prozessor zwischen ihnen hin und her geht, aber ich bin mir nicht 100% sicher, und hoffentlich kann jemand anderes darauf antworten.
quelle
Die Antwort ist je nach System und Implementierung sehr unterschiedlich, aber die wichtigsten Teile sind:
Darüber hinaus könnten Threads innerhalb eines einzelnen Prozesses durch eine Sprachlaufzeit implementiert werden, Threads könnten Coroutinen sein, Threads könnten innerhalb eines einzelnen Prozesses durch eine Threading-Bibliothek implementiert werden oder Threads könnten ein Kernel-Konstrukt sein.
In mehreren modernen Unix-Systemen, einschließlich Linux, mit dem ich am besten vertraut bin, alles Threads - ein Prozess ist lediglich eine Art Thread, der relativ wenige Dinge mit seinem übergeordneten Element teilt (dh er erhält seine eigenen Speicherzuordnungen, seine eigene Dateitabelle und Berechtigungen usw.) Das Lesen
man 2 clone
, insbesondere die Liste der Flags, ist hier wirklich lehrreich.quelle
Ich bin mit keiner dieser Antworten wirklich zufrieden, daher werde ich hier meine eigene hinzufügen :) Ein Thread ist eine Kernel-Abstraktion zum Planen der Arbeit am Prozessor. Ein Thread ist das, was der Kernel Ihnen zum Verwalten der Prozessorzeit gibt und Arbeit mit anderen teilen
quelle
Lassen Sie mich zunächst den Unterschied zwischen Prozess und Threads erklären.
Ein Prozess kann eine {1..N} Anzahl von Threads haben. Eine kleine Erklärung zum virtuellen Speicher und zum virtuellen Prozessor.
Virtueller Speicher
Wird als Auslagerungsbereich verwendet, damit ein Prozess denkt, dass er zur Ausführung im Primärspeicher gespeichert ist.
Virtueller Prozessor
Das gleiche Konzept wie der virtuelle Speicher, außer dass dies für den Prozessor gilt. Für einen Prozess sieht es so aus, als wäre es das einzige, was den Prozessor verwendet.
Das Betriebssystem kümmert sich darum, den virtuellen Speicher und den virtuellen Prozessor einem Prozess zuzuweisen und den Austausch zwischen Prozessen und die Ausführung durchzuführen.
Alle Threads innerhalb eines Prozesses teilen sich denselben virtuellen Speicher. Jedem Thread wird jedoch ein individueller virtueller Prozessor zugewiesen, damit er einzeln ausgeführt werden kann.
Dies spart den Speicher und nutzt die CPU optimal aus.
quelle