Heim > Artikel > Betrieb und Instandhaltung > Was ist der Befehl zur Prozesserstellung unter Linux?
Linux-Prozesserstellungsbefehle: 1. Der fork-Befehl kann einen neuen Prozess aus einem vorhandenen Prozess erstellen, und der ursprüngliche Prozess ist der übergeordnete Prozess . 2. Mit dem Befehl vfork teilt der erstellte untergeordnete Prozess den Adressraum mit dem übergeordneten Prozess, was bedeutet, dass der untergeordnete Prozess vollständig im Adressraum des übergeordneten Prozesses ausgeführt wird. 3. Der Klonbefehl kann die Ressourcen des übergeordneten Prozesses selektiv in den untergeordneten Prozess kopieren, und die nicht kopierten Datenstrukturen werden vom untergeordneten Prozess durch Zeigerkopieren gemeinsam genutzt.
Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.
Es stehen drei Befehle zum Erstellen eines Prozesses im Linux-System zur Verfügung: fork, vfork und clone.
fork
Wenn fork einen Prozess erstellt, kopiert der untergeordnete Prozess nur die Ressourcen des übergeordneten Prozesses vollständig. Der kopierte untergeordnete Prozess verfügt über eine eigene task_struct-Struktur und eine eigene PID, kopiert jedoch alle anderen Ressourcen des übergeordneten Prozesses. Wenn beispielsweise im übergeordneten Prozess fünf Dateien geöffnet sind, sind auch im untergeordneten Prozess fünf Dateien geöffnet, und die aktuellen Lese- und Schreibzeiger dieser Dateien werden ebenfalls an derselben Stelle gestoppt. Was dieser Schritt also bewirkt, ist das Kopieren. Der auf diese Weise erhaltene untergeordnete Prozess ist unabhängig vom übergeordneten Prozess und weist eine gute Parallelität auf. Für die Kommunikation zwischen beiden sind jedoch spezielle Kommunikationsmechanismen wie Pipe, gemeinsam genutzter Speicher und andere Mechanismen erforderlich , müssen Sie die obige Beschreibung verwenden. Erstellen Sie eine Kopie jeder Ressource. Unter diesem Gesichtspunkt ist Fork ein sehr teurer Systemaufruf. Dieser Overhead ist beispielsweise nicht notwendig, wenn ein Prozess einen Child-Prozess aufruft, der dann lediglich exec aufruft, um eine andere ausführbare Datei auszuführen Das Kopieren des virtuellen Speicherplatzes während des Fork-Prozesses ist ein redundanter Prozess. Da Linux jedoch jetzt die COW-Copy-on-Write-Technologie (Copy-on-Write) verwendet, erstellt Fork zunächst nicht tatsächlich zwei verschiedene Kopien, um den Overhead zu reduzieren, da zu diesem Zeitpunkt tatsächlich eine große Datenmenge vollständig identisch ist . Copy-on-Write verschiebt die eigentliche Kopie der Daten. Wenn das Schreiben später erfolgt, bedeutet dies, dass die Daten des übergeordneten Elements und des untergeordneten Elements inkonsistent sind, sodass eine Kopieraktion ausgeführt wird und jeder Prozess eine eigene Kopie erhält, was den Overhead von Systemaufrufen verringern kann. Bei Copy-on-Write ist die Implementierung von vfork daher von geringer Bedeutung.
Der fork()-Aufruf gibt nach seiner Ausführung zwei Werte zurück. Für den übergeordneten Prozess gibt die fork-Funktion die Prozessnummer des Unterprogramms zurück, während die fork-Funktion für das Unterprogramm Null zurückgibt zweimal.
Nach der Verzweigung führen sowohl der untergeordnete Prozess als auch der übergeordnete Prozess die Anweisungen nach dem Verzweigungsaufruf weiterhin aus. Der untergeordnete Prozess ist eine Kopie des übergeordneten Prozesses. Es wird eine Kopie des Datenraums, des Heaps und des Stapels des übergeordneten Prozesses abgerufen. Dies sind Kopien. Der übergeordnete und untergeordnete Prozess teilen sich diesen Teil des Speichers. Mit anderen Worten: Änderungen an einer Variablen mit demselben Namen im übergeordneten Prozess durch einen untergeordneten Prozess haben keinen Einfluss auf deren Wert im übergeordneten Prozess. Aber die Vater- und Sohnprozesse haben etwas gemeinsam, nämlich den Textabschnitt des Programms. Das Textsegment speichert von der CPU ausgeführte Maschinenanweisungen und ist normalerweise schreibgeschützt.
vfork
Der mit vfork erstellte untergeordnete Prozess teilt sich den Adressraum mit dem übergeordneten Prozess. Das heißt, der untergeordnete Prozess wird vollständig im Adressraum des übergeordneten Prozesses ausgeführt. Wenn der untergeordnete Prozess zu diesem Zeitpunkt etwas ändert, wirkt sich dies auf den übergeordneten Prozess aus.
Wenn daher im obigen Beispiel vfork() verwendet wird, sind die zweimal gedruckten Werte von a und b gleich und die Adressen sind gleich.
Hier ist jedoch zu beachten, dass der mit vfork() erstellte untergeordnete Prozess zum Beenden explizit exit() aufrufen muss, da der untergeordnete Prozess sonst nicht beendet werden kann und dies bei fork() nicht der Fall ist.
Vfork gibt auch die Prozessnummer des untergeordneten Prozesses im übergeordneten Prozess und im untergeordneten Prozess 0 zurück.
Nachdem vfork zum Erstellen eines untergeordneten Prozesses verwendet wurde, wird der übergeordnete Prozess blockiert, bis der untergeordnete Prozess exec aufruft (exec, lädt eine neue ausführbare Datei in den Adressraum und führt sie aus.) oder beendet wird. Der Vorteil von vfork besteht darin, dass nach der Erstellung des untergeordneten Prozesses oft nur exec aufgerufen wird, um ein anderes Programm auszuführen, da es keinen Verweis auf den Adressraum des übergeordneten Prozesses hat und daher die Kopie des Adressraums redundant ist , sodass es über vfork gemeinsam genutzt werden kann. Speicher kann unnötigen Overhead reduzieren.
clone
Die Systemaufrufe fork() und vfork() haben keine Parameter, während clone() Parameter hat. fork () ist eine vollständige Kopie, vfork () ist ein gemeinsam genutzter Speicher und clone () kann die Ressourcen des übergeordneten Prozesses selektiv in den untergeordneten Prozess kopieren. Die nicht kopierte Datenstruktur wird vom untergeordneten Prozess durch Zeigerkopieren gemeinsam genutzt . Insbesondere wird durch clone_flags in der Parameterliste bestimmt, welche Ressourcen in den untergeordneten Prozess kopiert werden sollen. Darüber hinaus gibt clone() die PID des untergeordneten Prozesses zurück.
Erfahren Sie unten mehr über den fork-Befehl (Prozesserstellung).
Einblick in die Fork-Funktion
Die Fork-Funktion ist eine sehr wichtige Funktion in Linux, sie erstellt einen neuen Prozess aus einem bestehenden Prozess. Der neue Prozess ist der untergeordnete Prozess und der ursprüngliche Prozess ist der übergeordnete Prozess.
Der Rückgabewert der Fork-Funktion:
- Gib die PID des untergeordneten Prozesses an den übergeordneten Prozess zurück.
- Gib 0 an den untergeordneten Prozess zurück.
Als nächstes verwenden wir die Fork-Funktion () als Beispiel
Allgemeine Verwendung von forkEin übergeordneter Prozess möchte sich selbst kopieren, sodass der übergeordnete und untergeordnete Prozess gleichzeitig unterschiedliche Codesegmente ausführen. Beispielsweise wartet ein übergeordneter Prozess auf eine Clientanfrage und erzeugt einen untergeordneten Prozess, der die Anfrage bearbeitet.
Ein Prozess möchte ein anderes Programm ausführen. Nachdem der untergeordnete Prozess beispielsweise vom Fork zurückgekehrt ist, ruft er die Funktion exec auf. Der Grund, warum der Fork-Aufruf fehlgeschlagen ist Wir studieren ein Thema:Weist dem untergeordneten Prozess neue Speicherblöcke und Kernel-Datenstrukturen zu.fork() erstellt einen untergeordneten Prozess. Welche Operationen führt das Betriebssystem aus?
- Der Prozess ruft fork auf. Wenn die Steuerung an den Fork-Code im Kernel übertragen wird, führt der Kernel Folgendes aus:
Fork kehrt zurück und beginnt mit der Planung.Kopieren Sie einige Datenstrukturinhalte des übergeordneten Prozesses in den untergeordneten Prozess.
- Untergeordneten Prozess zur Systemprozessliste hinzufügen.
Nachdem der übergeordnete Prozess den Code vor fork (before) ausgeführt hat, ruft er fork auf, um einen untergeordneten Prozess zu erstellen, und die übergeordneten und untergeordneten Ausführungsströme werden separat ausgeführt. Hinweis: Nach
fork wird vollständig vom Scheduler entschieden,Da der Prozess jederzeit unterbrochen (möglicherweise nicht abgeschlossen) werden kann, muss er bei der nächsten Ausführung an der vorherigen Position (nicht am Anfang des Programms oder der Hauptfunktion) fortgesetzt werden, was die CPU erfordert um den aktuellen Ausführungsort des Prozesses in Echtzeit aufzuzeichnen.
wer es zuerst ausführt
.- Hier stellt sich eine weitere Frage: Wenn der Code nach der Verzweigung zwischen den übergeordneten und untergeordneten Prozessen geteilt wird, wird er dann gemeinsam genutzt, oder wird der gesamte Code nach der Verzweigung gemeinsam genutzt? genau?
- Antwort: Der gesamte Code wird gemeinsam genutzt, da die CPU verfolgt, wo der Prozess ausgeführt wird.
- Nachdem der Code zusammengestellt wurde, gibt es viele Codezeilen, und jede Codezeile hat eine entsprechende Adresse, nachdem sie in den Speicher geladen wurde.
Es gibt also entsprechende Registerdaten in der CPU, die zum Aufzeichnen der Ausführungsposition des aktuellen Prozesses verwendet werden. Dieses Register wird als EIP bezeichnet, auch bekannt als PC (Punktcode-Programmzähler), und wird zum Aufzeichnen der Adresse verwendet der nächsten ausgeführten Codezeile (Kontextdaten).
Wenn ein untergeordneter Prozess erstellt wird, wird seine EIP geändert. Zu diesem Zeitpunkt geht der untergeordnete Prozess davon aus, dass die im EIP gespeicherten Daten der auszuführende Code sind. Wenn ein untergeordneter Prozess erstellt wird, weist das Betriebssystem dem untergeordneten Prozess die entsprechende Datenstruktur zu, und der untergeordnete Prozess wird unabhängig ausgeführt, da der Prozess unabhängig ist.
Theoretisch sollte der untergeordnete Prozess auch über eigenen Code und eigene Daten verfügen. Im Allgemeinen gibt es jedoch beim Erstellen eines untergeordneten Prozesses keinen Ladevorgang und der untergeordnete Prozess selbst verfügt nicht über eigenen Code und eigene Daten.Der untergeordnete Prozess kann also nur den Code und die Daten des übergeordneten Prozesses „verwenden“, und der Code ist schreibgeschützt, und die gemeinsame Nutzung zwischen Eltern und Kindern tritt nicht in Konflikt, während die Daten möglicherweise geändert werden und getrennt werden müssen.
Zu diesem Zeitpunkt übernimmt das Betriebssystem die Copy-on-Write-Strategie.Copy-on-Write
- Warum das Betriebssystem die Copy-on-Write-Technologie verwendet, um übergeordnete und untergeordnete Prozesse zu trennen
- Kopieren während des Schreibens ist ein Ausdruck der effizienten Nutzung des Speichers.
Verbessert die Betriebseffizienz des Systems.
OS kann vor der Codeausführung nicht vorhersagen, auf welche Leerzeichen zugegriffen wird.
Erweitertes Wissen: Prozessbeendigung und
ProzessbeendigungDer Code wird ausgeführt und das Ergebnis ist falsch.
- Wenn der Prozess beendet wird, gibt das Betriebssystem die relevante Kernel-Datenstruktur und die entsprechenden vom Prozess angewendeten Codedaten frei Systemressourcen freigeben,
1. Prozess-Exit-Code- Übliche Methoden zur Prozessbeendigung:
- Nachdem der Code ausgeführt wurde, ist das Ergebnis korrekt.
Um den ersten Fall vom zweiten Fall zu unterscheiden, können wir ihn anhand des Exit-Codes des Prozesses klar unterscheiden. Über den Rückgabewert der Hauptfunktion in der erlernten C-Sprache, wobei der Rückgabewert der Hauptfunktion der Exit-Code des Prozesses ist. Seine Bedeutung besteht darin, zum Prozess der oberen Ebene zurückzukehren, um die Ausführungsergebnisse des Prozesses auszuwerten. Jetzt schreiben wir ein einfaches C-Programm. Dann können wir den Exit-Code des neuesten Prozesses über echo $? erhalten. Der Rückgabewert eines Prozesses hat zwei Situationen: 0 und ungleich 0 bedeutet, dass das Programm erfolgreich ausgeführt wird und das Ergebnis korrekt ist, und ungleich 0 bedeutet, dass das Programm erfolgreich ausgeführt wird, das Ergebnis jedoch falsch ist. Es gibt unzählige Nicht-Null-Werte und verschiedene Nicht-Null-Werte. Der Wert kann verschiedene Fehler darstellen, sodass wir die Fehlerursache definieren können. Wir können strerror verwenden, um es auszudrucken Die Ergebnisse sind wie folgt: Wir haben festgestellt, dass es unter Linux 133 Fehlercodes gibt und die Fehlermeldung, die dem Exit-Code Nr. 2 entspricht: Über die Beendigung Ein Prozess kann die Return-Anweisung verwenden und auch die Exit- und _exit-Funktionen aufrufen Unterschiede zwischen diesen beiden Funktionen: Lassen Sie uns zunächst ein kleines Beispiel geben: Als nächstes drucken wir eine Nachricht aus, schlafen dann drei Sekunden lang, verwenden dann Exit zum Beenden und beobachten die Ergebnisse Weil wir n mitgebracht haben, Durch Hinzufügen von n wird der Puffer aktualisiert und unser Ausdruck wird auf dem Bildschirminhalt angezeigt. Wenn wir n nicht mitbringen, beobachten wir das Ergebnis: Als nächstes verwenden wir die _exit-Funktion , um die ausführbare Datei b: auszuführen und stellen fest, dass nichts gedruckt wird. Verwenden Sie echo $?, um den letzten Prozess-Exit-Code zu drucken und festzustellen, dass die b-Datei vorhanden ist tatsächlich ausgeführt. Dies zeigt, dass Exit eine Bibliotheksfunktion ist und _exit ein Systemaufruf ist, der den Inhalt des Puffers beim Verlassen des Prozesses nicht aktualisiert. An dieser Stelle können wir eine Schlussfolgerung ziehen: printf-Daten werden im „Puffer“ gespeichert, Exit kann sie aktualisieren, aber die Systemaufrufschnittstelle _exit kann sie nicht aktualisieren. Daher darf sich der Puffer nicht innerhalb des Betriebssystems befinden, sondern muss von der C-Standardbibliothek verwaltet werden. Verwandte Empfehlungen: „Linux-Video-Tutorial
当然,程序崩溃的时候,退出码没有意义。
Wie wir alle wissen, Linux verwendet die geschriebene C-Sprache, der Kern des Befehls ist ein C-Sprachprogramm, daher können wir einfach den Befehl ls als Beispiel nehmen
Das obige ist der detaillierte Inhalt vonWas ist der Befehl zur Prozesserstellung unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!