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?
multithreading
process
operating-system
James Fassett
quelle
quelle
Antworten:
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.
quelle
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
quelle
Prozess:
Faden:
Ich habe die obigen Informationen von der Knowledge Quest ausgeliehen! Blog .
quelle
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:
Er fährt fort:
Weiter unten liefert er die folgende Tabelle:
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.
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".
quelle
Weitere Erläuterungen zur gleichzeitigen Programmierung
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.
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.
quelle
Von hier gestohlen .
quelle
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.
quelle
Beispiel aus der Praxis für Prozess und Thread Hier erhalten Sie eine grundlegende Vorstellung von Thread und Prozess
Ich habe die obigen Informationen aus Scott Langhams Antwort ausgeliehen - danke
quelle
Prozess:
Beispiel:
Öffnen Sie beispielsweise einen beliebigen Browser (Mozilla, Chrome, IE). An diesem Punkt beginnt die Ausführung eines neuen Prozesses.
Themen:
Beispiel:
Öffnen mehrerer Registerkarten im Browser.
quelle
quelle
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:
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 .
quelle
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
quelle
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
quelle
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
.text
zur Speicherung kompilierter Code segement,.bss
fü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_struct
die 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_struct
Struktur, 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.quelle
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).
quelle
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.
Threads sind einfacher zu erstellen als Prozesse, da sie keinen separaten Adressraum benötigen.
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.
Threads gelten als leichtgewichtig, da sie weitaus weniger Ressourcen als Prozesse verbrauchen.
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.
Ein Prozess kann aus mehreren Threads bestehen.
quelle
Folgendes habe ich aus einem der Artikel über The Code Project erhalten . Ich denke, es erklärt alles, was benötigt wird, klar.
quelle
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
quelle
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:
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 .
quelle
quelle
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
quelle
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:
quelle
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Die beste Antwort, die ich bisher gefunden habe, ist Michael Kerrisk 'The Linux Programming Interface' :
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 .
quelle
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.
quelle
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.
quelle