Was ist der Unterschied zwischen Gabel und Gewinde?


Antworten:


94

Mit einer Gabel erhalten Sie einen brandneuen Prozess, der eine Kopie des aktuellen Prozesses mit denselben Codesegmenten ist. Wenn sich das Speicherabbild ändert (dies ist normalerweise auf das unterschiedliche Verhalten der beiden Prozesse zurückzuführen), erhalten Sie eine Trennung der Speicherabbildungen (Copy On Write), der ausführbare Code bleibt jedoch gleich. Aufgaben teilen sich keinen Speicher, es sei denn, sie verwenden ein IPC-Grundelement (Inter Process Communication) .

Ein Prozess kann mehrere Threads haben, die jeweils parallel im selben Kontext des Prozesses ausgeführt werden. Speicher und andere Ressourcen werden von Threads gemeinsam genutzt. Daher muss auf gemeinsame Daten über einige Grund- und Synchronisationsobjekte (wie Mutexe , Bedingungsvariablen und Semaphoren ) zugegriffen werden , mit denen Sie Datenbeschädigungen vermeiden können.


3
Sie möchten wahrscheinlich "Kopie des aktuellen Prozesses" als untergeordneten Prozess bezeichnen.

1
Das Textsegment wird jedoch häufig (virtuell) gemeinsam genutzt, und selbst das Datensegment kann beim Schreiben kopiert werden.
Jé Queue


76

Gabel

Fork ist nichts anderes als ein neuer Prozess, der genau wie der alte oder der übergeordnete Prozess aussieht, aber dennoch ein anderer Prozess mit einer anderen Prozess-ID und einem eigenen Speicher. Der übergeordnete Prozess erstellt einen separaten Adressraum für das untergeordnete Element. Sowohl der übergeordnete als auch der untergeordnete Prozess besitzen dasselbe Codesegment, werden jedoch unabhängig voneinander ausgeführt.

Das einfachste Beispiel für das Gabeln ist, wenn Sie einen Befehl auf der Shell unter Unix / Linux ausführen. Jedes Mal, wenn ein Benutzer einen Befehl ausgibt, gibt die Shell einen untergeordneten Prozess aus und die Aufgabe ist erledigt.

Wenn ein Fork-Systemaufruf ausgegeben wird, wird eine Kopie aller Seiten erstellt, die dem übergeordneten Prozess entsprechen und vom Betriebssystem für den untergeordneten Prozess in einen separaten Speicherort geladen werden. In bestimmten Fällen ist dies jedoch nicht erforderlich. Wie bei 'exec'-Systemaufrufen müssen die übergeordneten Prozessseiten nicht kopiert werden, da execv den Adressraum des übergeordneten Prozesses selbst ersetzt.

Einige Dinge, die beim Gabeln zu beachten sind, sind:

  • Der untergeordnete Prozess hat eine eigene eindeutige Prozess-ID.
  • Der untergeordnete Prozess muss über eine eigene Kopie des Dateideskriptors des übergeordneten Prozesses verfügen.
  • Vom übergeordneten Prozess festgelegte Dateisperren dürfen nicht vom untergeordneten Prozess vererbt werden.
  • Alle Semaphoren, die im übergeordneten Prozess geöffnet sind, müssen auch im untergeordneten Prozess geöffnet sein.
  • Der untergeordnete Prozess muss über eine eigene Kopie der Nachrichtenwarteschlangendeskriptoren des Elternteils verfügen.
  • Das Kind hat einen eigenen Adressraum und Speicher.

Themen

Threads sind Light Weight Processes (LWPs). Traditionell ist ein Thread nur ein CPU-Zustand (und ein anderer Minimalzustand), wobei der Prozess den Rest enthält (Daten, Stapel, E / A, Signale). Threads erfordern weniger Overhead als das "Forken" oder das Laichen eines neuen Prozesses, da das System keinen neuen virtuellen Speicherplatz und keine neue Umgebung für den Prozess initialisiert. Während dies auf einem Multiprozessorsystem am effektivsten ist, bei dem der Prozessablauf so geplant werden kann, dass er auf einem anderen Prozessor ausgeführt wird, wodurch die Geschwindigkeit durch parallele oder verteilte Verarbeitung erhöht wird, werden Gewinne auch bei Einprozessorsystemen erzielt, die die Latenz in E / A und anderen Systemfunktionen ausnutzen, die den Prozess möglicherweise stoppen Ausführung.

Threads im selben Prozess teilen sich:

  • Prozessanweisungen
  • die meisten Daten
  • geöffnete Dateien (Deskriptoren)
  • Signale und Signalhandler
  • aktuelles Arbeitsverzeichnis
  • Benutzer- und Gruppen-ID

Weitere Details finden Sie hier .


2
Ein Prozess kann mehrere Threads haben. Wenn einer der Threads in einem Prozess Fork aufruft, verfügt der Forked-Prozess über einen vollständig duplizierten Speicher, aber nur der aufrufende Thread befindet sich im neuen Prozess?
Michael


29

Die Antwort von Dacav ist ausgezeichnet. Ich wollte nur hinzufügen, dass nicht alle Threading-Modelle eine echte Mehrfachverarbeitung bieten.

Beispielsweise verwendet Rubys Standard-Threading-Implementierung keine echten Betriebssystem- / Kernel-Threads. Stattdessen ahmt es nach, mehrere Threads zu haben, indem zwischen den Thread-Objekten innerhalb eines einzelnen Kernel-Threads / -Prozesses gewechselt wird.

Dies ist bei Multiprozessor- / Multi-Core-Systemen wichtig, da diese Arten von Lightweight-Threads nur auf einem einzelnen Core ausgeführt werden können. Durch mehrere Threads wird die Leistungssteigerung nicht wesentlich beeinträchtigt.

Der andere Ort, an dem dies einen Unterschied macht, ist, wenn ein Thread blockiert (auf E / A wartet oder die IOCTL eines Treibers aufruft), alle Threads blockieren.

Dies ist heutzutage nicht sehr häufig - die meisten Threading-Implementierungen verwenden Kernel-Threads, die nicht unter diesen Problemen leiden -, aber der Vollständigkeit halber lohnt es sich, darauf hinzuweisen.

Im Gegensatz dazu bietet Ihnen Fork einen anderen Prozess, der gleichzeitig auf einer anderen physischen CPU ausgeführt werden kann, während der ursprüngliche Prozess ausgeführt wird. Einige Leute finden IPC besser für ihre App geeignet, andere bevorzugen das Threading.

Viel Glück und hab Spaß! Multithreading ist sowohl herausfordernd als auch lohnend.


7
+1 für einen Nerv: "Nicht alle Threading geben Ihnen echte Multiprocessing"
Dacav

5

Threads sind Funktionen, die parallel ausgeführt werden. Fork ist ein neuer Prozess mit Vererbung durch Eltern. Threads sind gut geeignet, um eine Aufgabe parallel auszuführen, während Gabeln unabhängige Prozesse sind, die ebenfalls gleichzeitig ausgeführt werden. Gewinde haben Rennbedingungen und dort werden Semaphoren und Schlösser oder Mutexe gesteuert. Rohre können sowohl in Gabel als auch in Gewinde verwendet werden.

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.