Was ist der Unterschied zwischen einem Prozess und einem Thread?


1640

Was ist der technische Unterschied zwischen einem Prozess und einem Thread?

Ich habe das Gefühl, dass ein Wort wie "Prozess" überbeansprucht wird und es auch Hardware- und Software-Threads gibt. Wie wäre es mit leichten Prozessen in Sprachen wie Erlang ? Gibt es einen endgültigen Grund, einen Begriff über den anderen zu verwenden?



4
Es ist wahrscheinlich gerechtfertigt zu sagen, dass jedes Betriebssystem eine andere Vorstellung davon hat, was ein "Thread" oder "Prozess" ist. Einige Mainstream-Betriebssysteme haben kein Konzept für "Thread", es gibt auch einige eingebettete Betriebssysteme, die nur "Threads" haben.
Neil

Antworten:


1458

Sowohl Prozesse als auch Threads sind unabhängige Ausführungssequenzen. Der typische Unterschied besteht darin, dass Threads (desselben Prozesses) in einem gemeinsam genutzten Speicherbereich ausgeführt werden, während Prozesse in separaten Speicherbereichen ausgeführt werden.

Ich bin mir nicht sicher, auf welche "Hardware" - oder "Software" -Threads Sie sich möglicherweise beziehen. Threads sind eher eine Betriebsumgebungsfunktion als eine CPU-Funktion (obwohl die CPU normalerweise Operationen hat, die Threads effizient machen).

Erlang verwendet den Begriff "Prozess", da er kein Multiprogramming-Modell mit gemeinsamem Speicher verfügbar macht. Wenn Sie sie "Threads" nennen, bedeutet dies, dass sie gemeinsam genutzten Speicher haben.


56
Hardware-Threads beziehen sich wahrscheinlich auf mehrere Thread-Kontexte innerhalb eines Kerns (z. B. HyperThreading, SMT, Suns Niagara / Rock). Dies bedeutet unter anderem doppelte Registerdateien, zusätzliche Bits, die mit dem Befehl durch die Pipelines übertragen werden, und eine komplexere Umgehungs- / Weiterleitungslogik.
Matt J

4
@greg, ein Zweifel habe ich in Threads. Lassen Sie mich überlegen, ob ich einen Prozess A habe, der etwas Speicherplatz im RAM hat. Wenn der Prozess A einen Thread erstellt, benötigt der Thread auch etwas Platz zum Ausführen. Erhöht es also den Speicherplatz, der für Prozess A erstellt wird, oder den Speicherplatz für Threads, die an einer anderen Stelle erstellt wurden? Was schafft dieser virtuelle Raumprozess? Bitte korrigieren Sie mich, wenn meine Frage falsch ist. Danke
Duslabo

9
@JeshwanthKumarNK: Durch das Erstellen eines neuen Threads wird mindestens genügend Speicher für einen neuen Stapel zugewiesen. Dieser Speicher wird vom Betriebssystem in Prozess A zugewiesen.
Greg Hewgill

24
Diese Antwort scheint falsch. Wenn sowohl Prozesse als auch Threads unabhängige Ausführungssequenzen wären, müsste ein Prozess, der zwei Threads enthält, drei Ausführungssequenzen haben, und das kann nicht richtig sein. Nur ein Thread ist eine Ausführungssequenz - ein Prozess ist ein Container, der eine oder mehrere Ausführungssequenzen enthalten kann.
David Schwartz

8
"Hardware-Threads" sind Threads, denen einzelne Hardwareressourcen zugewiesen werden (ein separater Kern, Prozessor oder Hyperthread). "Software-Threads" sind Threads, die um die gleiche Verarbeitungsleistung konkurrieren müssen.
jpmc26

811

Prozess
Jeder Prozess stellt die Ressourcen bereit, die zum Ausführen eines Programms erforderlich sind. Ein Prozess verfügt über einen virtuellen Adressraum, ausführbaren Code, offene Handles für Systemobjekte, einen Sicherheitskontext, eine eindeutige Prozesskennung, Umgebungsvariablen, eine Prioritätsklasse, minimale und maximale Arbeitssatzgrößen und mindestens einen Ausführungsthread. Jeder Prozess wird mit einem einzelnen Thread gestartet, der häufig als primärer Thread bezeichnet wird. Er kann jedoch aus jedem seiner Threads zusätzliche Threads erstellen.

Thread
Ein Thread ist eine Entität innerhalb eines Prozesses, deren Ausführung geplant werden kann. Alle Threads eines Prozesses teilen sich den virtuellen Adressraum und die Systemressourcen. Darüber hinaus verwaltet jeder Thread Ausnahmebehandlungsroutinen, eine Planungspriorität, einen lokalen Thread-Speicher, eine eindeutige Thread-ID und eine Reihe von Strukturen, mit denen das System den Thread-Kontext speichert, bis er geplant ist. Der Thread-Kontext enthält den Satz von Maschinenregistern des Threads, den Kernel-Stack, einen Thread-Umgebungsblock und einen Benutzer-Stack im Adressraum des Thread-Prozesses. Threads können auch einen eigenen Sicherheitskontext haben, der zum Identitätswechsel von Clients verwendet werden kann.


Diese Informationen wurden in Microsoft Docs hier gefunden: Informationen zu Prozessen und Threads

Microsoft Windows unterstützt präemptives Multitasking, wodurch die gleichzeitige Ausführung mehrerer Threads aus mehreren Prozessen erzielt wird. Auf einem Multiprozessor-Computer kann das System gleichzeitig so viele Threads ausführen, wie Prozessoren auf dem Computer vorhanden sind.


18
Für Leute, die wissen wollen, warum Sie eine Diskette nicht gleichzeitig formatieren
Computernerd

7
@LuisVasconcellos - Wenn es keine Threads gäbe, würde der Prozess nichts tun. Der Prozess wäre nur ein Code und ein Programmstatus, die in den Speicher geladen werden. Es nützt nicht viel. Es wäre, als hätte man eine Straße ohne Fahrzeuge.
Scott Langham

4
@ LuisVasconcellos - Gut. Ja, Sie können sich einen Thread als etwas vorstellen, das sich durch den Code des Prozesses bewegt und die Anweisungen in diesem Code ausführt.
Scott Langham

9
Diese Antwort ist viel besser als die akzeptierte Antwort, da sie über das Ideal von Prozessen und Threads spricht : Sie sollten getrennte Dinge mit getrennten Anliegen sein. Tatsache ist, dass die meisten Betriebssysteme eine Geschichte haben, die weiter zurückreicht als die Erfindung von Threads, und folglich sind diese Bedenken in den meisten Betriebssystemen immer noch etwas verwickelt, selbst wenn sie sich im Laufe der Zeit langsam verbessern.
Solomon Slow

