Wie funktionieren Fork und Exec?


17

Ich habe nicht viel Erfahrung damit, mich nur auf die Prozesse einzulassen, wie sie für Hardware von der Benutzerebene interpretiert werden.

Wenn also ein Befehl von einer Shell ausgelöst wird, fork()erbt er einen untergeordneten Prozess davon und exec()lädt den untergeordneten Prozess in den Speicher und führt ihn aus.

  1. Wenn der untergeordnete Prozess alle Attribute des übergeordneten Prozesses enthält (dies ist der ursprüngliche Prozess), welche Anforderungen hat dieser untergeordnete Prozess? Der ursprüngliche Prozess könnte auch in den Speicher geladen worden sein.
  2. Gilt dies forkund das execKonzept für alle ausführbaren Programme unter UNIX? Wie für Shellskripte auch oder nur für Befehle? Gilt das auch für Shell-Befehle?
  3. Wann wird das Copy-on-Write- Konzept verwendet, wenn ich einen Befehl / ein Skript ausführen möchte?

Es tut mir leid, dass ich viele Fragen gleichzeitig gestellt habe, aber all diese Fragen kommen mir sofort in den Sinn, wenn ich an eine Befehlsausführung denke.


Ich werde nicht sagen, dass dies ein Duplikat ist, aber ich denke, einige Ihrer Fragen werden hier beantwortet: unix.stackexchange.com/questions/136637/… und in der anderen Antwort, die oben in dieser Frage verlinkt ist.
Goldlöckchen

Antworten:


22

Wenn ein Befehl von einer Shell ausgelöst wird, erbt fork () einen untergeordneten Prozess davon und exec () lädt den untergeordneten Prozess in den Speicher und führt ihn aus.

Nicht ganz. fork()Klont den aktuellen Prozess und erstellt ein identisches untergeordnetes Element. exec()Lädt ein neues Programm in den aktuellen Prozess und ersetzt das vorhandene.

Mein qs ist:

Wenn der untergeordnete Prozess alle Attribute des übergeordneten Prozesses enthält (dies ist der ursprüngliche Prozess), welche Anforderungen hat dieser untergeordnete Prozess? Der ursprüngliche Prozess könnte auch in den Speicher geladen worden sein.

Dies ist erforderlich, weil der übergeordnete Prozess noch nicht beendet werden möchte. Es soll ein neuer Prozess gestartet werden, der gleichzeitig etwas ausführt, das auch weiterhin ausgeführt wird.

Gilt dieses Fork- und Exec-Konzept für alle ausführbaren Programme unter UNIX? Wie für Shell-Skripte auch oder nur für Befehle? Gilt das auch für Shell-Befehle?

Bei externen Befehlen bewirkt die Shell fork(), dass der Befehl in einem neuen Prozess ausgeführt wird. Builtins werden direkt von der Shell ausgeführt. Ein weiterer bemerkenswerter Befehl ist exec, der die Shell an exec()das externe Programm fork()weiterleitet, ohne sie vorher zu starten. Dies bedeutet, dass die Shell selbst durch das neue Programm ersetzt wird und nicht mehr für dieses Programm zur Verfügung steht, zu dem es beim Beenden zurückkehren kann. Wenn Sie sagen, exec truedann /bin/trueersetzt die Shell, und sofort Ausfahrt, nichts verlassen mehr in Ihrem Terminal laufen, so dass es geschlossen wird.

Wann wird das Copy-on-Write-Konzept verwendet, wenn ich einen Befehl / ein Skript ausführen möchte?

Damals in der Steinzeit musste fork()tatsächlich der gesamte Speicher des aufrufenden Prozesses in den neuen Prozess kopiert werden. Beim Schreiben kopieren ist eine Optimierung, bei der die Seitentabellen so eingerichtet werden, dass die beiden Prozesse zunächst denselben Speicher gemeinsam nutzen und bei Bedarf nur die Seiten kopiert werden, auf die beide Prozesse schreiben.


4
"Für fast jeden Befehl führt die Shell ein fork () aus, damit der Befehl in einem neuen Prozess ausgeführt wird. Wenn dieser Befehl ein integrierter Befehl ist, muss das Kind kein separates Programm ausführen ()." Gute Antwort, aber dieser Teil sollte bearbeitet werden. Die Shell gibt nicht auf, wenn Builtins ausgeführt werden. Diese werden direkt im aktiven Shell-Prozess ausgeführt. Dies ist die einzige Art und Weise, wie Builtins funktionieren cdoder readfunktionieren könnten. Das Fehlen von Forking macht Builtins auch viel schneller als externe Befehle.
John Kugelman unterstützt Monica am

