Frage

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 mit Erlang? Gibt es einen endgültigen Grund, einen Begriff über den anderen zu verwenden?

War es hilfreich?

Lösung

Sowohl Prozesse als auch Threads sind unabhängige Ausführungssequenzen. Der typische Unterschied besteht darin, dass Threads (des gleichen Vorgangs) in einem gemeinsamen Speicherraum ausgeführt werden, während Prozesse in separaten Speicherplätzen ausgeführt werden.

Ich bin mir nicht sicher, auf welche "Hardware" gegen "Software" -Threads Sie sich möglicherweise beziehen. Threads sind eine Funktionsfunktion der Betriebsumgebung und nicht eine CPU -Funktion (obwohl die CPU normalerweise Vorgänge hat, die Threads effizient machen).

Erlang verwendet den Begriff "Prozess", da er kein gemeinsam genutztes Multiprogrammierungsmodell enthüllt. Wenn Sie sie als "Threads" bezeichnen, würde sie implizieren, dass sie Speicher geteilt haben.

Andere Tipps

Verfahren
Jeder Prozess enthält die Ressourcen, die für die Ausführung eines Programms erforderlich sind. Ein Prozess verfügt über einen virtuellen Adressraum, einen ausführbaren Code, offene Handles zu Systemobjekten, 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 oft als primärer Thread bezeichnet wird, aber zusätzliche Threads aus einem seiner Threads erstellen kann.

Faden
Ein Thread ist eine Entität in einem Prozess, der für die Ausführung geplant werden kann. Alle Themen eines Prozesses teilen seinen virtuellen Adressraum und seine Systemressourcen. Darüber hinaus verwaltet jeder Thread Ausnahmehandler, eine Planungspriorität, ein lokaler Speicher der Thread -Lokale, eine eindeutige Thread -Kennung und eine Reihe von Strukturen, mit denen das System den Thread -Kontext speichert, bis er geplant ist. Der Thread -Kontext enthält den Set von Maschinenregistern des Threads, den Kernel -Stapel, einen Thread -Umgebungsblock und einen Benutzerstapel im Adressraum des Thread -Prozesses. Themen können auch einen eigenen Sicherheitskontext haben, der zum Imitieren von Kunden verwendet werden kann.


Fand dies hier auf msdn:
Über Prozesse und Fäden

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

Verfahren:

  • Eine ausführende Instanz eines Programms wird als Prozess bezeichnet.
  • Einige Betriebssysteme verwenden den Begriff "Aufgabe", um auf ein Programm zu verweisen, das ausgeführt wird.
  • Ein Vorgang wird immer im Hauptspeicher gespeichert, der auch als primärer Speicher oder Zufallszugriffsspeicher bezeichnet wird.
  • Daher wird ein Prozess als aktive Einheit bezeichnet. Es verschwindet, wenn die Maschine neu gestartet wird.
  • Mehrere Prozesse können mit demselben Programm verbunden sein.
  • Bei einem Multiprozessorsystem können mehrere Prozesse parallel ausgeführt werden.
  • Bei einem Uni-Processor-System wird zwar keine echte Parallelität erreicht, ein Prozessplanungsalgorithmus wird angewendet, und der Prozessor soll jeden Prozess einzeln ausführen, der eine Illusion der Parallelität ergibt.
  • Beispiel: Ausführung mehrerer Instanzen des "Taschenrechner" -Programms. Jeder der Fälle wird als Prozess bezeichnet.

Faden:

  • Ein Thread ist eine Teilmenge des Prozesses.
  • Es wird als "leichter Prozess" bezeichnet, da es einem realen Prozess ähnlich ist, jedoch im Kontext eines Prozesses ausgeführt wird und dieselben Ressourcen teilt, die dem Kernel dem Prozess zugeteilt werden.
  • Normalerweise hat ein Prozess nur einen Kontrollfaden - ein Satz von Maschinenanweisungen, die gleichzeitig ausgeführt werden.
  • Ein Prozess kann auch aus mehreren Ausführungen bestehen, die gleichzeitig Anweisungen ausführen.
  • Mehrere Kontrollfäden können die wahre Parallelität für Multiprozessorsysteme ausnutzen.
  • Auf einem Uni-Processor-System wird ein Thread-Planungsalgorithmus angewendet, und der Prozessor soll jeden Thread nacheinander ausführen.
  • Alle in einem Prozess ausgeführten Threads teilen denselben Adressraum, Dateideskriptoren, Stapel und andere prozessbezogene Attribute.
  • Da die Threads eines Prozesses denselben Speicher teilen, gewinnt die Synchronisierung des Zugriffs auf die gemeinsam genutzten Daten innerhalb des Prozesses beispiellose Bedeutung.

