Unterschied zwischen fork () und vfork ()

Autor: Laura McKinney
Erstelldatum: 2 April 2021
Aktualisierungsdatum: 10 Kann 2024
Anonim
Calling fork multiple times
Video: Calling fork multiple times

Inhalt


Beide Gabel() und vfork () sind die Systemaufrufe Dadurch wird ein neuer Prozess erstellt, der mit dem Prozess identisch ist, der fork () oder vfork () aufgerufen hat. Verwenden Gabel() Ermöglicht die gleichzeitige Ausführung von über- und untergeordneten Prozessen. Der andere Weg, vfork () Unterbricht die Ausführung des übergeordneten Prozesses, bis der untergeordnete Prozess seine Ausführung abgeschlossen hat. Der Hauptunterschied zwischen dem Systemaufruf fork () und vfork () besteht darin, dass der untergeordnete Prozess, der mit fork erstellt wurde, einen anderen Adressraum hat als der übergeordnete Prozess. Andererseits muss ein mit vfork erstellter untergeordneter Prozess den Adressraum seines übergeordneten Prozesses gemeinsam nutzen.

Lassen Sie uns anhand der folgenden Vergleichstabelle einige Unterschiede zwischen fork () und vfork () feststellen.


  1. Vergleichstabelle
  2. Definition
  3. Hauptunterschiede
  4. Fazit

Vergleichstabelle

Grundlage für den VergleichGabel()vfork ()
BasicUntergeordneter Prozess und übergeordneter Prozess haben separate Adressräume.Untergeordneter Prozess und übergeordneter Prozess teilen sich denselben Adressraum.
AusführungÜbergeordneter und untergeordneter Prozess werden gleichzeitig ausgeführt.Der übergeordnete Prozess bleibt angehalten, bis der untergeordnete Prozess seine Ausführung abgeschlossen hat.
ÄnderungWenn der untergeordnete Prozess eine Seite im Adressraum ändert, ist er für den übergeordneten Prozess nicht sichtbar, da die Adressräume voneinander getrennt sind.Wenn der untergeordnete Prozess eine Seite im Adressraum ändert, ist sie für den übergeordneten Prozess sichtbar, da sie denselben Adressraum verwenden.
Copy-on-Writefork () verwendet Copy-on-Write als Alternative, bei der übergeordnete und untergeordnete Seite die gleiche Seite haben, bis eine der beiden Seiten die freigegebene Seite ändert.vfork () verwendet kein Copy-on-Write.


Definition von fork ()

Das Gabel() ist ein Systemaufruf zum Erstellen eines neuer Prozess. Der neue Prozess, der durch den Aufruf von fork () erstellt wurde, ist der untergeordnete Prozess des Prozesses, der den Systemaufruf von fork () aufgerufen hat. Der Code des untergeordneten Prozesses ist identisch mit dem Code des übergeordneten Prozesses. Nach der Erstellung des untergeordneten Prozesses beginnen sowohl der übergeordnete als auch der untergeordnete Prozess mit der Ausführung ab der nächsten Anweisung nach fork (), und beide Prozesse werden ausgeführt gleichzeitig.

Der übergeordnete Prozess und der untergeordnete Prozess haben separater Adressraum. Daher, wenn einer der Prozesse eine Anweisung oder Variable im Code ändert. Es würde sich nicht in anderen Prozesscodes widerspiegeln. Angenommen, ein untergeordneter Prozess ändert den Code und hat keine Auswirkungen auf den übergeordneten Prozess.

Einige untergeordnete Prozesse rufen nach ihrer Erstellung sofort auf exec (). Der Systemaufruf exec () ersetzt den Prozess mit dem in seinem Parameter angegebenen Programm. In diesem Fall hat der separate Adressraum des untergeordneten Prozesses keine Verwendung. Die eine Alternative hier ist Copy-on-Write.

Das copy-on-write Lassen Sie das übergeordnete und das untergeordnete Element denselben Adressraum gemeinsam nutzen. Wenn einer der Prozesse auf die Seiten im Adressraum schreibt, wird die Kopie des Adressraums erstellt, damit beide Prozesse unabhängig voneinander arbeiten können.

Definition von vfork ()

Die geänderte Version von fork () ist vfork (). Das vfork () Der Systemaufruf wird auch zum Erstellen eines neuen Prozesses verwendet. Ähnlich wie bei fork () ist auch hier der neu erstellte Prozess der untergeordnete Prozess des Prozesses, der vfork () aufgerufen hat. Der untergeordnete Prozesscode ist ebenfalls identisch mit dem übergeordneten Prozesscode. Hier der Kindprozess unterbricht die Ausführung des übergeordneten Prozesses, bis die Ausführung abgeschlossen ist, da beide den gleichen Adressraum verwenden.

Wenn der untergeordnete und der übergeordnete Prozess das gemeinsam nutzen gleichen Adressraum. Wenn einer der Prozesse den Code ändert, ist er für den anderen Prozess sichtbar, der dieselben Seiten verwendet. Angenommen, der übergeordnete Prozess ändert den Code. es wird sich im Code des untergeordneten Prozesses widerspiegeln.

Bei Verwendung von vfork () werden keine separaten Adressräume für untergeordnete und übergeordnete Prozesse erstellt. Daher muss es sein umgesetzt wo der untergeordnete Prozess aufruft exec () unmittelbar nach seiner Schaffung. Es wird also kein Adressraum verschwendet, und es ist das effizient Weg, um einen Prozess zu erstellen. vfork verwendet nicht copy-on-write.

  1. Der Hauptunterschied zwischen fork und vfork besteht darin, dass der untergeordnete Prozess vom Gabel hat ein separater Speicherplatz aus dem übergeordneten Prozess. Der untergeordnete Prozess, der von der vfork Systemaufruf teilt die gleichen Adressraum des übergeordneten Prozesses.
  2. Der untergeordnete Prozess, der mit fork erstellt wurde gleichzeitig ausführen mit dem übergeordneten Prozess. Untergeordneter Prozess, der mit vfork erstellt wurde aussetzen Die Ausführung des übergeordneten Prozesses bis zu seinem Abschluss.
  3. Da der Speicherplatz des übergeordneten und des untergeordneten Prozesses von einem der Prozesse getrennt geändert wird, hat dies keine Auswirkungen auf die Seiten anderer. Da jedoch der übergeordnete und der untergeordnete Prozess dieselbe Speicheradressenänderung verwenden, die von einem beliebigen Prozess durchgeführt wird, wird dies im Adressraum widergespiegelt.
  4. Der Systemaufruf fork () verwendet copy-on-write Alternativ können untergeordnete und übergeordnete Prozesse denselben Adressraum gemeinsam nutzen, bis einer von ihnen die Seiten ändert. Auf der anderen Seite verwendet der vfork kein Copy-on-Write.

Fazit:

Der Systemaufruf vfork () muss implementiert werden, wenn der untergeordnete Prozess exec () direkt nach seiner Erstellung mit fork () aufruft. Ein separater Adressraum für untergeordnete und übergeordnete Prozesse wird hier nicht benötigt.