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.
- 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.
- Gilt dies
fork
und dasexec
Konzept 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? - 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.
Antworten:
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.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.
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 istexec
, der die Shell anexec()
das externe Programmfork()
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 true
dann/bin/true
ersetzt die Shell, und sofort Ausfahrt, nichts verlassen mehr in Ihrem Terminal laufen, so dass es geschlossen wird.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.quelle
cd
oderread
funktionieren könnten. Das Fehlen von Forking macht Builtins auch viel schneller als externe Befehle.execve()
auf, sich mit anderem Code zu überschreiben.fork()
undexec()
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 vonfork()
BSDvfork()
, Plan 9rfork()
und Linuxclone()
, aber das Prinzip bleibt dasselbe.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.quelle
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
fork
Systemaufruf 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 eineexec
andere ausführbare Datei zu entscheiden .fork
+ hatexec
also 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.quelle
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.
quelle