Ich habe die obigen Informationen aus dem ausgeliehen Wissensquest! Blog.

Schauen wir uns zunächst den theoretischen Aspekt an. Sie müssen verstehen, was ein Prozess konzeptionell ist, um den Unterschied zwischen einem Prozess und einem Thread und dem, was zwischen ihnen geteilt wird, zu verstehen.

Wir haben Folgendes aus dem Abschnitt 2.2.2 Das klassische Threadmodell in Moderne Betriebssysteme 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 Themen ins Spiel ....

Er fährt fort:

Eine Möglichkeit, einen Prozess zu betrachten, besteht darin, dass dies eine Möglichkeit ist, verwandte Ressourcen zusammen zu gruppieren. Ein Prozess verfügt über einen Adressraum, der Programmtext und Daten sowie andere Ressourcen enthält. Diese Ressource kann offene Dateien, untergeordnete Prozesse, ausstehende Alarme, Signalhandler, Buchhaltungsinformationen und mehr umfassen. Indem sie sie in Form eines Prozesses zusammenstellen, können sie leichter verwaltet werden. Das andere Konzept, das ein Prozess hat, ist ein Ausführungsfaden, der normalerweise auf nur Faden verkürzt wird. Der Thread verfügt über einen Programmzähler, der im Auge behält, welche Anweisung als nächstes ausgeführt werden soll. Es hat Register, die seine aktuellen Arbeitsvariablen halten. Es hat einen Stapel, der den Ausführungsverlauf enthält, mit einem Frame für jedes aufgerufene Verfahren, aber noch nicht zurückgegeben. Obwohl ein Thread in einem Prozess ausgeführt werden muss, sind der Thread und sein Prozess unterschiedliche Konzepte und können separat behandelt werden. Prozesse werden verwendet, um Ressourcen zusammen zu gruppieren. Themen sind die Entitäten, die für die Ausführung auf der CPU geplant sind.

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 mit dem umgehen Hardware -Multithreading Ausgabe. Klassischerweise würde eine CPU einen einzelnen Ausführungsthread unterstützen, der den Status des Threads über einen einzelnen Programmzähler und eine Reihe von Registern beibehält. Aber was passiert, wenn es einen Cache -Miss gibt? Es dauert lange, um Daten aus dem Hauptspeicher zu holen, und während dies geschieht, sitzt die CPU nur im Leerlauf dort. Jemand hatte also die Idee, im Grunde genommen zwei Sätze von Thread -Status (PC + Registers) zu haben, damit ein anderer Thread (möglicherweise im selben Prozess, möglicherweise in einem anderen Prozess) Arbeit erledigt werden kann, während der andere Thread auf den Hauptspeicher wartet. Es gibt mehrere Namen und Implementierungen dieses Konzepts wie Hyperthreading und Simultanes Multithreading (Kurz SMT).

Schauen wir uns nun die Softwareseite an. Grundsätzlich können Threads auf der Softwareseite implementiert werden.

  1. Benutzerspace -Threads
  2. Kernelfäden
  3. Eine Kombination der beiden

Alles, was Sie benötigen, um Threads zu implementieren, ist die Möglichkeit, den CPU -Status zu speichern und mehrere Stapel zu verwalten, die in vielen Fällen im Benutzerbereich erfolgen können. Der Vorteil von Benutzerraum -Threads ist ein superschnelles Thread -Switching, da Sie nicht in den Kernel fangen müssen und Ihre Threads so planen müssen, wie Sie möchten. Der größte Nachteil ist die Unfähigkeit, das Blockieren von E/A (die den gesamten Prozess und alle Benutzerfäden blockieren würde) zu erledigen. Dies ist einer der großen Gründe, warum wir überhaupt Threads verwenden. Das Blockieren der I/A -Verwendung von Threads vereinfacht in vielen Fällen das Programmdesign erheblich.

Kernel -Threads haben den Vorteil, dass Sie die Blockierung von E/A verwenden können und alle Planungsprobleme dem Betriebssystem überlassen. Jeder Fadenschalter erfordert jedoch ein Einfangen in den Kernel, der möglicherweise relativ langsam ist. Wenn Sie jedoch wegen blockierter I/O -Threads wechseln, ist dies jedoch kein Problem, da der I/A -Vorgang Sie wahrscheinlich schon sowieso in den Kernel eingeschlossen ist.

Ein anderer Ansatz besteht darin, die beiden mit mehreren Kernel -Threads zu kombinieren, die jeweils mehrere Benutzer -Threads haben.

