Verzweigung() und CreateProcess()
Sind die Verzweigung() und CreateProcess(mit allen erforderlichen Argumente), das gleiche für Linux und WinXP, jeweils?
Wenn Sie unterschiedlich sind, dann könnte jemand erklären den Unterschied in Bezug auf das, was passiert in jedem der beiden Fälle?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie verschiedene Dinge tun, und auf verschiedenen Systemen.
CreateProcess
ist eine Windows-Funktion, währendfork
ist nur auf POSIX (z.B. Linux und Mac OS x) Systemen.Den
fork
system-Aufruf erzeugt einen neuen Prozess und fortsetzen der Ausführung in sowohl dem Elternteil und dem Kind von dem Punkt, wo diefork
Funktion aufgerufen wurde.CreateProcess
erstellt einen neuen Prozess und lädt ein Programm von der Festplatte. Die einzige ähnlichkeit ist, dass das Endergebnis wird ein neuer Prozess erstellt.Weitere Informationen, Lesen Sie die entsprechende Handbuchseite auf
CreateProcess
undfork
.CreateProcess die folgenden Schritte erfolgt:
Unix-fork führt die folgenden Schritte aus:
der Adressraum des übergeordneten
Es erstellt eine vollständige Kopie des parent-Prozesses, und die Eltern nicht richten Sie das runtime-Umgebung für das Kind, weil der übergeordnete Prozess vertraut Ihren eigenen einrichten. Das Kind ist eine vollständige Kopie der Eltern mit Ausnahme der Prozess-id (welche Gabel gibt). Ein Gabel-Prozess ausgeführt weiterhin das gleiche Programm wie seine Eltern, bis es führt eine explizite exec. Wenn das Kind ruft exec, die die neue ausführbare Bild in den Speicher, und läuft, und läuft.
Wie ist es effizient, um eine vollständige Kopie? copy-on-write. Es ist wirklich nur eine Kopie des virtuellen Speichers anzeigen. Alle Segmente in der segment-Tabelle können nur gelesen werden. Wenn Eltern oder Kind bearbeitet die Daten in einem segment, wird eine Ausnahme ausgelöst und der kernel erstellt eine vollständige Kopie des Speichers des. Dies erklärt sich anschaulich in diesem Antwort
Es gibt mehrere Vorteile, um die gemeinsamen Ressourcen zwischen Eltern und Kind:
- intuitiv, Ressourcen-management: weniger Speicher gebraucht wird, um die Zustände der Prozesse
- Cache-Ressourcen geteilt werden, bedeutet das eine höhere zeitliche Lokalität von Daten, wenn Daten nicht mehr geschrieben, das verbessert die Leistung, da das abrufen von Daten aus größeren caches/Festplatte ist zeitraubend.
Nachteile auf freigegebene Ressourcen:
- wenn Sie schreibt, sind Häufig, es legt die Daten in einem ungültigen Zustand für den anderen Prozess, und dies führt zu Kohärenz findet, die ist teuer, wenn der Kind-Prozess ausgeführt wird, auf einem separaten Kern, da die änderungen zu propagieren, bis zu dem L3-cache.
Im Allgemeinen jedoch, Programme Lesen ein heck von viel mehr als schreibt, in der Regel das Kind/die Eltern brauchen nur zu machen, schreibt zu seinem stack, und das ist ein kleiner Teil der Ihre Programm-block.
Zusätzlich Unix-Gabel ist anders, da gibt es zweimal, einmal in der übergeordneten (die Prozess-id von seinem Kind), einmal in das Kind (0, herzlichen Glückwunsch, du bist ein neuer baby-Prozess), das ist, wie wir unterscheiden in unserem code, wenn wir das Kind oder Elternteil.
Unix-Exec führt Folgendes aus:
den Eltern die Möglichkeit zu warten, für das Kind zu beenden. Wenn das Kind beendet, wenn-exit aufgerufen wird, wenn die Eltern warten benachrichtigt.
Gebe ich zwei Beispiele, um den Unterschied zu zeigen:
fork()
:In diesem Programm, Gabel, machen Sie eine Kopie und Rückgabe von zwei Werten. Wir nannten den kopierten Prozess übergeordneten Prozesses und die andere ein Kind-Prozess.Wenn wir die exec () - Funktion, wird der gesamte Prozess ersetzt werden durch ein neues Programm mit Ausnahme der PID.
CreateProcess()
:Dies ist ein Beispiel aus der MSDN-Website. Das, was wir rufen Sie zum erstellen eines neuen Prozesses muss eine separate *.exe-Programm im Windows-system. Der neue Prozess ist eine ganz neue, die hat nur die einzige Verbindung der return-Wert mit dem älteren.
Im Ergebnis sehen wir oft
fork()+exec()
alsCreateProcess()
. In der Tatfork()
ist ähnlich wie mitCreateThread()
im Windows.