4
@BKSpurgeon Mit jeder Erklärung, die man gibt, muss man seinen Leser von einer Ebene des Verstehens zur nächsten bringen. Leider kann ich die Antwort nicht auf jeden Leser zuschneiden und muss daher einen Wissensstand voraussetzen. Für diejenigen, die es nicht wissen, können sie weitere Suchen nach Begriffen durchführen, die ich verwende, die sie nicht verstehen, nicht wahr, bis sie einen Basispunkt erreichen, den sie verstehen. Ich wollte vorschlagen, dass Sie Ihre eigene Antwort anbieten, freue mich aber, dass Sie diese bereits haben.
Scott Langham

301

Prozess:

  • Eine ausführende Instanz eines Programms wird als Prozess bezeichnet.
  • Einige Betriebssysteme verwenden den Begriff "Aufgabe", um sich auf ein Programm zu beziehen, das ausgeführt wird.
  • Ein Prozess wird immer im Hauptspeicher gespeichert, der auch als Primärspeicher oder Direktzugriffsspeicher bezeichnet wird.
  • Daher wird ein Prozess als aktive Entität bezeichnet. Es verschwindet, wenn der Computer neu gestartet wird.
  • Einem Programm können mehrere Prozesse zugeordnet sein.
  • Auf einem Multiprozessorsystem können mehrere Prozesse parallel ausgeführt werden.
  • Auf einem Einprozessor-System wird, obwohl keine echte Parallelität erreicht wird, ein Prozessplanungsalgorithmus angewendet, und der Prozessor wird so geplant, dass er jeden Prozess einzeln ausführt, was eine Illusion von Parallelität ergibt.
  • Beispiel: Ausführen mehrerer Instanzen des Programms 'Calculator'. Jede der Instanzen wird als Prozess bezeichnet.

Faden:

  • Ein Thread ist eine Teilmenge des Prozesses.
  • Es wird als "Lightweight-Prozess" bezeichnet, da es einem realen Prozess ähnelt, jedoch im Kontext eines Prozesses ausgeführt wird und dieselben Ressourcen verwendet, die der Kernel dem Prozess zuweist.
  • Normalerweise hat ein Prozess nur einen Thread der Steuerung - jeweils einen Satz von Maschinenbefehlen, die ausgeführt werden.
  • Ein Prozess kann auch aus mehreren Ausführungsthreads bestehen, die gleichzeitig Anweisungen ausführen.
  • Mehrere Steuerungsthreads können die auf Multiprozessorsystemen mögliche echte Parallelität ausnutzen.
  • Auf einem Einprozessor-System wird ein Thread-Planungsalgorithmus angewendet, und der Prozessor wird so geplant, dass jeder Thread einzeln ausgeführt wird.
  • Alle Threads, die in einem Prozess ausgeführt werden, haben denselben Adressraum, dieselben Dateideskriptoren, denselben Stapel und andere prozessbezogene Attribute.
  • Da sich die Threads eines Prozesses denselben Speicher teilen, gewinnt die Synchronisierung des Zugriffs auf die gemeinsam genutzten Daten innerhalb des Prozesses eine beispiellose Bedeutung.

Ich habe die obigen Informationen von der Knowledge Quest ausgeliehen! Blog .


90
Kumar: Meines Wissens teilen sich Threads nicht den gleichen Stapel. Andernfalls wäre es nicht möglich, auf jedem von ihnen unterschiedlichen Code auszuführen.
Mihai Neacsu

27
Ja, ich denke @MihaiNeacsu ist richtig. Threads teilen "Code, Daten und Dateien" und haben ihre eigenen "Register und Stapel". Folie von meinem OS-Kurs: i.imgur.com/Iq1Qprv.png
Shehaaz

Dies ist sehr nützlich, da es erweitert, was Threads und Prozesse sind und wie sie sich zueinander verhalten. Ich würde vorschlagen, ein Beispiel für einen Thread hinzuzufügen, insbesondere da es eines für einen Prozess gibt. Gutes Zeug!
Smithers

1
Kquest.co.cc-Links sind tot.
Elijah Lynn

1
@ Rndp13 Das Problem ist nur die Verwendung des Wortes "Stapel" anstelle von "Stapel". Threads teilen sich Stapel, da der Stapel nur ein Teil des virtuellen Speichers ist und Threads den gesamten virtuellen Speicher gemeinsam nutzen. Threads können sogar ihre Stapelzeiger verstauen und die Ausführung kann von einem anderen Thread ohne Probleme fortgesetzt werden. Dass ein Thread zufällig einen Stapel zu einem bestimmten Zeitpunkt ausführt, bedeutet nicht, dass Threads keine Stapel gemeinsam nutzen, genauso wie die Tatsache, dass ein Thread gleichzeitig mit einem Dateideskriptor arbeitet, bedeutet nicht, dass Threads keine Dateideskriptoren gemeinsam nutzen .
David Schwartz

127

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 zwischen ihnen geteilt wird.

Wir haben Folgendes aus Abschnitt 2.2.2 Das klassische Gewindemodell in modernen Betriebssystemen 3e von Tanenbaum:

Das Prozessmodell basiert auf zwei unabhängigen Konzepten: Ressourcengruppierung und -ausführung. Manchmal ist es nützlich, sie zu trennen; Hier kommen Threads ins Spiel ....

Er fährt fort:

Eine Möglichkeit, einen Prozess zu betrachten, besteht darin, verwandte Ressourcen zu gruppieren. Ein Prozess verfügt über einen Adressraum, der Programmtext und -daten sowie andere Ressourcen enthält. Diese Ressourcen können geöffnete Dateien, untergeordnete Prozesse, ausstehende Alarme, Signalhandler, Buchhaltungsinformationen und mehr enthalten. Durch die Zusammenstellung in Form eines Prozesses können sie einfacher verwaltet werden. Das andere Konzept eines Prozesses ist ein Ausführungsthread, der normalerweise auf nur einen Thread verkürzt wird. Der Thread verfügt über einen Programmzähler, der verfolgt, welche Anweisung als nächstes ausgeführt werden soll. Es hat Register, die seine aktuellen Arbeitsvariablen enthalten. Es verfügt über einen Stapel, der den Ausführungsverlauf enthält, mit einem Frame für jede aufgerufene, aber noch nicht zurückgegebene Prozedur. Obwohl ein Thread in einem bestimmten Prozess ausgeführt werden muss, Der Thread und sein Prozess sind unterschiedliche Konzepte und können separat behandelt werden. Prozesse werden verwendet, um Ressourcen zu gruppieren. Threads sind die Entitäten, deren Ausführung auf der CPU geplant ist.

Weiter unten liefert er 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        |

Lassen Sie uns das Problem des Hardware-Multithreading behandeln . Klassischerweise würde eine CPU einen einzelnen Ausführungsthread unterstützen und den Status des Threads über einen einzelnen Programmzähler und einen Registersatz beibehalten. Aber was passiert, wenn ein Cache-Fehler auftritt? Das Abrufen von Daten aus dem Hauptspeicher dauert lange, und währenddessen sitzt die CPU nur im Leerlauf. Jemand hatte also die Idee, grundsätzlich zwei Sätze von Thread-Status (PC + -Register) zu haben, damit ein anderer Thread (möglicherweise im selben Prozess, möglicherweise in einem anderen Prozess) die Arbeit erledigen kann, während der andere Thread auf den Hauptspeicher wartet. Es gibt mehrere Namen und Implementierungen dieses Konzepts, z. B. HyperThreading und Simultaneous Multithreading (kurz SMT).