Wenn Sie also zu Ihrer Frage der Terminologie zurückkehren, können Sie feststellen, dass ein Prozess und ein Ausführungsthread zwei verschiedene Konzepte sind und Ihre Wahl, welche Begriff zu verwenden ist, von dem abhängt, worüber Sie sprechen. In Bezug auf den Begriff "Leichtgewichtsprozess" sehe ich nicht persönlich den Punkt darin, da er nicht wirklich vermittelt, was vor sich geht, sowie den Begriff "Ausführungsthread".

Mehr in Bezug auf die gleichzeitige Programmierung zu erklären

  1. Ein Prozess hat eine in sich geschlossene Ausführungsumgebung. Ein Prozess hat im Allgemeinen eine vollständige private Reihe grundlegender Laufzeitressourcen. Insbesondere hat jeder Prozess seinen eigenen Speicherplatz.

  2. Innerhalb eines Prozesses existieren Themen - jeder Prozess hat mindestens einen. Themen teilen die Ressourcen des Prozesses, einschließlich Speicher- und Öffnungsdateien. Dies sorgt für eine effiziente, aber potenziell problematische Kommunikation.

Durchschnittliche Person im Auge behalten,

Öffnen Sie Microsoft Word und Webbrowser auf Ihrem Computer. 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 - Bearbeitung auf einem Thread und Speichern auf dem anderen Thread.

Eine Anwendung besteht aus einem oder mehreren Prozessen. Ein Prozess ist im einfachsten Hinsicht ein ausführendes Programm. Ein oder mehrere Threads werden im Kontext des Prozesses ausgeführt. Ein Thread ist die grundlegende Einheit, für die das Betriebssystem die Prozessorzeit zuweist. Ein Thread kann jeden Teil des Prozesscodes ausführen, einschließlich 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.

Gestohlen von hier.

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 haben, die gleichzeitig innerhalb desselben Prozesses ausgeführt werden.

  • Jeder Prozess ist ein Thread (primärer Thread).
  • Aber jeder Thread ist kein Prozess. Es ist ein Teil (Einheit) eines Prozesses.

Beispiel für reale Welt für Prozess und Thread Dies gibt Ihnen die Grundvorstellung von Thread und Prozess enter image description here

Ich habe die obigen Informationen aus Scott Langhams Antwort geliehen - Danke

Verfahren:

  1. Prozess ist ein starker Gewichtsprozess.
  2. Prozess ist ein separates Programm mit separatem Speicher, Daten und Ressourcen.
  3. Der Prozess wird mit der Fork () -Methode erstellt.
  4. Der Kontextwechsel zwischen dem Prozess ist zeitaufwändig.

Beispiel:
Sagen Sie, öffnen Sie jeden Browser (Mozilla, Chrom, dh). Zu diesem Zeitpunkt beginnt der neue Prozess auszuführen.

Themen:

  1. Fäden sind leichte Verfahren. Die Threads sind im Inneren des Prozesses gebündelt.
  2. Themen haben einen gemeinsam genutzten Speicher, Daten, Ressourcen, Dateien usw.
  3. Themen werden mit der Clone () -Methode erstellt.
  4. Der Kontextschalter zwischen den Threads ist als Prozess nicht viel zeitaufwändig.

Beispiel:
Öffnen Sie mehrere Registerkarten im Browser.

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

  • Freigegebene Ressourcen (Threads teilen Speicher per Definition, sie besitzen nichts außer Stack- und lokalen Variablen; Prozesse könnten auch Speicher teilen, es gibt jedoch einen separaten Mechanismus dafür, der von OS aufrechterhalten wird).
  • Allokationsraum (Kernel -Speicherplatz für Prozesse im Vergleich zu Benutzerraum für Threads)

Greg Hewgill oben war richtig über die Erlang -Bedeutung des Wortes "Prozess", und hier Es gibt eine Diskussion darüber, warum Erlang Prozess mit leichtem Gewicht verarbeitet.

Sowohl Prozesse als auch Threads sind unabhängige Ausführungssequenzen. Der typische Unterschied besteht darin, dass Threads (des gleichen Vorgangs) in einem gemeinsamen Speicherraum ausgeführt werden, während Prozesse in separaten Speicherplätzen ausgeführt werden.

Verfahren

Ist ein Programm in der Ausführung. Es verfügt über einen Textabschnitt, dh der Programmcode, aktuelle Aktivität, die durch den Wert des Programmzählers und des Inhalts des Prozessorenregister dargestellt wird. Es enthält auch den Prozessstapel, der temporäre Daten (z. B. Funktionsparameter, Rückgabeberechtigung und lokale Variablen) und einen Datenabschnitt enthält, der globale Variablen enthält. Ein Prozess kann auch einen Heap enthalten, der Speicher ist, der während der Prozesslaufzeit dynamisch zugewiesen wird.

