Linux-Anwendungen gabeln im Allgemeinen dann exec (mit execve ()), aber Java-Anwendungen und bestimmte Apache-MPMs verwenden Threading. Wenn Forking verwendet, verwendet Fork + Exec, um einen Prozess zu erzeugen. Was ist die High-Level-Version für das Threading? Wie erzeugt JVM oder Worker MPM Threads?
9
Antworten:
Die Idee hinter Threads und Prozessen ist ungefähr dieselbe: Sie teilen den Ausführungspfad. Ansonsten unterscheiden sich Threads und Prozesse in Sachen Speicher. Das heißt, Prozesse haben unterschiedlichen VM-Speicherplatz, während Threads alles gemeinsam nutzen, was vor der Aufteilung vorhanden war.
Mit dem Aufruf clone () (man 2 clone) werden sowohl Threading- als auch Forking-Arbeiten zugrunde gelegt:
Die Unterschiede ergeben sich aus den Flags, die an clone () übergeben werden. Wie Sie auf der Manpage sehen können, sind Fork und Threading nur ein Satz vordefinierter Parameter für clone (). Man kann aber auch benutzerdefinierte Sachen damit machen.
quelle
Die meisten Nicht-Unix-Multiprocessing-Betriebssysteme (OSes) verwenden einen "spawn ()" - Aufruf oder ähnliches, um einen neuen Betriebssystemprozess oder Kontrollfluss zu generieren. Spawn () ist in der Regel ein sehr komplexer Aufruf mit vielen Optionen und viel Overhead. Eine der Innovationen von Unix bestand darin, einen viel geringeren Overhead für die Erstellung von Prozessen bereitzustellen - fork (). Unix kümmerte sich um die vielen notwendigen Optionen für spawn (), indem es beliebige Verarbeitungsmengen vor der anderen Hälfte von spawn () mit exec () zuließ.
Da Unix und Varianten davon immer häufiger verwendet wurden, erwies sich die Erstellung von Prozessen mit geringem Overhead als nützlich und wurde verwendet. Tatsächlich wurde es so oft verwendet, dass die Leute noch weniger Aufwand für die Erstellung von Prozessen wollten, und so entstand die Idee von "Threads". Ursprünglich wurden Threads vollständig vom Ursprungsprozess verarbeitet (und Programme wie die JVM können dies mit "grünen Threads" tun). Die Handhabung der Multithread-Planung ist jedoch schwierig und wurde häufig falsch durchgeführt. Es gibt also eine einfachere Zwischenmethode für Threads, bei der das Betriebssystem die Planung übernimmt, aber ein gewisser Overhead gespart wird, indem der Adressraum (normalerweise) zwischen Threads geteilt wird.
Ihre Frage ist schwer zu beantworten, da es verschiedene, aber verwandte Konzepte gibt, die alle "Threads" sind. Für Details benötigen Sie ein Adjektiv, um zu beschreiben, auf welches Sie sich beziehen. Wenn Sie jedoch die Unterschiede verstehen, gelangen Sie wahrscheinlich zu der gewünschten Antwort. Weitere Informationen finden Sie unter "Lightweight-Prozesse", "Benutzer-Threads" und "rfork ()".
quelle
CreateProcess()
aber nichts Ähnlichesfork()
.fork()
.Threads und Forking sind eigentlich zwei verschiedene Konzepte, die beide in Unix / Linux-Systemen existieren (und beide in C / C ++ verwendet werden können).
Die Idee eines fork () ist (im Grunde genommen) die Erstellung eines separaten Prozesses, der denselben Ausführungscode wie der übergeordnete Prozess hat und dessen Ausführung an der Fork-Zeile beginnt. Der Zweck der Verwendung von Gabeln mit Exec-Funktionen besteht darin, dass Exec-Funktionen den Prozess schließen, der sie beim Beenden aufgerufen hat. Normalerweise geben Sie die PID jedes Prozesses ab (die des Kindes ist immer 0) und lassen das Elternteil warten, bis das Kind die Exec-Funktion ausgeführt hat.
Threads werden für die Parallelität verwendet (denken Sie daran, dass der Elternteil normalerweise in einem gespaltenen Programm auf das Kind wartet). Ein Thread wie pthread in C / C ++ (Google-Suche durchführen) wird parallel zum Hauptprozess ausgeführt und kann globale Variablen und globale Funktionen mit dem ursprünglichen Programm gemeinsam nutzen. Da sich Java-Threads ähnlich verhalten, würde ich mir vorstellen, dass sie sich eher wie diese Threads als wie ein Forking-Prozess verhalten.
Grundsätzlich gibt es einen Unterschied zwischen Gabeln und Gewindeschneiden. Sie machen deutlich unterschiedliche Dinge (obwohl sie ähnlich scheinen). Diese Konzepte können schwer zu verstehen sein, aber Sie können sie durch (umfangreiche) Forschung lernen, wenn Sie den ehrlichen Wunsch haben, sie zu verstehen.
EDIT # 1
In diesen Beispielen erfahren Sie, wie Gabeln und Gewinde aufgerufen und verwendet werden können. Bitte beachten Sie das Verhalten der exec-Funktionen und deren Auswirkungen auf das Hauptprogramm.
http://www.jdembrun.com:4352/computerScience/forkVSthread.zip
quelle
pthread
eine API, keine Thread-Implementierung.Sowohl die JVM als auch die Apache MPM verlassen sich auf den Kernel für native Threads. Das heißt, sie verwenden das Betriebssystem, um sie zu planen. Natürlich benötigen beide eine eigene API, um den Überblick zu behalten.
Stackoverflow hat bereits mehrere Fragen dazu:
JVM native Threads Besuche diese Antwort für mehr Details.
Apache verfügt über zwei Arten von MPMs: Prefork mit einem Prozess pro Thread und Worker, der mehrere Threads verarbeitet: Apache-MPMs . Überprüfen Sie den Verweis auf
codebucket
quelle
Das ist plattformspezifisch, aber unter Linux und ich würde davon ausgehen, dass viele andere POSIX-kompatible Systeme die lokale Implementierung von pthreads verwenden , einer Userland-Threading-API. Z.B:
Startet einen neuen Thread-Aufruf
somefunc
als ersten Ausführungspunkt.Sie können auch Threads erstellen - im Gegensatz zu Gabeln, die denselben globalen Heap- Speicherplatz des übergeordneten Prozesses verwenden, anstatt eine doppelte Kopie davon zu erhalten (beachten Sie jedoch, dass Threads jeweils mit einem eigenen unabhängigen Stapelspeicher ausgeführt werden). mit dem
clone()
Systemaufruf, auf dem pthreads aufgebaut ist.quelle