Schauen wir uns nun die Softwareseite an. Grundsätzlich gibt es drei Möglichkeiten, wie Threads auf der Softwareseite implementiert werden können.

  1. Userspace-Threads
  2. Kernel-Threads
  3. Eine Kombination aus beiden

Alles, was Sie zum Implementieren von Threads benötigen, ist die Möglichkeit, den CPU-Status zu speichern und mehrere Stapel zu verwalten, was in vielen Fällen im Benutzerbereich erfolgen kann. Der Vorteil von User-Space-Threads ist der superschnelle Thread-Wechsel, da Sie nicht in den Kernel eintauchen müssen und Ihre Threads nach Ihren Wünschen planen können. Der größte Nachteil ist die Unfähigkeit, E / A zu blockieren (was den gesamten Prozess und alle Benutzer-Threads blockieren würde). Dies ist einer der Hauptgründe, warum wir Threads überhaupt verwenden. Das Blockieren von E / A mithilfe von Threads vereinfacht in vielen Fällen das Programmdesign erheblich.

Kernel-Threads haben den Vorteil, dass sie blockierende E / A verwenden können und alle Planungsprobleme dem Betriebssystem überlassen. Jeder Thread-Wechsel erfordert jedoch das Einfangen in den Kernel, der möglicherweise relativ langsam ist. Wenn Sie jedoch Threads aufgrund blockierter E / A wechseln, ist dies kein wirkliches Problem, da die E / A-Operation Sie wahrscheinlich ohnehin schon im Kernel gefangen hat.

Ein anderer Ansatz besteht darin, beide zu kombinieren, wobei mehrere Kernel-Threads jeweils mehrere Benutzer-Threads aufweisen.

Wenn Sie also zu Ihrer Frage der Terminologie zurückkehren, können Sie sehen, dass ein Prozess und ein Thread der Ausführung zwei verschiedene Konzepte sind und Ihre Wahl des zu verwendenden Begriffs davon abhängt, wovon Sie sprechen. In Bezug auf den Begriff "Leichtgewichtsprozess" sehe ich den Punkt darin nicht persönlich, da er nicht wirklich vermittelt, was vor sich geht, sowie den Begriff "Faden der Ausführung".


4
Hervorragende Antwort! Es bricht einen Großteil des Jargons und der Annahmen zusammen. Das macht diese Zeile jedoch unangenehm: "Jemand hatte also die Idee, grundsätzlich zwei Sätze von Thread-Status (PC + Register) zu haben" - worauf bezieht sich der "PC" hier?
Smithers

2
@Smithers Der PC ist der Programmzähler oder Befehlszeiger, der die Adresse des nächsten auszuführenden Befehls angibt: en.wikipedia.org/wiki/Program_counter
Robert S. Barnes


Warum ist "Stapel" nicht unter "Pro Prozesselementen" aufgeführt? Sowohl Prozesse als auch Threads haben einen eigenen Stapel.
stackoverflowuser2010

1
@ stackoverflowuser2010 Nicht nur Threads haben Stapel. Was Sie einen Prozess nennen, ist ein Prozess mit einem einzelnen Ausführungsthread, und es ist der Thread, bei dem der Stapel und nicht der Prozess vorhanden sind.
Robert S. Barnes

100

Weitere Erläuterungen zur gleichzeitigen Programmierung

  1. Ein Prozess verfügt über eine in sich geschlossene Ausführungsumgebung. Ein Prozess verfügt im Allgemeinen über einen vollständigen, privaten Satz grundlegender Laufzeitressourcen. Insbesondere hat jeder Prozess seinen eigenen Speicherplatz.

  2. Threads existieren innerhalb eines Prozesses - jeder Prozess hat mindestens einen. Threads teilen sich die Ressourcen des Prozesses, einschließlich Speicher und geöffneter Dateien. Dies ermöglicht eine effiziente, aber möglicherweise problematische Kommunikation.

Den Durchschnittsmenschen im Auge behalten,

Öffnen Sie auf Ihrem Computer Microsoft Word und den Webbrowser. Wir nennen diese beiden Prozesse .

In Microsoft Word geben Sie etwas ein und es wird automatisch gespeichert. Jetzt hätten Sie beobachtet, dass das Bearbeiten und Speichern parallel erfolgt - das Bearbeiten eines Threads und das Speichern des anderen Threads.


14
Hervorragende Antwort, es hält die Dinge einfach und bietet ein Beispiel, auf das sich jeder Benutzer beziehen kann, selbst wenn er die Frage betrachtet.
Smithers

7
Das Bearbeiten / Speichern war ein schönes Beispiel für mehrere Threads innerhalb eines Prozesses!

53

Eine Anwendung besteht aus einem oder mehreren Prozessen. Ein Prozess ist im einfachsten Sinne ein ausführendes Programm. Ein oder mehrere Threads werden im Kontext des Prozesses ausgeführt. Ein Thread ist die Grundeinheit, der das Betriebssystem die Prozessorzeit zuweist. Ein Thread kann einen beliebigen Teil des Prozesscodes ausführen, einschließlich der Teile, die derzeit von einem anderen Thread ausgeführt werden. Eine Faser ist eine Ausführungseinheit, die von der Anwendung manuell geplant werden muss. Fasern werden im Kontext der Threads ausgeführt, die sie planen.

Von hier gestohlen .


Unter anderen Betriebssystemen wie Linux gibt es auf Betriebssystemebene keinen praktischen Unterschied zwischen beiden, außer dass Threads normalerweise denselben Speicherplatz wie der übergeordnete Prozess verwenden. (Daher meine Ablehnung)
Arafangion

1
Gute Antwort (insbesondere mit Gutschrift), da sie die Beziehung zwischen den beiden zeigt und in eine leicht zu erwartende "nächste Frage" (über Fasern) übergeht.
Smithers

29

Ein Prozess ist eine Sammlung von Code, Speicher, Daten und anderen Ressourcen. Ein Thread ist eine Codesequenz, die im Rahmen des Prozesses ausgeführt wird. Sie können (normalerweise) mehrere Threads gleichzeitig im selben Prozess ausführen lassen.


27

Beispiel aus der Praxis für Prozess und Thread Hier erhalten Sie eine grundlegende Vorstellung von Thread und Prozess Geben Sie hier die Bildbeschreibung ein

Ich habe die obigen Informationen aus Scott Langhams Antwort ausgeliehen - danke


25

Prozess:

  1. Prozess ist ein schwerer Prozess.
  2. Prozess ist ein separates Programm, das separate Speicher, Daten, Ressourcen usw. hat.
  3. Prozesse werden mit der fork () -Methode erstellt.
  4. Der Kontextwechsel zwischen den Prozessen ist zeitaufwändig.