Faden

Ein Faden ist eine grundlegende Einheit der CPU -Auslastung. Es umfasst eine Thread -ID, einen Programmzähler, Register -Set und einen Stapel. Es wurde mit anderen Threads geteilt, die zu demselben Prozess des Abschnitts, des Datenabschnitts und anderer Betriebssystemressourcen wie geöffneten Dateien und Signale gehören.

- vom Betriebssystem von Galvin entnommen

Der Versuch, diese Frage in Bezug auf Java World zu beantworten.

Ein Prozess ist eine Ausführung eines Programms, aber ein Thread ist eine einzige Ausführungssequenz innerhalb des Prozesses. Ein Prozess kann mehrere Threads enthalten. Ein Faden wird manchmal als a genannt Leichter Prozess.

Zum Beispiel:

Beispiel 1: Ein JVM läuft in einem einzigen Prozess und Threads in einem JVM teilen den Haufen, der zu diesem Prozess gehört. Deshalb können mehrere Threads auf dasselbe Objekt zugreifen. Themen teilen den Haufen und haben ihren eigenen Stapelraum. Auf diese Weise werden die Aufruf eines Threads von einer Methode und seiner lokalen Variablen vor anderen Threads gesichert. Der Haufen ist jedoch nicht mit Gewinde sicher und muss für die Gewindesicherheit synchronisiert werden.

Beispiel 2: Ein Programm kann möglicherweise keine Bilder durch Lesen von Tastenanschlägen zeichnen. Das Programm muss dem Tastatureingang seine volle Aufmerksamkeit schenken, und ohne die Möglichkeit, mehr als ein Ereignis gleichzeitig zu verarbeiten, führt zu Problemen. Die ideale Lösung für dieses Problem ist die nahtlose Ausführung von zwei oder mehr Abschnitten eines Programms gleichzeitig. Mit Themen können wir dies tun. Hier ist das Zeichnen eines Vorgangs und des Lesens Tastenanschlag Sub Process (Thread).

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 ausführen kann, was ein Prozess ausführen kann. Da ein Prozess jedoch aus mehreren Threads bestehen kann, kann ein Faden als "leichtes" Prozess angesehen werden. Der wesentliche Unterschied zwischen einem Thread und einem Prozess ist daher die Arbeit, für die jeder verwendet wird. Themen werden für kleine Aufgaben verwendet, während Prozesse für mehr "Schwergewichts" -Tasks verwendet werden - im Grunde die Ausführung von Anwendungen.

Ein weiterer Unterschied zwischen einem Thread und einem Prozess besteht darin, dass Threads innerhalb desselben Prozesses denselben Adressraum teilen, während unterschiedliche Prozesse dies nicht tun. Auf diese Weise können Threads dieselben Datenstrukturen und Variablen aus lesen und schreiben und die Kommunikation zwischen Threads erleichtern. Die Kommunikation zwischen Prozessen-auch als IPC oder Inter-Process-Kommunikation bezeichnet-ist ziemlich schwierig und ressourcenintensiv.

Hier ist eine Zusammenfassung der Unterschiede zwischen Themen und Prozessen:

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

  2. Multithreading erfordert sorgfältige Programmierung, da Threads Datenstrukturen teilen, die nur durch einen Thread gleichzeitig geändert werden sollten. Im Gegensatz zu Threads teilen Prozesse nicht den gleichen Adressraum.

  3. Themen werden als leicht angesehen, da sie weit weniger Ressourcen als Prozesse verwenden.

  4. Prozesse sind unabhängig voneinander. Themen, da sie den gleichen Adressraum teilen, sind voneinander abhängig, sodass Vorsicht genommen werden muss, damit verschiedene Threads nicht aufeinander treten.
    Dies ist wirklich eine weitere Möglichkeit, #2 oben anzugeben.

  5. Ein Prozess kann aus mehreren Threads bestehen.

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: oops in get_hash_table"

Vorherige Nachricht: Linus torvalds: "Re: I/O -Anfrage -Bestellung"

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

Wir müssen das Konzept der Threads klar halten. Zu viele Menschen scheinen einen Thread mit einem Prozess zu verwechseln. Die folgende Diskussion spiegelt nicht den aktuellen Zustand der Linux wider, sondern ist ein Versuch, auf einer hohen Diskussion zu bleiben.

NEIN!