6
  1. Bei einigen Programmen führt der untergeordnete Prozess eine Aufgabe aus (von einem seriellen Port lesen, auf das Terminal schreiben), und der übergeordnete Prozess führt eine andere Aufgabe aus (vom Terminal lesen, auf den seriellen Port schreiben). Ein weiteres klassisches Beispiel ist, dass der untergeordnete Prozess einen Prüfpunkt für die laufende Berechnung erstellt. In den meisten Fällen führt der untergeordnete Prozess einige Setups aus, z. B. das Ändern des Verzeichnisses, das Zurücksetzen von Signalhandlern oder das Zurücksetzen von Dateideskriptoren, und ruft dann execve()auf, sich mit anderem Code zu überschreiben.
  2. fork()und exec()gelten für alle ausführbaren Dateien. Tatsächlich unterscheiden sich Unix neben argc und argv auch durch Pipes, fork und exec von anderen Betriebssystemen. Es gibt einige Spezialisierungen oder Verallgemeinerungen von fork()BSD vfork(), Plan 9 rfork()und Linux clone(), aber das Prinzip bleibt dasselbe.
  3. "copy on write" wird dem Benutzer nicht wirklich angezeigt, es ist eher eine Technik zur Optimierung der Erstellung eines untergeordneten Prozesses und während seiner Ausführung. Der Aufrufstapel und der Heap (Speicher, der mit malloc()oder sogar statischen oder globalen Bereichsvariablen belegt ist) können "copy on write" sein. Wenn ein untergeordneter Prozess mit einem erstellt wirdfork()Beim Aufruf würde der Kernel den untergeordneten Prozess so einrichten, dass er genau die gleichen Speicherseiten wie Heap und Stack wie der übergeordnete Prozess hat. Wenn die Hardware (Speicherverwaltungseinheit) ein Schreiben des Heap- oder Stapelspeichers erkennt, erhält der Kernel eine neue physische Seite des Speichers, kopiert die Seite des übergeordneten Elements in die neue Seite und ordnet diese neue Seite im Stapel oder Heap des untergeordneten Prozesses zu. Dies stellt eine Optimierung dar, da der Kernel weniger Zeit für das Einrichten von Seitenzuordnungen benötigt, als für das vollständige Kopieren von Stack und Heap für den untergeordneten Prozess.

Danke Bruce für deine Antwort. Aber so viele Dinge, die du hier gesagt hast, gehen mir über den Kopf. Ich habe nicht viel Wissen mit diesen Dingen. Ich werde versuchen, diese Funktionen zum Laufen zu bringen, die Sie erwähnt haben. Ich danke dir sehr..!!
PriB

4
Wenn der untergeordnete Prozess alle Attribute des übergeordneten Prozesses enthält (dies ist der ursprüngliche Prozess), welche Anforderungen hat dieser untergeordnete Prozess? Der ursprüngliche Prozess könnte auch in den Speicher geladen worden sein.

Diese Frage wird sehr anschaulich beantwortet, wenn Sie sich die frühesten Unix-Implementierungen ansehen, die unter strengen Speicherbeschränkungen arbeiten mussten und bei denen jeweils nur ein Prozess im Speicher- / Adressraum ausgeführt wurde.

Multitasking wurde durch Auslagern eines Prozesses auf die Festplatte und Einlagern eines anderen Prozesses erreicht.

Nun war der forkSystemaufruf fast derselbe: Er hat einen Prozess auf die Festplatte ausgelagert, aber anstatt einen anderen Prozess einzulagern, hat er der im Speicher befindlichen Kopie eine andere Prozess-ID gegeben und ist zu ihr zurückgekehrt. Und das war ein günstiger Zeitpunkt für diesen Prozess, um sich schließlich für eine execandere ausführbare Datei zu entscheiden .

fork+ hat execalso eigentlich keinen spürbaren Overhead durch das Laichen verursacht: Sie mussten Ihren Prozess ohnehin auf die Festplatte auslagern, und Sie hatten das alte Prozessabbild ohnehin in funktionsfähigen Speicherorten.

Mit zunehmender Menge an verfügbarem Speicher und Speicherverwaltungseinheiten sowie mehreren In-Memory-Prozessen wurden die anfänglich vernachlässigbaren Kosten eines Fork für einige Architekturen etwas ärgerlicher vfork wurde geboren.


2

Um dies so einfach wie möglich zu machen, verwende ich eine Analogie. Lass uns einen Kuchen backen!

Wir schnappen uns das Rezeptbuch und beginnen zu lesen und setzen uns auf einen Erdbeer-Rhabarber-Kuchen (mein Favorit) mit einer handgemachten Kruste. Fast alles, was wir brauchen, befindet sich in der Küche, mit Ausnahme der Eier und der Früchte. Da wir jedoch auf einem Bauernhof leben und die Früchte der Saison entsprechen, ist dies kein Problem. Das Problem ist, dass der Ofen kaputt ist und nicht genug Zeit bleibt, um alles zu tun. Wäre es nicht schön, mehr als einen von mir zu haben?

Gabel () zur Rettung. Jetzt bin ich zu zweit. und wir gehen beide in die küche, um die kuchenkruste zuzubereiten. Hoppla. Also schauen wir uns die Rückkehr von der Gabel an. Ich habe eine große Zahl, er hat Null, also gehe ich in die Küche, während er in den Hühnerstall und in den Garten geht. Als ich wieder am Ofen vorbeigehe, schaue ich mir den Rückgabewert an: Schade, dass ich Null habe. Er geht weiter zum Mehl, während ich auf den kaputten Ofen starre. Ich öffne die Tür, kein Licht, ich schließe die Tür. Weiß jemand, wie man einen Ofen repariert?

exec () zur Rettung. Ich greife nach dem Voltmeter an meinem Werkzeuggürtel, die Glühbirne könnte diagnostisch sein, also überprüfe ich die Leistung, tatsächlich ausgelöster Leistungsschalter, einfache Reparatur. Als ich zur Schalttafel gehe, sehe ich einen Kollegen, der Rhabarber pflückt. Yuck! Ich bevorzuge Schokoladenkuchen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.