next up previous contents
Next: Aufgabe Up: Einführung Previous: Prozess-Kontrolle   Contents


Prozesserzeugung

In Betriebssystemen die den Mehrprogrammbetrieb erlauben muss es eine Möglichkeit geben Prozesse zu erzeugen. In Regel wird es nicht möglich sein beim Start des Computersystems bereits sämtliche notwendigen Prozesse zu erzeugen. D.h. es müssen während der Laufzeit des Computersystems neue Prozesse erzeugt werden können. In dem Betriebssystem Unix gibt es dazu den Systemaufruf fork. Der fork-Aufruf erzeugt eine identische Kopie des Vater-Prozesses (Prozess in dem der fork-Aufruf erfolgt). Die Kopie wird dementsprechend Kind-Prozess genannt. Vater- und Kind-Prozess werden dann parallel weiter ausgeführt. Der Rückgabe-Wert des Systemaufrufs fork ist im Vater-Prozess die neue Prozess-ID, während im Kind-Prozess dieser Wert auf 0 gesetzt ist.

Abbildung [*] zeigt, wie in einem Standard-Unix-System die Prozesse aufgebaut werden.

Figure: Prozessbaum in einem Standard-Unix-System
\begin{figure}\begin{center}
\epsfxsize13cm
\epsfbox{fork}
\end{center}\end{figure}

Nach erfolgten fork gibt es verschiedene Möglichkeiten des weiteren Ablaufs:

In Unix gibt es zu Laden von neuem Code den Befehl execlp. Dieser Befehl lädt einen anderen Code und beginnt mit seiner Ausführung.

Wenn der Kind-Prozess beendet wird, gibt er einen Rückgabewert an den Vater-Prozess. Das führt zu einem weiteren Problem, wenn der Vater-Prozess vor dem Kind-Prozess beendet wird. Es gibt die Möglichkeit mit dem wait-Systemaufruf auf die Beendigung des Kind-Prozesses oder der Kind-Prozesse zu warten. Wenn kein wait angegeben ist, so erhält der Kind-Prozess in Unix den Init-Prozess als neuen Vater-Prozess.

Zur Veranschaulichung dieser Vorgänge betrachten wir folgendes C-Programm (Abbildung [*]). Zunächst wird ein neuer Prozess erzeugt. Dann wird der Code des Listbefehls ls im Kind-Prozess geladen. Im Vater-Prozess wird auf die Beendigung des Kind-Prozesses gewartet, bevor auch dieser beendet wird.

Figure: Prozess forken
\begin{figure}\begin{center}
\begin{verbatim}public interface Runnable {
public abstract void run();
}\end{verbatim} \end{center} \end{figure}



Subsections
next up previous contents
Next: Aufgabe Up: Einführung Previous: Prozess-Kontrolle   Contents
Prof. Dr. Pluemicke 2003-05-10