Es gibt keinen Grund zu der Annahme, dass "Threads" und "Prozesse" getrennte Einheiten sind. So wird es traditionell getan, aber ich persönlich denke, es ist ein großer Fehler, so zu denken. Der einzige Grund, auf diese Weise 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 als Coe genannt, ist nur das Konglomerat aller Staaten dieses COE. Dieser Staat umfasst Dinge wie CPU -Staat (Register usw.), MMU -Staat (Seitenzuordnungen), Berechtigungsstatus (UID, GID) und verschiedene "Kommunikationszustände" (offene Dateien, Signalhandler usw.). Traditionell war der Unterschied zwischen einem "Thread" und einem "Prozess" hauptsächlich, dass ein Thread den CPU -Zustand (+ möglicherweise einen anderen minimalen Zustand) hat, während der gesamte andere Kontext aus dem Prozess stammt. Das ist jedoch nur eines Art, den Gesamtzustand des COE aufzuteilen, und es gibt nichts, was besagt, dass es der richtige Weg ist, dies zu tun. Sich auf diese Art von Bild zu beschränken, ist einfach nur dumm.

Die Art und Weise, wie Linux darüber denkt (und wie ich die Dinge funktionieren möchte), ist, dass es dort gibt ist Kein "Prozess" oder "Thread". Es gibt nur die Gesamtheit des COE (von Linux genannt "Aufgabe"). Verschiedene Coe können Teile ihres Kontextes miteinander teilen und eines Teilmenge Von dieser Teile ist das traditionelle "Thread"/"-Prozess" -Setup, aber das sollte wirklich nur als Teilmenge angesehen werden (es ist eine wichtige Teilmenge, aber diese Bedeutung kommt nicht aus Design, sondern aus den Standards: Wir wollen natürlich Standards ausführen. Konforme Threads -Programme auch auf Linux).

Kurz gesagt: Entwerfen Sie nicht um die Denkweise des Fadens/die Prozesse. Der Kernel sollte um die COE -Denkweise und dann die Phreads gestaltet werden Bibliothek Kann die begrenzte PTHREADS -Schnittstelle an Benutzer exportieren, die diese Art zum Betrachten von CoEs verwenden möchten.

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

  • Sie können ein externes "CD" -Programm durchführen, das traditionell in Unix und/oder Process/Thread traditionell unmöglich ist (dumme Beispiel, aber die Idee ist, dass Sie solche "Module" haben können, die nicht auf die traditionelle Unix -Unix beschränkt sind /Threads Setup). Tun a:

Clone (Clone_VM | Clone_fs);

Kind: Execve ("externe CD");

/ * Das "execve ()" wird die VM abbauen, sodass der einzige Grund, warum wir Clone_VM verwendeten

  • Sie können natürlich "vfork ()" machen (es ist minimaler Kernelunterstützung, aber diese Unterstützung passt perfekt zum Cua -Denkweise):

Clone (Clone_VM);

Kind: Fahren Sie weiter, führen Sie schließlich aus ()

Mutter: Warten Sie auf Execve

  • Sie können externe "IO Deamons" machen:

Clone (Clone_files);

Kind: Dateideskriptoren geöffnet usw.

Mutter: Verwenden Sie die FD's The Child Opened und VV.

Alle oben genannten Arbeiten, weil Sie nicht an die Denkweise des Threads/die Prozesse gebunden sind. Stellen Sie sich beispielsweise einen Webserver vor, auf dem die CGI -Skripte als "Ausführungsfäden" durchgeführt werden. Sie können dies nicht mit herkömmlichen Threads tun, da herkömmliche Threads immer den gesamten Adressraum teilen müssen, sodass Sie in allem, was Sie jemals auf dem Webserver selbst tun wollten eine andere ausführbare Datei).