Beispiel:
Öffnen Sie beispielsweise einen beliebigen Browser (Mozilla, Chrome, IE). An diesem Punkt beginnt die Ausführung eines neuen Prozesses.

Themen:

  1. Threads sind leichte Prozesse. Threads werden innerhalb des Prozesses gebündelt.
  2. Threads haben einen gemeinsamen Speicher, Daten, Ressourcen, Dateien usw.
  3. Threads werden mit der Methode clone () erstellt.
  4. Der Kontextwechsel zwischen den Threads ist als Prozess nicht sehr zeitaufwändig.

Beispiel:
Öffnen mehrerer Registerkarten im Browser.


In der Windows-Welt haben Sie Recht, aber unter Linux ist jeder "Thread" ein Prozess und gleichermaßen "schwer" (oder leicht).
Neil

22
  • Jeder Prozess ist ein Thread (Primär-Thread).
  • Aber jeder Thread ist kein Prozess. Es ist ein Teil (eine Entität) eines Prozesses.

3
Können Sie das etwas näher erläutern und / oder Beweise hinzufügen?
Zim84

15

Sowohl Threads als auch Prozesse sind atomare Einheiten der Betriebssystemressourcenzuweisung (dh es gibt ein Parallelitätsmodell, das beschreibt, wie die CPU-Zeit zwischen ihnen aufgeteilt wird, und das Modell, andere Betriebssystemressourcen zu besitzen). Es gibt einen Unterschied in:

  • Freigegebene Ressourcen (Threads teilen sich per Definition Speicher, sie besitzen nichts anderes als Stapel- und lokale Variablen; Prozesse können auch Speicher gemeinsam nutzen, es gibt jedoch einen separaten Mechanismus, der vom Betriebssystem verwaltet wird.)
  • Zuordnungsbereich (Kernelbereich für Prozesse vs. Benutzerbereich für Threads)

Greg Hewgill oben hatte Recht mit der Erlang-Bedeutung des Wortes "Prozess", und hier wird diskutiert, warum Erlang Prozesse mit geringem Gewicht ausführen kann .


13

Sowohl Prozesse als auch Threads sind unabhängige Ausführungssequenzen. Der typische Unterschied besteht darin, dass Threads (desselben Prozesses) in einem gemeinsam genutzten Speicherbereich ausgeführt werden, während Prozesse in separaten Speicherbereichen ausgeführt werden.

Prozess

Ist ein Programm in Ausführung. Es hat einen Textabschnitt, dh den Programmcode, die aktuelle Aktivität, dargestellt durch den Wert des Programmzählers und den Inhalt des Prozessorregisters. Es enthält auch den Prozessstapel, der temporäre Daten enthält (z. B. Funktionsparameter, zurückgegebene adressierte und lokale Variablen), und einen Datenabschnitt, der globale Variablen enthält. Ein Prozess kann auch einen Heap enthalten, bei dem es sich um Speicher handelt, der während der Prozesslaufzeit dynamisch zugewiesen wird.

Faden

Ein Thread ist eine Grundeinheit der CPU-Auslastung. Es umfasst eine Thread-ID, einen Programmzähler, einen Registersatz und einen Stapel. Es teilte mit anderen Threads, die zum selben Prozess gehören, seinen Codeabschnitt, Datenabschnitt und andere Betriebssystemressourcen wie geöffnete Dateien und Signale.

- Entnommen aus dem Betriebssystem von Galvin


13

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Linus Torvalds (torvalds@cs.helsinki.fi)

Di, 6. August 1996, 12:47:31 +0300 (EET DST)

Nachrichten sortiert nach: [Datum] [Thread] [Betreff] [Autor]

Nächste Nachricht: Bernd P. Ziller: "Re: Ups in get_hash_table"

Vorherige Nachricht: Linus Torvalds: "Re: I / O Request Ordering"

Am Montag, 5. August 1996, schrieb Peter P. Eiserloh:

Wir müssen das Konzept der Fäden klar halten. Zu viele Leute scheinen einen Thread mit einem Prozess zu verwechseln. Die folgende Diskussion spiegelt nicht den aktuellen Stand von Linux wider, sondern ist ein Versuch, auf einer Diskussion auf hoher Ebene zu bleiben.

NEIN!

Es gibt keinen Grund zu der Annahme, dass "Threads" und "Prozesse" separate Einheiten sind. So wird es traditionell gemacht, aber ich persönlich halte es für einen großen Fehler, so zu denken. Der einzige Grund, so zu denken, ist historisches Gepäck.

Sowohl Threads als auch Prozesse sind wirklich nur eine Sache: ein "Kontext der Ausführung". Der Versuch, verschiedene Fälle künstlich zu unterscheiden, ist nur selbstlimitierend.

Ein "Kontext der Ausführung", hiermit COE genannt, ist nur das Konglomerat des gesamten Zustands dieses COE. Dieser Status umfasst Dinge wie den CPU-Status (Register usw.), den MMU-Status (Seitenzuordnungen), den Berechtigungsstatus (UID, GID) und verschiedene "Kommunikationszustände" (offene Dateien, Signalhandler usw.). Traditionell bestand der Unterschied zwischen einem "Thread" und einem "Prozess" hauptsächlich darin, dass ein Thread einen CPU-Status (+ möglicherweise einen anderen minimalen Status) hat, während der gesamte andere Kontext aus dem Prozess stammt. Dies ist jedoch nur eine Möglichkeit, den Gesamtzustand des COE aufzuteilen, und nichts sagt aus, dass dies der richtige Weg ist. Sich auf diese Art von Bild zu beschränken, ist einfach nur dumm.

