fork()
- Erstellt einen neuen untergeordneten Prozess, der eine vollständige Kopie des übergeordneten Prozesses ist. Untergeordnete und übergeordnete Prozesse verwenden unterschiedliche virtuelle Adressräume, die anfänglich von denselben Speicherseiten gefüllt werden. Wenn dann beide Prozesse ausgeführt werden, beginnen sich die virtuellen Adressräume mehr und mehr zu unterscheiden, da das Betriebssystem ein verzögertes Kopieren von Speicherseiten durchführt, die von einem dieser beiden Prozesse geschrieben werden, und eine unabhängige Kopie der modifizierten Seiten zuweist Speicher für jeden Prozess. Diese Technik wird Copy-On-Write (COW) genannt.vfork()
- Erstellt einen neuen untergeordneten Prozess, der eine "schnelle" Kopie des übergeordneten Prozesses ist. Im Gegensatz zum Systemaufruffork()
verwenden untergeordnete und übergeordnete Prozesse denselben virtuellen Adressraum. HINWEIS! Unter Verwendung desselben virtuellen Adressraums verwenden Eltern und Kind denselben Stapel, den Stapelzeiger und den Anweisungszeiger, wie im Fall des klassischenfork()
! Um unerwünschte Interferenzen zwischen Eltern- und Kindprozess zu verhindern, die denselben Stack verwenden, wird die Ausführung des Elternprozesses eingefroren, bis der Kindprozess entwederexec()
aufruft (erstellen Sie einen neuen virtuellen Adressraum und einen Übergang zu einem anderen Stack) oder_exit()
(Beendigung der Prozessausführung).vfork()
ist die Optimierung vonfork()
für "fork-and-exec"-Modell. Es kann 4-5 Mal schneller ausgeführt werden als derfork()
, weil anders als beifork()
(auch wenn COW im Hinterkopf behalten wird), Implementierung vonvfork()
Systemaufruf beinhaltet nicht das Anlegen eines neuen Adressraums (Zuweisung und Einrichtung neuer Seitenverzeichnisse).clone()
- Erstellt einen neuen untergeordneten Prozess. Verschiedene Parameter dieses Systemaufrufs geben an, welche Teile des Elternprozesses in den Kindprozess kopiert werden müssen und welche Teile zwischen ihnen geteilt werden. Infolgedessen kann dieser Systemaufruf verwendet werden, um alle Arten von Ausführungseinheiten zu erstellen, beginnend mit Threads und endend durch vollständig unabhängige Prozesse. Tatsächlichclone()
Systemaufruf ist die Basis, die für die Implementierung vonpthread_create()
verwendet wird und die ganze Familie desfork()
Systemaufrufe.exec()
- setzt den gesamten Speicher des Prozesses zurück, lädt und analysiert die angegebene ausführbare Binärdatei, richtet einen neuen Stack ein und übergibt die Kontrolle an den Einstiegspunkt der geladenen ausführbaren Datei. Dieser Systemaufruf gibt niemals die Kontrolle an den Aufrufer zurück und dient zum Laden eines neuen Programms in den bereits bestehenden Prozess. Dieses System rufen Sie mitfork()
auf Systemaufruf bilden zusammen ein klassisches UNIX-Prozessverwaltungsmodell namens "fork-and-exec".
-
vfork()
ist eine obsolete Optimierung. Vor guter Speicherverwaltung,fork()
machte eine vollständige Kopie des Gedächtnisses der Eltern, also war es ziemlich teuer. da in vielen Fällen einfork()
gefolgt vonexec()
, das die aktuelle Speicherkarte verwirft und eine neue erstellt, war dies ein unnötiger Aufwand. Heutefork()
kopiert den Speicher nicht; es wird einfach auf "copy on write" gesetzt, alsofork()
+exec()
ist genauso effizient wievfork()
+exec()
. -
clone()
ist der Systemaufruf, der vonfork()
verwendet wird . mit einigen Parametern erstellt es einen neuen Prozess, mit anderen erstellt es einen Thread. der Unterschied zwischen ihnen besteht lediglich darin, welche Datenstrukturen (Speicherplatz, Prozessorstatus, Stack, PID, geöffnete Dateien usw.) gemeinsam genutzt werden oder nicht.
execve()
ersetzt das aktuelle ausführbare Image durch ein anderes, das aus einer ausführbaren Datei geladen wird.fork()
erstellt einen untergeordneten Prozess.vfork()
ist eine historisch optimierte Version vonfork()
, soll verwendet werden, wennexecve()
wird direkt nachfork()
aufgerufen . Es stellte sich heraus, dass es in Nicht-MMU-Systemen (wofork()
nicht effizient arbeiten kann) und wennfork()
Prozesse mit einem enormen Speicherverbrauch, um ein kleines Programm auszuführen (denken Sie an JavasRuntime.exec()
). POSIX hat denposix_spawn()
standardisiert um diese letzten beiden moderneren Verwendungen vonvfork()
zu ersetzen .posix_spawn()
entspricht einemfork()/execve()
, und erlaubt auch etwas fd-Jonglage zwischendurch. Es sollfork()/execve()
ersetzen , hauptsächlich für Nicht-MMU-Plattformen.pthread_create()
erstellt einen neuen Thread.clone()
ist ein Linux-spezifischer Aufruf, mit dem alles abfork()
implementiert werden kann bispthread_create()
. Es gibt viel Kontrolle. Inspiriert vonrfork()
.rfork()
ist ein Plan-9-spezifischer Anruf. Es soll ein generischer Aufruf sein, der mehrere Grade der gemeinsamen Nutzung zwischen vollständigen Prozessen und Threads zulässt.