Kann jemand den Unterschied zwischen einer Gabel und einem Faden erklären?
Kann jemand den Unterschied zwischen einer Gabel und einem Faden erklären?
Antworten:
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.
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:
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:
Weitere Details finden Sie hier .
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.
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.