Die Art und Weise Linux darüber denkt (und die Art , wie ich die Dinge arbeiten will) ist , dass es ist nicht so etwas wie ein „Prozess“ oder „Faden“. Es gibt nur die Gesamtheit des COE (von Linux "Task" genannt). Verschiedene COEs können Teile ihres Kontexts miteinander teilen, und eine Teilmenge dieser Freigabe ist das traditionelle "Thread" / "Prozess" -Setup, aber das sollte wirklich als NUR eine Teilmenge angesehen werden (es ist eine wichtige Teilmenge, aber diese Bedeutung kommt nicht vom Design, sondern von Standards: Wir wollen offensichtlich auch standardkonforme Thread-Programme auf Linux ausführen.

Kurz gesagt: Entwerfen Sie NICHT um die Denkweise von Thread / Prozess. Der Kernel sollte nach der COE-Denkweise gestaltet sein, und dann kann die pthreads- Bibliothek die eingeschränkte pthreads-Schnittstelle an Benutzer exportieren, die diese Sichtweise auf COEs verwenden möchten.

Nur als Beispiel dafür, was möglich wird, wenn Sie COE im Gegensatz zu Thread / Prozess denken:

  • Sie können ein externes "CD" -Programm erstellen, was unter UNIX und / oder Prozess / Thread traditionell unmöglich ist (dummes Beispiel, aber die Idee ist, dass Sie diese Art von "Modulen" haben können, die nicht auf das traditionelle UNIX beschränkt sind / threads setup). Machen Sie eine:

Klon (CLONE_VM | CLONE_FS);

Kind: execve ("external-cd");

/ * Das "execve ()" trennt die Zuordnung der VM. Der einzige Grund, warum wir CLONE_VM verwendet haben, bestand darin, das Klonen zu beschleunigen. * /

  • Sie können "vfork ()" natürlich ausführen (es erfordert nur minimale Kernel-Unterstützung, aber diese Unterstützung passt perfekt zur CUA-Denkweise):

Klon (CLONE_VM);

Kind: weiter laufen, schließlich ausführen ()

Mutter: Warte auf die Ausführung

  • Sie können externe "IO-Deamons" ausführen:

Klon (CLONE_FILES);

Kind: offene Dateideskriptoren usw.

mutter: benutze die fd's die das kind geöffnet hat und vv.

All dies funktioniert, weil Sie nicht an die Denkweise von Thread / Prozess gebunden sind. Stellen Sie sich zum Beispiel einen Webserver vor, auf dem die CGI-Skripte als "Ausführungsthreads" ausgeführt werden. Mit herkömmlichen Threads ist dies nicht möglich, da herkömmliche Threads immer den gesamten Adressraum gemeinsam nutzen müssen. Sie müssen also alles, was Sie jemals wollten, auf dem Webserver selbst verknüpfen (ein "Thread" kann nicht ausgeführt werden eine andere ausführbare Datei).

Das Denken an das als „Kontext der Ausführung“ Problems stattdessen können Ihre Aufgaben jetzt wählen externe Programme auszuführen (= den Adressraum von der Mutter zu trennen) usw. , wenn sie wollen, oder sie können zum Beispiel teilt alles mit der Mutter außer für die Dateideskriptoren (damit die Unter- "Threads" viele Dateien öffnen können, ohne dass sich die Eltern darum kümmern müssen: Sie werden automatisch geschlossen, wenn der Unter- "Thread" beendet wird, und es werden keine FDs im Eltern verwendet) .

Stellen Sie sich zum Beispiel ein "inetd" mit Gewinde vor. Sie möchten Fork + Exec mit geringem Overhead, also können Sie unter Linux anstelle eines "fork ()" ein Inetd mit mehreren Threads schreiben, bei dem jeder Thread nur mit CLONE_VM erstellt wird (Adressraum freigeben, aber keine Datei freigeben) Deskriptoren usw.). Dann kann das Kind ausführen, wenn es sich um einen externen Dienst handelt (z. B. rlogind) oder um einen der internen inetd-Dienste (echo, timeofday). In diesem Fall erledigt es einfach seine Sache und wird beendet.

Mit "thread" / "process" geht das nicht.

Linus


12

Ich versuche, es in der Betriebssystemansicht des Linux-Kernels zu beantworten

Ein Programm wird zu einem Prozess, wenn es in den Speicher gestartet wird. Ein Verfahren hat seinen eigenen Adressraum verschiedene Segmente im Speicher , wie beispielsweise Bedeutung hat .textzur Speicherung kompilierter Code segement, .bssfür uninitialized statische oder globale Variablen zu speichern, usw.
Jeden Prozess seine eigenen Programmzähler und Benutzerraum haben würden Stapel .

Innerhalb des Kernels hätte jeder Prozess seinen eigenen Kernel-Stack (der aus Sicherheitsgründen vom User-Space-Stack getrennt ist) und eine Struktur mit dem Namen, task_structdie im Allgemeinen als Prozesssteuerungsblock abstrahiert wird und alle Informationen bezüglich des Prozesses wie Priorität und Status speichert , (und eine ganze Menge anderer Brocken).
Ein Prozess kann mehrere Ausführungsthreads haben.

Bei Threads befinden sie sich in einem Prozess und teilen sich den Adressraum des übergeordneten Prozesses zusammen mit anderen Ressourcen, die während der Thread-Erstellung übergeben werden können, z. B. Dateisystemressourcen, gemeinsame Nutzung ausstehender Signale, gemeinsame Nutzung von Daten (Variablen und Anweisungen), wodurch Threads leichter und leichter werden Dies ermöglicht eine schnellere Kontextumschaltung.

Innerhalb des Kernels hat jeder Thread seinen eigenen Kernelstapel zusammen mit der task_structStruktur, die den Thread definiert. Daher zeigt der Kernel Threads desselben Prozesses als verschiedene Entitäten an und ist für sich selbst planbar. Threads im selben Prozess haben eine gemeinsame ID, die als Thread-Gruppen-ID ( tgid) bezeichnet wird. Außerdem haben sie eine eindeutige ID, die als Prozess-ID ( pid) bezeichnet wird.


11

Der Versuch, diese Frage in Bezug auf die Java-Welt zu beantworten.

Ein Prozess ist eine Ausführung eines Programms, aber ein Thread ist eine einzelne Ausführungssequenz innerhalb des Prozesses. Ein Prozess kann mehrere Threads enthalten. Ein Thread wird manchmal als Lightweight-Prozess bezeichnet .

Zum Beispiel:

Beispiel 1: Eine JVM wird in einem einzelnen Prozess ausgeführt, und Threads in einer JVM teilen sich den zu diesem Prozess gehörenden Heap. Aus diesem Grund können mehrere Threads auf dasselbe Objekt zugreifen. Threads teilen sich den Heap und haben ihren eigenen Stapelspeicher. Auf diese Weise wird der Aufruf einer Methode durch einen Thread und seine lokalen Variablen vor anderen Threads geschützt. Der Heap ist jedoch nicht threadsicher und muss aus Sicherheitsgründen synchronisiert werden.

Beispiel 2: Ein Programm kann möglicherweise keine Bilder durch Lesen von Tastenanschlägen zeichnen. Das Programm muss sich voll und ganz auf die Tastatureingabe konzentrieren. Wenn nicht mehr als ein Ereignis gleichzeitig verarbeitet werden kann, kann dies zu Problemen führen. Die ideale Lösung für dieses Problem ist die nahtlose Ausführung von zwei oder mehr Abschnitten eines Programms gleichzeitig. Threads ermöglicht es uns, dies zu tun. Hier ist das Zeichnen eines Bildes ein Prozess und das Lesen eines Tastenanschlags ein Unterprozess (Thread).


1
Gute Antwort, ich mag es, dass es seinen Umfang definiert (Java-Welt) und einige anwendbare Beispiele liefert - einschließlich eines (# 2), auf das sich jeder, der die ursprüngliche Frage stellen muss, sofort beziehen kann.
Smithers

9

Unterschied zwischen Thread und Prozess?

Ein Prozess ist eine ausführende Instanz einer Anwendung, und ein Thread ist ein Ausführungspfad innerhalb eines Prozesses. Ein Prozess kann auch mehrere Threads enthalten. Es ist wichtig zu beachten, dass ein Thread alles kann, was ein Prozess kann. Da ein Prozess jedoch aus mehreren Threads bestehen kann, kann ein Thread als "leichter" Prozess betrachtet werden. Der wesentliche Unterschied zwischen einem Thread und einem Prozess ist daher die Arbeit, mit der jeder einzelne ausgeführt wird. Threads werden für kleine Aufgaben verwendet, während Prozesse für Aufgaben mit höherem Gewicht verwendet werden - im Grunde genommen für die Ausführung von Anwendungen.

Ein weiterer Unterschied zwischen einem Thread und einem Prozess besteht darin, dass Threads innerhalb desselben Prozesses denselben Adressraum verwenden, während dies bei verschiedenen Prozessen nicht der Fall ist. Dies ermöglicht es Threads, aus denselben Datenstrukturen und Variablen zu lesen und in diese zu schreiben, und erleichtert auch die Kommunikation zwischen Threads. Die Kommunikation zwischen Prozessen - auch als IPC oder Interprozesskommunikation bezeichnet - ist recht schwierig und ressourcenintensiv.

Hier ist eine Zusammenfassung der Unterschiede zwischen Threads und Prozessen:

  1. Threads sind einfacher zu erstellen als Prozesse, da sie keinen separaten Adressraum benötigen.

  2. Multithreading erfordert eine sorgfältige Programmierung, da Threads Datenstrukturen gemeinsam nutzen, die jeweils nur von einem Thread geändert werden sollten. Im Gegensatz zu Threads verwenden Prozesse nicht denselben Adressraum.

  3. Threads gelten als leichtgewichtig, da sie weitaus weniger Ressourcen als Prozesse verbrauchen.

  4. Prozesse sind unabhängig voneinander. Da Threads denselben Adressraum verwenden, sind sie voneinander abhängig. Daher ist Vorsicht geboten, damit verschiedene Threads nicht aufeinander treten.
    Dies ist wirklich eine andere Art, # 2 oben anzugeben.

  5. Ein Prozess kann aus mehreren Threads bestehen.


9

Folgendes habe ich aus einem der Artikel über The Code Project erhalten . Ich denke, es erklärt alles, was benötigt wird, klar.

Ein Thread ist ein weiterer Mechanismus zum Aufteilen der Arbeitslast in separate Ausführungsströme. Ein Faden ist leichter als ein Prozess. Dies bedeutet, dass es weniger Flexibilität bietet als ein vollständiger Prozess, aber schneller initiiert werden kann, da das Betriebssystem weniger einrichten muss. Wenn ein Programm aus zwei oder mehr Threads besteht, teilen sich alle Threads einen einzigen Speicherplatz. Prozesse erhalten separate Adressräume. Alle Threads teilen sich einen einzigen Heap. Aber jeder Thread erhält seinen eigenen Stapel.


1
Ich bin mir nicht sicher, ob dies klar ist, es sei denn, ich komme aus einer Perspektive, die Threads und Prozesse bereits versteht. Es könnte nützlich sein, hinzuzufügen, wie sie sich zueinander verhalten.
Smithers

Unklar. Bedeutet es nur einen Prozess und seine Threads? Was ist, wenn es viele Prozesse mit jeweils vielen Threads gibt? Teilen sich all diese Threads einen einzigen Speicherplatz? Von all diesen Prozessen?
Grün

9

Prozess:

Prozess ist im Grunde ein Programm in Ausführung. Es ist eine aktive Einheit. Einige Betriebssysteme verwenden den Begriff "Aufgabe", um sich auf ein Programm zu beziehen, das ausgeführt wird. Ein Prozess wird immer im Hauptspeicher gespeichert, der auch als Primärspeicher oder Direktzugriffsspeicher bezeichnet wird. Daher wird ein Prozess als aktive Entität bezeichnet. Es verschwindet, wenn der Computer neu gestartet wird. Einem Programm können mehrere Prozesse zugeordnet sein. Auf einem Multiprozessorsystem können mehrere Prozesse parallel ausgeführt werden. Auf einem Einprozessor-System wird, obwohl keine echte Parallelität erreicht wird, ein Prozessplanungsalgorithmus angewendet, und der Prozessor wird so geplant, dass er jeden Prozess einzeln ausführt, was eine Illusion von Parallelität ergibt. Beispiel: Ausführen mehrerer Instanzen des Programms 'Calculator'. Jede der Instanzen wird als Prozess bezeichnet.

Faden:

Ein Thread ist eine Teilmenge des Prozesses. Es wird als "Lightweight-Prozess" bezeichnet, da es einem realen Prozess ähnelt, jedoch im Kontext eines Prozesses ausgeführt wird und dieselben Ressourcen verwendet, die der Kernel dem Prozess zuweist. Normalerweise hat ein Prozess nur einen Thread der Steuerung - jeweils einen Satz von Maschinenbefehlen, die ausgeführt werden. Ein Prozess kann auch aus mehreren Ausführungsthreads bestehen, die gleichzeitig Anweisungen ausführen. Mehrere Steuerungsthreads können die auf Multiprozessorsystemen mögliche echte Parallelität ausnutzen. Auf einem Einprozessor-System wird ein Thread-Planungsalgorithmus angewendet, und der Prozessor wird so geplant, dass jeder Thread einzeln ausgeführt wird. Alle Threads, die in einem Prozess ausgeführt werden, haben denselben Adressraum, dieselben Dateideskriptoren, denselben Stapel und andere prozessbezogene Attribute. Da sich die Threads eines Prozesses denselben Speicher teilen,

ref- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread


Klingt nach Knoten-Parallelität in einem Prozess im
Vergleich

Dies ist buchstäblich aus der Antwort unten von 2010
kopiert

8

Aus der Sicht eines Interviewers gibt es im Grunde nur drei wichtige Dinge, die ich hören möchte, neben offensichtlichen Dingen, wie ein Prozess mehrere Threads haben kann:

  1. Threads teilen sich den gleichen Speicherplatz, was bedeutet, dass ein Thread vom Thread-Speicher eines anderen auf den Speicher zugreifen kann. Prozesse können normalerweise nicht.
  2. Ressourcen. Ressourcen (Speicher, Handles, Sockets usw.) werden bei Prozessbeendigung freigegeben, nicht bei Threadbeendigung.
  3. Sicherheit. Ein Prozess hat ein festes Sicherheitstoken. Ein Thread kann sich dagegen als verschiedene Benutzer / Token ausgeben.

Wenn Sie mehr wollen, deckt Scott Langhams Antwort so ziemlich alles ab. All dies ist aus der Sicht eines Betriebssystems. Verschiedene Sprachen können unterschiedliche Konzepte implementieren, z. B. Aufgaben, leichtgewichtige Threads usw. Sie sind jedoch nur Möglichkeiten zur Verwendung von Threads (von Glasfasern unter Windows). Es gibt keine Hardware- und Software-Threads. Es gibt Hardware- und Software- Ausnahmen und Interrupts oder Benutzermodus- und Kernel- Threads .


Wenn Sie Sicherheitstoken sagen, meinen Sie damit einen Benutzerausweis (Benutzername / Pass), wie er beispielsweise unter Linux vorhanden ist?

In Windows ist dies ein komplexes Thema. Das Sicherheitstoken (eigentlich als Zugriffstoken bezeichnet) ist eine große Struktur, die alle für die Zugriffsprüfung erforderlichen Informationen enthält. Die Struktur wird nach der Autorisierung erstellt, dh es gibt keinen Benutzernamen / Passwort, sondern eine Liste von SIDs / Rechten basierend auf dem Benutzernamen / Passwort. Weitere Details hier: msdn.microsoft.com/en-us/library/windows/desktop/…
AndreiM

8
  1. Ein Thread wird in einem gemeinsam genutzten Speicherbereich ausgeführt, ein Prozess jedoch in einem separaten Speicherbereich
  2. Ein Faden ist ein leichter Prozess, aber ein Prozess ist ein schwerer Prozess.
  3. Ein Thread ist ein Subtyp eines Prozesses.

Das fühlt sich sehr rekursiv an. Es wäre vielleicht eine bessere Antwort, wenn die Beziehung zwischen dem Thread und dem Prozess erweitert würde.
Smithers

7

Für diejenigen, die mit dem Lernen durch Visualisierung besser vertraut sind, ist hier ein praktisches Diagramm, das ich erstellt habe, um Prozess und Themen zu erklären.
Ich habe die Informationen von MSDN - Über Prozesse und Threads verwendet

Prozesse und Threads


1
Es könnte interessant sein, einen weiteren Prozess hinzuzufügen, um zu sehen, wie Multithreading mit Multiprozessing verglichen wird.
Bram Vanroy

6

Aus der eingebetteten Welt kommend möchte ich hinzufügen, dass das Konzept von Prozessen nur in "großen" Prozessoren ( Desktop-CPUs, ARM Cortex A-9 ) mit MMU (Memory Management Unit) und Betriebssystemen, die die Verwendung von MMUs unterstützen, existiert ( wie Linux ). Bei kleinen / alten Prozessoren und Mikrocontrollern und einem kleinen RTOS-Betriebssystem ( Echtzeit-Betriebssystem ) wie freeRTOS gibt es keine MMU-Unterstützung und somit keine Prozesse, sondern nur Threads.

Threads können auf den Speicher des jeweils anderen zugreifen und werden vom Betriebssystem verschachtelt geplant, sodass sie scheinbar parallel ausgeführt werden (oder mit Multi-Core-Funktionen tatsächlich parallel ausgeführt werden).

Prozesse hingegen befinden sich in ihrer privaten Sandbox mit virtuellem Speicher, die von der MMU bereitgestellt und überwacht wird. Dies ist praktisch, weil es Folgendes ermöglicht:

  1. Verhindern, dass fehlerhafte Prozesse das gesamte System zum Absturz bringen.
  2. Aufrechterhaltung der Sicherheit durch Unsichtbarkeit und Nichterreichbarkeit anderer Prozessdaten. Die eigentliche Arbeit innerhalb des Prozesses wird von einem oder mehreren Threads erledigt.

6
  1. Grundsätzlich ist ein Thread ein Teil eines Prozesses, ohne den ein Prozess-Thread nicht funktionieren könnte.
  2. Ein Thread ist leicht, während der Prozess schwer ist.
  3. Die Kommunikation zwischen den Prozessen erfordert einige Zeit, während der Thread weniger Zeit benötigt.
  4. Threads können denselben Speicherbereich gemeinsam nutzen, während der Prozess separat ausgeführt wird.

6

Prozess : Das ausgeführte Programm wird als Prozess bezeichnet

Thread : Thread ist eine Funktionalität, die mit dem anderen Teil des Programms ausgeführt wird, basierend auf dem Konzept "Eins mit dem anderen", sodass Thread ein Teil des Prozesses ist.


Nicht schlecht, obwohl es ein neues Konzept einführt ("eins mit dem anderen"), das wahrscheinlich jemandem fremd ist, der die Frage stellt.
Smithers

Der Beitrag ist als Code formatiert, sollte jedoch normaler Text sein.
Heinrich

6

Ich habe dort leider fast alle Antworten durchgesehen, da ich als Student, der einen OS-Kurs belegt, die beiden Konzepte derzeit nicht gründlich verstehen kann. Ich meine, die meisten Leute lesen aus einigen Betriebssystembüchern die Unterschiede, dh Threads können auf globale Variablen in der Transaktionseinheit zugreifen, da sie den Adressraum ihres Prozesses nutzen. Es stellt sich jedoch die neue Frage, warum es Prozesse gibt. Wir wissen, dass Threads gegenüber Prozessen bereits leichter sind. Schauen wir uns das folgende Beispiel an, indem wir das Bild verwenden, das aus einer der vorherigen Antworten extrahiert wurde:

Wir haben 3 Threads, die gleichzeitig an einem Word-Dokument arbeiten, z . B. Libre Office . Die erste führt eine Rechtschreibprüfung durch, indem unterstrichen wird, ob das Wort falsch geschrieben ist. Der zweite nimmt und druckt Buchstaben von der Tastatur. Und der letzte speichert das Dokument in jeder kurzen Zeit, um das bearbeitete Dokument nicht zu verlieren, wenn etwas schief geht. In diesem Fall können die 3 Threads keine 3 Prozesse sein, da sie sich einen gemeinsamen Speicher teilen, der den Adressraum ihres Prozesses darstellt, und somit alle Zugriff auf das zu bearbeitende Dokument haben. Die Straße ist also das Wortdokument zusammen mit zwei Bulldozern, die die Fäden bilden, obwohl einer von ihnen im Bild fehlt.

Geben Sie hier die Bildbeschreibung ein


5

Beim Erstellen eines Algorithmus in Python (interpretierte Sprache) mit Multithreading war ich überrascht, dass die Ausführungszeit im Vergleich zu dem zuvor erstellten sequentiellen Algorithmus nicht besser war. Um den Grund für dieses Ergebnis zu verstehen, habe ich etwas gelesen und glaube, dass das, was ich gelernt habe, einen interessanten Kontext bietet, um die Unterschiede zwischen Multithreading und Multiprozessen besser zu verstehen.

Multi-Core-Systeme können mehrere Ausführungsthreads ausführen, daher sollte Python Multi-Threading unterstützen. Python ist jedoch keine kompilierte Sprache, sondern eine interpretierte Sprache 1 . Dies bedeutet, dass das Programm interpretiert werden muss, um ausgeführt zu werden, und der Interpreter das Programm nicht kennt, bevor er mit der Ausführung beginnt. Was es jedoch weiß, sind die Regeln von Python und es wendet diese Regeln dann dynamisch an. Optimierungen in Python müssen dann hauptsächlich Optimierungen des Interpreters selbst sein und nicht des Codes, der ausgeführt werden soll. Dies steht im Gegensatz zu kompilierten Sprachen wie C ++ und hat Konsequenzen für das Multithreading in Python. Insbesondere verwendet Python die globale Interpreter-Sperre, um Multithreading zu verwalten.

Andererseits wird eine kompilierte Sprache gut kompiliert. Das Programm wird "vollständig" verarbeitet, wobei es zuerst gemäß seinen syntaktischen Definitionen interpretiert, dann einer sprachunabhängigen Zwischendarstellung zugeordnet und schließlich zu einem ausführbaren Code verknüpft wird. Durch diesen Vorgang kann der Code stark optimiert werden, da er zum Zeitpunkt der Kompilierung verfügbar ist. Die verschiedenen Programminteraktionen und -beziehungen werden zum Zeitpunkt der Erstellung der ausführbaren Datei definiert, und es können zuverlässige Entscheidungen zur Optimierung getroffen werden.

In modernen Umgebungen muss der Python-Interpreter Multithreading zulassen, und dies muss sowohl sicher als auch effizient sein. Hier kommt der Unterschied zwischen einer interpretierten Sprache und einer kompilierten Sprache ins Spiel. Der Interpreter darf intern gemeinsam genutzte Daten von verschiedenen Threads nicht stören und gleichzeitig die Verwendung von Prozessoren für Berechnungen optimieren.

Wie in den vorherigen Beiträgen erwähnt, sind sowohl ein Prozess als auch ein Thread unabhängige sequentielle Ausführungen, wobei der Hauptunterschied darin besteht, dass der Speicher von mehreren Threads eines Prozesses gemeinsam genutzt wird, während Prozesse ihre Speicherbereiche isolieren.

In Python werden Daten durch die globale Interpreter-Sperre vor dem gleichzeitigen Zugriff durch verschiedene Threads geschützt. Es ist erforderlich, dass in jedem Python-Programm immer nur ein Thread ausgeführt werden kann. Andererseits ist es möglich, mehrere Prozesse auszuführen, da der Speicher für jeden Prozess von jedem anderen Prozess isoliert ist und Prozesse auf mehreren Kernen ausgeführt werden können.


1 Donald Knuth hat eine gute Erklärung für Interpretationsroutinen in Die Kunst der Computerprogrammierung: Grundlegende Algorithmen.


4

Threads innerhalb desselben Prozesses teilen sich den Speicher, aber jeder Thread hat seinen eigenen Stapel und seine eigenen Register, und Threads speichern threadspezifische Daten im Heap. Threads werden niemals unabhängig ausgeführt, sodass die Kommunikation zwischen Threads im Vergleich zur Kommunikation zwischen Prozessen viel schneller ist.

Prozesse teilen sich niemals den gleichen Speicher. Wenn ein untergeordneter Prozess erstellt wird, wird der Speicherort des übergeordneten Prozesses dupliziert. Die Prozesskommunikation erfolgt über Pipe, Shared Memory und Nachrichtenanalyse. Der Kontextwechsel zwischen Threads ist sehr langsam.


4

Die beste Antwort, die ich bisher gefunden habe, ist Michael Kerrisk 'The Linux Programming Interface' :

In modernen UNIX-Implementierungen kann jeder Prozess mehrere Ausführungsthreads haben. Eine Möglichkeit, sich Threads vorzustellen, besteht in einer Reihe von Prozessen, die denselben virtuellen Speicher sowie eine Reihe anderer Attribute gemeinsam nutzen. Jeder Thread führt denselben Programmcode aus und teilt denselben Datenbereich und denselben Heap. Jeder Thread verfügt jedoch über einen eigenen Stapel, der lokale Variablen und Informationen zur Verknüpfung von Funktionsaufrufen enthält. [LPI 2.12]

Dieses Buch ist eine Quelle großer Klarheit; Julia Evans erwähnte in diesem Artikel seine Hilfe, um zu klären, wie Linux-Gruppen wirklich funktionieren .


Dies scheint direkt widersprüchlich. Ein Teil besagt, dass ein Prozess mehr als einen Thread haben kann. Der nächste Teil besagt, dass ein Thread eine Reihe von Prozessen ist, die den virtuellen Speicher gemeinsam nutzen. Ich sehe nicht, wie diese beiden Dinge wahr sein können.
David Schwartz

So habe ich es gelesen: Wirf das Wort 'haben' im ersten Satz weg. Was Sie terminologisch gesehen übrig haben, ist 1) ein einzelner Thread und 2) eine Gruppierung von Threads, was der Einfachheit halber als Prozess bezeichnet wird. Dies ist meine Sicht auf das, was Kerrisk hier sucht.
Zach Valenta

