Was ist der Unterschied zwischen Gabel und Faden?

Lesezeit: 5 Minuten

Benutzeravatar von Pavunkumar
Pavunkumar

Kann mir jemand den Unterschied zwischen Fork und Thread erklären?

Benutzeravatar von Dacav
Dacav

Ein Fork gibt Ihnen einen brandneuen Prozess, der eine Kopie des aktuellen Prozesses ist, mit denselben Codesegmenten. Wenn sich das Speicherabbild ändert (normalerweise aufgrund unterschiedlichen Verhaltens der beiden Prozesse), erhalten Sie eine Trennung der Speicherabbilder (Copy On Write), der ausführbare Code bleibt jedoch gleich. Tasks teilen sich keinen Speicher, es sei denn, sie verwenden einen Interprozesskommunikation (IPC) Primitive.

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 gemeinsam genutzte Daten über einige primitive und Synchronisierungsobjekte (wie z Mutexe, Bedingungsvariablen und Semaphoren), mit denen Sie Datenbeschädigungen vermeiden können.

  • Wahrscheinlich möchten Sie auf “Kopie des aktuellen Prozesses” als untergeordneten Prozess verweisen.

    Benutzer1831086

    20. März 2010 um 13:25 Uhr

  • Das Textsegment wird jedoch häufig (virtuell) gemeinsam genutzt, und sogar Datensegmente können Copy-on-Write sein.

    – Je Queue

    29. Februar 2012 um 19:27 Uhr

  • Antwort: NEIN stackoverflow.com/questions/10080811/…

    – Michael

    16. Juni 2017 um 15:57 Uhr

Benutzeravatar von Napster_X
Napster_X

Gabel

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

Das einfachste Beispiel für Forking ist, wenn Sie einen Befehl auf der Shell in Unix/Linux ausführen. Jedes Mal, wenn ein Benutzer einen Befehl ausgibt, verzweigt die Shell einen untergeordneten Prozess, 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, aber in bestimmten Fällen ist dies nicht erforderlich. Wie bei ‘exec’-Systemaufrufen müssen die Elternprozessseiten nicht kopiert werden, da execv den Adressraum des Elternprozesses selbst ersetzt.

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

  • Der untergeordnete Prozess hat seine eigene eindeutige Prozess-ID.
  • Der Kindprozess soll seine eigene Kopie des Dateideskriptors des Elternprozesses haben.
  • Vom übergeordneten Prozess gesetzte Dateisperren dürfen nicht vom untergeordneten Prozess geerbt werden.
  • Alle Semaphoren, die im Elternprozess geöffnet sind, sollen auch im Kindprozess geöffnet sein.
  • Der untergeordnete Prozess soll seine eigene Kopie der Deskriptoren der Nachrichtenwarteschlange des übergeordneten Prozesses haben.
  • Das Kind hat seinen eigenen Adressraum und Speicher.

Fäden

Threads sind leichte Prozesse (LWPs). Traditionell ist ein Thread nur ein CPU-Zustand (und ein anderer minimaler Zustand), wobei der Prozess den Rest enthält (Daten, Stack, I/O, Signale). Threads erfordern weniger Overhead als das „Forken“ oder Erzeugen eines neuen Prozesses, da das System keinen neuen virtuellen Systemspeicherplatz und keine neue Umgebung für den Prozess initialisiert. Während es auf einem Multiprozessorsystem am effektivsten ist, bei dem der Prozessfluss so geplant werden kann, dass er auf einem anderen Prozessor läuft, wodurch durch parallele oder verteilte Verarbeitung an Geschwindigkeit gewonnen wird, werden auch Gewinne auf Einprozessorsystemen gefunden, die die Latenz bei E/A und anderen Systemfunktionen ausnutzen, die den Prozess anhalten können Hinrichtung.

Threads im selben Prozess teilen sich:

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

Weitere Einzelheiten können gefunden werden hier.

  • Ein Prozess kann mehrere Threads haben. Wenn einer der Threads in einem Prozess fork aufruft, hat der gegabelte Prozess einen vollständig duplizierten Speicher, aber nur der aufrufende Thread befindet sich im neuen Prozess?

    – Michael

    16. Juni 2017 um 15:50 Uhr

  • Antwort: JA stackoverflow.com/questions/10080811/…

    – Michael

    16. Juni 2017 um 15:57 Uhr

  • Obwohl der untergeordnete Prozess seinen eigenen Adressraum hat, ist er eine exakte Kopie des übergeordneten Adressraums, was bedeutet, dass es eine Zufallsvariable gibt int a = 10 im Elternprozess, der Speicherplatz 1000 im Elternadressraum belegt, dann auch noch im Kindprozess int a = 10 wird dieselbe 1000. Speicheradresse belegen. Dennoch ist die Änderung von a werden für Eltern- und Kindprozesse unterschiedlich sein, jeder von ihnen kann modifizieren a ohne andere zu beeinträchtigen, da es sich um eine Kopie handelt.

    – iCantC

    12. Januar 2021 um 15:20 Uhr

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

Zum Beispiel verwendet Rubys Standard-Threading-Implementierung keine echten Betriebssystem-/Kernel-Threads. Stattdessen ahmt es mehrere Threads nach, indem es zwischen den Thread-Objekten innerhalb eines einzelnen Kernel-Threads / -Prozesses wechselt.

Dies ist auf Multiprozessor-/Multicore-Systemen wichtig, da diese Arten von leichtgewichtigen Threads nur auf einem einzelnen Kern ausgeführt werden können – Sie erhalten keine große Leistungssteigerung durch mehrere Threads.

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

Dies ist heutzutage nicht sehr üblich – die meisten Threading-Implementierungen verwenden Kernel-Threads, die nicht unter diesen Problemen leiden – aber der Vollständigkeit halber sollte es erwähnt werden.

Im Gegensatz dazu gibt Fork Ihnen 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 geeignet für ihre App, andere bevorzugen Threading.

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

  • +1, um einen Nerv zu treffen: “Nicht alle Threads geben Ihnen echtes Multiprocessing”

    – Dacav

    20. März 2010 um 15:53 ​​Uhr

Threads sind parallel ausgeführte Funktionen, Fork ist ein neuer Prozess mit Elternvererbung. Threads eignen sich gut, um eine Aufgabe parallel auszuführen, während Forks unabhängige Prozesse sind, die ebenfalls gleichzeitig ausgeführt werden. Threads haben Race Conditions und steuern dort Semaphore und Locks oder Mutexe, Pipes können sowohl in Fork als auch in Thread verwendet werden.

1421400cookie-checkWas ist der Unterschied zwischen Gabel und Faden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy