Im nächsten Schritt wollen wir uns nochmal genauer anschauen, was ein Prozess eigentlich
ist.
Wenn wir der Definition der Vorlesung folgen, dann ist ein Prozess ein Programm in Ausführung,
wobei ein Programm wiederum eine Folge von Anweisungen ist.
Ein Prozess führt also ein Programm aus.
Außerdem ist mit ihm eine Prozess-ID assoziiert.
Die sogenannte PID ist dabei ganzzahlig und positiv.
Mit einem Prozess oder genauer gesagt mit einer Prozessinkarnation sind einige Ressourcen
verknüpft.
Dazu gehören zum einen der Speicher, also physisch vorhandene Seiten, ein virtueller
Adressraum und zum Beispiel offene Dateien.
Prozesse bilden untereinander eine Prozess-Hierarchie.
Die ergibt sich aus der Eltern-Kind-Beziehung von Prozessen, wobei ein Prozess mehrere
Kindprozesse erzeugen kann.
Der erste Prozess, der vom Betriebssystem gestartet wird, ist dabei der Init-Prozess.
Dieser bekommt immer die PID 1.
Dessen Aufgabe ist es, alle weiteren Programme, die ausgeführt werden sollen, zu starten.
Dazu gehören zum Beispiel eine Reihe von Dämonen, zum Beispiel dem SSH-Dämon oder
GDM, was in diesem Fall der WinDOM-Manager bzw.
Login-Manager ist.
Der Dämon-GDM ist dafür verantwortlich, einen Nutzer zu authentifizieren und, sobald
dies gelungen ist, einen X-Server zu starten und zum Beispiel einen WinDOM-Manager, wie
in diesem Fall den WinDOM-Maker, zu starten, damit der Nutzer auf einer grafischen Oberfläche
arbeiten kann.
Der WinDOM-Manager hingegen kann wieder andere Programme starten.
Wenn ein Nutzer zum Beispiel ein Terminal startet, in diesem Fall Xterm, ist dies ein
Kindprozess des WinDOM-Managers.
Die Shell, die in den Terminal läuft, ist wiederum ein Kind des Terminals und die Shell
selber startet beliebige Programme, zum Beispiel ein Texteditor, Cade.
Daraus ergibt sich ein Baum von Prozessen bzw. die Prozess-Hierarchie.
Nachdem wir nun grob wissen, was ein Prozess ist, wollen wir noch schauen, wie man einen
Prozess erstellen kann.
Dies geht mittels des Fork-Systemaufrufs.
Sobald man Fork aufruft, erzeugt man einen neuen Kindprozess, der eine quasi exakte Kopie
des Elternprozesses ist.
Das bedeutet, die der Prozessinstanz zugeordneten Daten werden einmal kopiert, zum Beispiel
werden das Datensegment und das Stacksegment kopiert.
Andere Segmente, wie zum Beispiel das Textsegment, die nur lesbar sind, werden nicht kopiert,
sondern gemeinsam genutzt.
Darüber hinaus bleiben auch alle geöffneten Dateien ebenfalls für den Kindprozess erhalten,
sowie die Registerinhalte und der einzige wirkliche Unterschied zwischen diesen beiden
Prozessinstanzen ist die PID.
Dabei startet die Ausführung des Kindprozesses direkt nach der Ausführung von Fork mit eben
dem geerbten Zustand.
Möchte nun ein Prozess feststellen, ob er nach dem Fork der Elternprozess oder der Kindprozess
ist, dann muss er dies anhand des Rückgabewerts des Fork-Systemaufrufs prüfen.
Der Elternprozess bekommt als Rückgabewert die PID des entstandenen Kindes, der Kindprozess
hingegen erhält als Rückgabewert den Wert Null.
Hier ist ein kleines Beispiel, wie man mit Fork umgehen kann.
In diesem Beispiel haben wir ein kleines Codeschnipsel, in dem einmal eine Variable erstellt wird,
Zugänglich über
Offener Zugang
Dauer
00:11:27 Min
Aufnahmedatum
2020-06-21
Hochgeladen am
2020-06-21 23:46:35
Sprache
de-DE