Ich denke, er versucht zu sagen, dass, wenn Sie an die alte UNIX-Ansicht gewöhnt sind, dass Prozesse das sind, was das Betriebssystem plant, eine Reihe von Threads wie eine Reihe von Prozessen ist, außer dass sie eine Reihe von Dingen gemeinsam haben.
David Schwartz

Recht! Guter Weg, um es auszudrücken.
Zach Valenta

3

Beispiel 1: Eine JVM wird in einem einzelnen Prozess ausgeführt, und Threads in einer JVM teilen sich den zu diesem Prozess gehörenden Heap. Aus diesem Grund können mehrere Threads auf dasselbe Objekt zugreifen. Threads teilen sich den Heap und haben ihren eigenen Stapelspeicher. Auf diese Weise wird der Aufruf einer Methode durch einen Thread und seine lokalen Variablen vor anderen Threads geschützt. Der Heap ist jedoch nicht threadsicher und muss aus Sicherheitsgründen synchronisiert werden.


3

Sie sind fast gleich ... Aber der Hauptunterschied besteht darin, dass ein Thread leichtgewichtig ist und ein Prozess in Bezug auf Kontextwechsel, Arbeitslast usw. schwergewichtig ist.


Könnten Sie Ihre Antwort erweitern?
Fiver

3
Thread ist ein Unterprozess, sie teilen gemeinsame Ressourcen wie Code, Daten und Dateien innerhalb eines Prozesses. Die beiden Prozesse können keine Ressourcen gemeinsam nutzen (Ausnahmen sind, wenn ein Prozess (übergeordnet) einen anderen Prozess (untergeordnet) erstellt, können sie dies standardmäßig tun Ressourcen gemeinsam nutzen.), erfordert eine hohe Nutzlast für Ressourcen an die CPU, während Threads in diesem Kontext viel leichter sind. Obwohl beide die gleichen Eigenschaften haben. Szenario: Wenn ein einzelner Thread-Prozess aufgrund einer E / A blockiert ist, wird die gesamte 1 aufgerufen Der Wartezustand, aber wenn der Multithread-Prozess durch E / A blockiert wird, wird nur der betreffende E / A-Thread blockiert.
Nasir Ul Islam Butt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.