Wenn Sie dies als "Kontext der Ausführung" -Problem denken, können Ihre Aufgaben jetzt entscheiden, externe Programme auszuführen (= trennen außer Für die Dateideskriptoren (damit die Sub- "Threads" viele Dateien öffnen können, ohne dass die Eltern sich um sie kümmern müssen: Sie schließen automatisch, wenn der Sub- "Thread" beendet ist, und es werden keine FDs im Elternteil verwendet ).

Denken Sie zum Beispiel an einen Thread "Inetd". Sie möchten niedrige Overhead Fork+EXEC. Mit der Linux-Art können Sie also einen "fork ()" verwenden, wenn Sie einen Multi-Thread-INETD schreiben, bei dem jeder Thread mit nur Clone_VM erstellt wird (Adressspeicher freigeben, aber keine Datei freigeben Deskriptoren usw.). Dann kann das Kind umführen, wenn es sich um einen externen Dienst (z.

Sie können das nicht mit "Thread"/"Prozess" tun.

Linus

Aus der Sicht eines Interviewers gibt es im Grunde genommen nur drei Hauptdinge, die ich hören möchte, außer offensichtlichen Dingen wie einem Prozess können mehrere Fäden auftreten:

  1. Threads teilen denselben Speicherplatz, was bedeutet, dass ein Thread aus dem Thread -Speicher anderer auf Speicher zugreifen kann. Prozesse können normalerweise nicht.
  2. Ressourcen. Ressourcen (Speicher, Griffe, Sockel usw.) werden bei Prozessabschlüssen veröffentlicht, nicht bei Fadenabschlüssen.
  3. Sicherheit. Ein Prozess hat einen festen Sicherheitstoken. Ein Thread hingegen kann sich als verschiedene Benutzer/Token ausgeben.

Wenn Sie mehr wollen, deckt Scott Langhams Antwort alles so gut wie alles ab. All dies stammt aus der Perspektive eines Betriebssystems. Verschiedene Sprachen können unterschiedliche Konzepte wie Aufgaben, leichte Fäden usw. implementieren. Sie sind jedoch nur Möglichkeiten, Threads (von Fasern an Fenstern) zu verwenden. Es gibt keine Hardware- und Software -Threads. Es gibt Hardware und Software Ausnahmen und Interrupts, oder Benutzermodus und Kernel Themen.

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

Das Folgende ist das, was ich von einem der Artikel über bekommen habe Das Codeprojekt. Ich denke, es erklärt alles klar, was erforderlich ist.

Ein Thread ist ein weiterer Mechanismus zur Aufteilung der Workload in separate Ausführungsströme. Ein Faden ist leichter als ein Prozess. Dies bedeutet, dass es weniger Flexibilität bietet als ein ausgeblasener Prozess, kann jedoch schneller initiiert werden, da das Betriebssystem weniger eingerichtet werden kann. Wenn ein Programm aus zwei oder mehr Threads besteht, teilen alle Threads einen einzelnen Speicherplatz. Prozesse erhalten separate Adressräume. Alle Threads teilen sich einen einzelnen Haufen. Aber jeder Thread erhält seinen eigenen Stapel.

  1. Grundsätzlich ist ein Thread Teil eines Prozesses ohne Prozess -Thread nicht in der Lage zu arbeiten.
  2. Ein Faden ist leicht, während der Prozess schwer ist.
  3. Die Kommunikation zwischen dem Prozess erfordert einige Zeit, während Thread weniger Zeit erfordert.
  4. Themen können den gleichen Speicherbereich teilen, während der Prozess in separatem Prozess lebt.

Verfahren: Programm unter Ausführung wird als Prozess bezeichnet

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

Wenn ich aus der eingebetteten Welt stammt, möchte ich hinzufügen, dass das Konzept der Prozesse nur in "großen" Prozessoren existiert (Desktop-CPUs, Arm Cortex A-9), die MMU (Speicherverwaltungseinheit) und Betriebssysteme haben, die die Verwendung von MMUs (wie z. Linux). Mit kleinen/alten Prozessoren und Mikrocontrollern und kleinem RTOs -Betriebssystem (Echtzeitbetriebssystem), wie Freertos, es gibt keine MMU -Unterstützung und damit keine Prozesse, sondern nur Fäden.

Themen Kann auf den Speicher auf den Speicher zugreifen, und sie werden von OS auf verschachtelte Weise geplant, so dass sie parallel (oder mit Multi-Core-Unternehmen, die sie wirklich parallel laufen) zu laufen.

Prozesse, Auf der anderen Seite leben Sie in ihrem privaten Sandkasten mit virtuellem Gedächtnis, der von MMU bereitgestellt und bewacht wird. Dies ist praktisch, weil es ermöglicht:

  1. Verhindern Sie den Buggy -Prozess, das gesamte System zu stürzen.
  2. Aufrechterhaltung der Sicherheit, indem andere Prozesse Daten unsichtbar und nicht erreichbar machen. Die tatsächlichen Arbeiten innerhalb des Prozesses werden von einem oder mehreren Threads gepflegt.

Beim Aufbau eines Algorithmus in Python (interpretierte Sprache), das Multi-Threading enthielt, war ich überrascht zu sehen, dass die Ausführungszeit im Vergleich zu dem zuvor gebauten sequentiellen Algorithmus nicht besser war. Um den Grund für dieses Ergebnis zu verstehen, habe ich einige gelesen und glaube, dass das, was ich gelernt habe, einen interessanten Kontext bietet, um die Unterschiede zwischen Multi-Threading und Multi-Processe besser zu verstehen.

Multi-Core-Systeme können mehrere Ausführungsfäden ausüben, und so sollte Python Multi-Threading unterstützen. Aber Python ist keine kompilierte Sprache und stattdessen eine interpretierte Sprache1. Dies bedeutet, dass das Programm interpretiert werden muss, um auszuführen, und der Dolmetscher ist sich des Programms nicht bewusst, bevor es mit der Ausführung beginnt. Was es jedoch weiß, sind die Regeln von Python und es wendet diese Regeln dynamisch an. Optimierungen in Python müssen dann hauptsächlich Optimierungen des Dolmetschers selbst sein und nicht der Code, der ausgeführt werden soll. Dies steht im Gegensatz zu kompilierten Sprachen wie C ++ und hat Konsequenzen für Multi-Threading in Python. Insbesondere verwendet Python das Global Interpreter Lock, um Multi-Threading zu verwalten.

Andererseits ist eine kompilierte Sprache gut zusammengestellt. Das Programm wird "ganz" verarbeitet, wo es zuerst nach seinen syntaktischen Definitionen interpretiert, dann einer agnostischen Zwischendarstellung der Sprache zugeordnet und schließlich in einen ausführbaren Code verbunden ist. Mit diesem Prozess kann der Code hoch optimiert werden, da alles zum Zeitpunkt der Zusammenstellung verfügbar ist. Die verschiedenen Programminteraktionen und Beziehungen werden zum Zeitpunkt der Erstellung der ausführbaren Datei definiert und es können robuste Entscheidungen über Optimierung getroffen werden.

In modernen Umgebungen muss Pythons Interpreter Multi-Threading zulassen, und dies muss sowohl sicher als auch effizient sein. Hier tritt der Unterschied zwischen einer interpretierten Sprache und einer kompilierten Sprache in das Bild ein. Der Dolmetscher darf intern gemeinsame Daten aus verschiedenen Threads nicht stören und gleichzeitig die Verwendung von Prozessoren für Berechnungen optimieren.

Wie in den vorherigen Posts erwähnt, sind sowohl ein Prozess als auch ein Thread unabhängige sequentielle Ausführungen, wobei der primäre Unterschied darin besteht, dass das Speicher über mehrere Threads eines Prozesses teilgenommen wird, während Prozesse ihre Speicherplätze isolieren.

In Python werden Daten durch die globale Interpreter -Sperre vor verschiedenen Threads vor verschiedenen Threads geschützt. Es erfordert, dass in jedem Python -Programm jederzeit 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 der Kunst der Computerprogrammierung: grundlegende Algorithmen.

Der Versuch, es aus der Betriebssystem von Linux Kernel zu beantworten

Ein Programm wird zu einem Prozess, wenn er in den Speicher gestartet wird. Ein Prozess hat einen eigenen Adressraum, was bedeutet, dass verschiedene Segmente im Speicher wie z. Stapel. Im Kernel würde jeder Prozess einen eigenen Kernel -Stack (der für Sicherheitsprobleme vom Nutzer -Space -Stack getrennt ist) und eine Struktur mit dem Namen task_struct Dies wird im Allgemeinen als Prozesskontrollblock abstrahiert und speichert alle Informationen über den Prozess wie Priorität, Status, und eine ganze Menge anderer Stück). Ein Prozess kann mehrere Ausführungsfäden haben.

Wenn sie zu Threads kommen, befinden sie sich in einem Prozess und teilen den Adressraum des übergeordneten Prozesses zusammen mit anderen Ressourcen, die während der Erstellung von Threads übergeben werden können, wie z. Daher ermöglichen Sie schnelleres Kontextschalter. Im Kernel hat jeder Faden einen eigenen Kernelstapel zusammen mit dem task_struct Struktur, die den Faden definiert. Daher betrachtet Kernel Themen desselben Prozesses wie verschiedene Einheiten und sind in sich selbst planen. Themen im gleichen Prozess teilen eine gemeinsame ID, die als Thread -Gruppen -ID bezeichnet wird (id (Thread Group) (tgid), auch eine eindeutige ID, die als Prozess -ID bezeichnet wird ((pid).

Für diejenigen, die sich mit dem Lernen durch Visualisierung bequemer fühlen, finden Sie hier ein praktisches Diagramm, das ich erstellt habe, um Prozess und Threads zu erklären.
Ich habe die Informationen von msdn - verwendet - Über Prozesse und Fäden

Processes and Threads

Themen innerhalb desselben Vorgangs teilen den Speicher, aber jeder Thread verfügt über einen eigenen Stapel und seine Register, und Threads speichern threadspezifische Daten im Heap. Themen werden niemals unabhängig ausgeführt, sodass die Kommunikation zwischen den Threads im Vergleich zur Kommunikation mit Interprozess viel schneller ist.

Prozesse teilen nie den gleichen Speicher. Wenn ein Kinderprozess erstellt, dupliziert er den Speicherort des übergeordneten Prozesss. Die Prozesskommunikation erfolgt durch Verwendung von Pipe, Shared Memory und Message Parsing. Der Kontextwechsel zwischen Threads ist sehr langsam.

Beste Antwort

Verfahren:

Prozess ist im Grunde ein Programm in der Ausführung. Es ist eine aktive Einheit. Einige Betriebssysteme verwenden den Begriff "Aufgabe", um auf ein Programm zu verweisen, das ausgeführt wird. Ein Vorgang wird immer im Hauptspeicher gespeichert, der auch als primärer Speicher oder Zufallszugriffsspeicher bezeichnet wird. Daher wird ein Prozess als aktive Einheit bezeichnet. Es verschwindet, wenn die Maschine neu gestartet wird. Mehrere Prozesse können mit demselben Programm verbunden sein. Bei einem Multiprozessorsystem können mehrere Prozesse parallel ausgeführt werden. Bei einem Uni-Processor-System wird zwar keine echte Parallelität erreicht, ein Prozessplanungsalgorithmus wird angewendet, und der Prozessor soll jeden Prozess einzeln ausführen, der eine Illusion der Parallelität ergibt. Beispiel: Ausführen mehrerer Instanzen des "Taschenrechner" -Programms. Jeder der Fälle wird als Prozess bezeichnet.

Faden:

Ein Thread ist eine Teilmenge des Prozesses. Es wird als "leichter Prozess" bezeichnet, da es einem realen Prozess ähnlich ist, jedoch im Kontext eines Prozesses ausgeführt wird und dieselben Ressourcen teilt, die dem Kernel dem Prozess zugeteilt werden. Normalerweise hat ein Prozess nur einen Kontrollfaden - ein Satz von Maschinenanweisungen, die gleichzeitig ausgeführt werden. Ein Prozess kann auch aus mehreren Ausführungen bestehen, die gleichzeitig Anweisungen ausführen. Mehrere Kontrollfäden können die wahre Parallelität für Multiprozessorsysteme ausnutzen. Auf einem Uni-Processor-System wird ein Thread-Planungsalgorithmus angewendet, und der Prozessor soll jeden Thread nacheinander ausführen. Alle in einem Prozess ausgeführten Threads teilen denselben Adressraum, Dateideskriptoren, Stapel und andere prozessbezogene Attribute. Da die Threads eines Prozesses denselben Speicher teilen, gewinnt die Synchronisierung des Zugriffs auf die gemeinsam genutzten Daten mit dem Prozess beispiellose Bedeutung.

Ref-https://practice.geeksforgeeks.org/problems/diffferenz-between-process-and-thread

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

In modernen Unix -Implementierungen kann jeder Prozess mehrere Ausführungsfäden aufweisen. Eine Möglichkeit, Threads vorzustellen, ist eine Reihe von Prozessen, die denselben virtuellen Speicher sowie eine Reihe anderer Attribute teilen. Jeder Thread führt denselben Programmcode aus und teilt denselben Datenbereich und denselben Haufen. In jedem Thread verfügt jedoch über seinen eigenen Stapel, der lokale Variablen und Funktionen für Funktionsaufrufe enthält. [LPI 2.12

Dieses Buch ist eine Quelle großer Klarheit; Julia Evans erwähnte ihre Hilfe bei der Aufklärung, wie Linux -Gruppen wirklich arbeiten Dieser Artikel.

Sie sind fast genauso ... aber der Hauptunterschied ist, dass ein Faden leicht ist und ein Prozess in Bezug auf das Kontextschalter, die Arbeitsbelastung usw. schwerwiegend ist.

Beispiel 1: Ein JVM läuft in einem einzigen Prozess und Threads in einem JVM teilen den Haufen, der zu diesem Prozess gehört. Deshalb können mehrere Threads auf dasselbe Objekt zugreifen. Themen teilen den Haufen und haben ihren eigenen Stapelraum. Auf diese Weise werden die Aufruf eines Threads von einer Methode und seiner lokalen Variablen vor anderen Threads gesichert. Der Haufen ist jedoch nicht mit Gewinde sicher und muss für die Gewindesicherheit synchronisiert werden.

Betrachten Sie den Prozess wie eine Eigentumseinheit oder welche Ressourcen von einer Aufgabe benötigt werden. Ein Prozess kann Ressourcen wie Speicherplatz, spezifische Eingabe/Ausgabe, spezifische Dateien und Priorität usw. haben.

Ein Thread ist eine Versandeinheit der Ausführung oder in einfachen Worten den Fortschritt durch eine Folge von Anweisungen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top