Prozesse in UNIX-ähnlichen Betriebssystemen (einschließlich Linux, MacOS, BSD usw.) werden durch eine Kombination von Systemaufrufen und internen Kernelmechanismen erstellt und gelöscht.
Prozesserstellung:
Die primäre Art und Weise, wie ein neuer Prozess erstellt wird, ist der System "fork ()` Systems. `fork ()` erstellt eine nahezu identische Kopie des Aufrufprozesses (der * Elternteil * -Prozess). Sowohl der übergeordnete als auch der neu erstellte * Child * -Prozess setzen die Ausführung vom Punkt des "Fork ()` Call fort. Der Schlüsselunterschied ist der Rückgabewert von `fork ()`:
* im übergeordneten Prozess: `Fork ()` Gibt die Prozess -ID (PID) des untergeordneten Prozesss zurück. Diese PID ist ein einzigartiger Kennung für das Kind.
* im Kinderprozess: `Fork ()` Returns 0.
Nach `Fork ()` folgen die Eltern- und Kinderprozesse normalerweise unterschiedliche Ausführungspfade. Der untergeordnete Prozess verwendet häufig die "exec ()" -Familie von Systemaufrufen "(" execl "," execv "," execvp "usw.), um sein aktuelles Image durch ein neues Programm zu ersetzen. `exec () überschreibt den Speicherplatz des Kindes mit dem Code und den Daten des neuen Programms. Wenn das Kind nicht `exec ()` verwendet, führt es weiterhin denselben Code wie der übergeordnete Ausführen aus und erstellt einen echten Klon.
Andere Möglichkeiten, wie Prozesse erstellt werden, umfassen:
* `vfork ()` (weniger häufig und potenziell problematisch): Ähnlich wie "fork ()`, aber mit subtilen Unterschieden in der Speicherfreigabe. Im Allgemeinen aufgrund potenzieller Sackgassen vermieden.
* `clone ()` (fortgeschrittener): Bietet eine feiner körnige Kontrolle über die zwischen den Eltern- und Kinderprozessen geteilten Ressourcen. Wird in Bibliotheken und erweiterten Threading -Modellen verwendet.
* Systeminitialisierung: Der Init -Prozess (PID 1) ist der Vorfahr aller anderen Prozesse im System. Es ist dafür verantwortlich, andere Prozesse während des Bootes zu starten.
* `pthread_create ()`: Diese Funktion wird zum Erstellen von Threads innerhalb eines Prozesses verwendet. Während Themen den gleichen Speicherplatz wie der übergeordnete Prozess teilen, werden sie immer noch als separate Ausführungseinheiten angesehen, die vom Kernel verwaltet werden.
Prozessdeletion (Beendigung):
Ein Prozess endet unter mehreren Umständen (wird gelöscht):
* Normale Beendigung: Der Vorgang vervollständigt seine Ausführung und ruft den System "exit ()` Systems auf. Dies signalisiert das Betriebssystem, das es abgeschlossen hat. Der Exit -Status kann verwendet werden, um Erfolg oder Misserfolg zu vermitteln.
* Abnormale Beendigung: Der Prozess stürzt aufgrund eines Segmentierungsfehlers, einer illegalen Anweisung oder eines anderen Fehlers ab. Der Kernel beendet den Prozess.
* Signalabschluss: Ein anderer Prozess (oder der Kernel selbst) kann ein Signal (z. B. "sigterm", "sigkill") an einen Prozess senden, der seine Kündigung erzwingt. "Sigterm" ermöglicht es dem Prozess, vor dem Verlassen aufzuräumen, während "Sigkill" den Prozess sofort ohne Aufräumarbeiten beendet.
* Elternprozessabschluss: Wenn ein übergeordneter Prozess endet, können seine untergeordneten Prozesse abhängig von den Einstellungen des Betriebssystems (häufig von der Prozessgruppe des Elternteils geerbt) beendet werden. Der "Init" -Prozess nimmt normalerweise verwaiste Kinder an.
Die Rolle des Kernels:
Der Kernel spielt eine entscheidende Rolle bei der Behandlung von Prozessen während ihres gesamten Lebenszyklus. Es kümmert sich um die Erstellung, Planung, die Speicherzuweisung, die Ressourcenverwaltung, die Signalbehandlung und die Prozessabschließung. Der Kernel verwaltet Datenstrukturen (wie die Prozesstabelle), um Informationen zu jedem laufenden Prozess zu verfolgen.
Zusammenfassend wird die Erstellung und Löschung von Prozessen in UNIX vom Kernel sorgfältig orchestriert und beinhalten eine Reihe von Systemaufrufen, mit denen Programmierer den Prozesslebenszyklus steuern können. Die `Fork ()` und `exec ()` Familie (zur Erstellung) und `exit () und signalen (zum Löschen) sind die Kernkomponenten.