3.2.4 Prozesse erzeugen

{{#index:Prozess|Prozess-ID|PID}} Während der Laufzeit eines Betriebssystems werden ständig Prozesse erzeugt, abgearbeitet, unterbrochen, weiter abgearbeitet und irgendwann schließlich beendet. Jeder Prozess erhält dabei zur Unterscheidung und Verwaltung eine eindeutige Prozess-ID (kurz: PID). Diese PID ist üblicherweise eine ganze Zahl, größergleich Null.


Erzeugen des ersten Prozesses

{{#index:Prozess erzeugen|erzeugen, Prozess}} Wird der Rechner eingeschaltet, so startet üblicherweise das Betriebssystem. Dabei muss es ganz zu Beginn einen Mechanismus geben, welcher den ersten Prozess des Betriebssystems erzeugt. Dieser erhält die Prozess-ID 0 (Null).

Ausgehend vom ersten Prozess starten dann i.d.R. weitere Prozesse, die zum Betriebssystem gehören, und zur Erfüllung der Zentralen Aufgabe eines Betriebssystems benötigt werden.

Später kann der Anwender oder Administrator weitere Anwendungsprogramme starten, die jeweils als eigener Prozess vom Betriebssystem verwaltet werden.


Allgemeine Erzeugung eines Prozesses

{{#index:Systemaufruf}} Ganz allgemein hängt es vom Betriebssystem ab, wie genau die Erzeugung eines Prozesses erfolgt. Unter Unix/Linux gibt es dazu einen Systemaufruf fork, unter Windows heißt dieser Systemaufruf CreateProcess. Beide Varianten arbeiten sehr unterschiedlich.


fork

{{#index:Prozess erzeugen, fork|erzeugen, Prozess, fork|fork|Elternprozess|Kindprozess}} Der Systemaufruf fork sorgt dafür, dass vom aufrufenden Prozess (Elternprozess) eine exakte Kopie (Kindprozess) erzeugt wird. Der Kindprozess erhält eine eigene Prozess-ID, übernimmt sonst aber alle Informationen des Elternprozesses: Programmtext, Datensegment, Befehlszähler, etc.

Beispiel

Prof. Dr. Carsten Vogt von der FH Köln hat online ein kleines Analogbeispiel zum fork-Systemaufruf bereitgestellt. Klon-Schaf Dolly lässt grüßen.

http://www.nt.fh-koeln.de/vogt/bs/animationen/ForkAnalogbeispielAnimation.pdf

Der Kindprozess wird direkt nach dem fork unabhängig vom Elternprozess als eigenständige Instanz auf dem System verwaltet und ausgeführt. Sowohl Eltern- als auch Kindprozess laufen nach dem "klonen" an gleicher Stelle weiter: Der Rückgabewert von fork wird geliefert und die direkt auf das fork folgende Anweisung wird ausgeführt.

Beispiel

Unter http://de.wikipedia.org/wiki/Fork_%28Unix%29 findet sich ein Beispiel, welches den Aufruf der fork-Funktion zeigt, und bei dem anhand des Rückgabewertes entschieden wird, ob man sich im Elternprozess, oder im Kindprozess befindet.

  • Rückgabewert von fork > 0: Elternprozess (Der Wert ist die PID des Kindprozesses.)
  • Rückgabewert von fork = 0: Kindprozess
  • Rückgabewert von fork < 0: Es ist ein Fehler aufgetreten.


CreateProcess

{{#index:Prozess erzeugen, CreateProcess|erzeugen, Prozess, CreateProcess|CreateProcess}} Der Systemaufruf CreateProcess unter Windows läuft sehr viel komplexer ab, als ein fork unter Unix/Linux. Solomon et.al. 2006 beschreiben sechs Hauptphasen bei der Prozesserzeugung.

  • Phase 1 beginnt mit dem Öffnen der EXE-Datei.
  • Die Phasen 2 und 3 erstellen notwenige Verwaltungsobjekte.
  • Phase 4 informiert das Windows-Subsystem über den hier neu erstellten Prozess.
  • Phase 5 leitet die Ausführung des neu erstellten Prozesses ein.
  • Phase 6 nimmt alle abschließenden Initialisierungen vor.

Anschließend ist der neue Prozess komplett erstellt und wartet auf die Zuteilung der CPU.

Hinweis

Eine detailliertere Beschreibung der einzelnen Phasen findet sich bei Solomon et.al. 2006. Der geneigte Leser erhält dort weitere Informationen.

Microsoft stellt unter
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
Informationen zum Funktionsaufruf von CreateProcess bereit und erläutert die zahlreichen Übergabeparameter.

Weiterhin gibt Microsoft unter
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx
ein sehr einfach gehaltenes Beispielprogramm an, welches den Systemaufruf CreateProcess durchführt. Ein Anwender mit Windows-Erfahrung kann sich so sicher leicht vorstellen, wie ein Doppelklick auf ein Programmsymbol (oder alternativ auf eine EXE-Datei) zum Aufruf der CreateProcess-Funktion führt.


Aufgabe 1

Aufgabe

Prof. Dr. Carsten Vogt von der FH Köln zeigt und erläutert unter

http://www.nt.fh-koeln.de/vogt/bs/animationen/ForkSpeicherAnimation.pdf

wie eine Variable durch ein fork sowohl im Vater-, als auch im Sohn-Prozess existiert und unabhängig voneinander mit Werten belegt sein kann.

Schau es dir an!


Aufgabe 2

Aufgabe

Was passiert eigentlich bei mehrmaligem Aufruf von fork?

Betrachte den C-Quelltext aus Listing 1 unten. Was denkst Du: Wieviele Prozesse werden durch die Ausführung des Programms insgesamt erzeugt?

Falls du vorhast den Quelltext auf einem Unix-/Linux-System zu compillieren und auszuführen:

  • Erst nachdenken und eine Prognose notieren!
  • Dann die Prognosen innerhalb deiner Lerngruppe vergleichen und diskutieren.
  • Am Ende schließlich compillieren, ausführen und die Prognose überprüfen.

Code

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int pid;

    pid = fork();
    pid = fork();
    pid = fork();
    pid = fork();

    printf("Hier ist ein Prozess mit ID %d!\n", getpid());
    return 0;
}


Listing 1: fork mehrmals nacheinander


Aufgabe 3

Aufgabe

Schaust du dir die Unterschiede zwischen fork und CreateProcess genauer an, so fällt auf, dass bei CreateProcess eine andere Anwendung gestartet wird, während fork lediglich eine Kopie eines bereits existierenden Prozesses erzeugt.

Wie kann mittels fork ein anderes Programm gestartet werden?
Erläutere mit deinen eigenen Worten die Vorgehensweise dabei!

Achilles 2006 gibt Hinweise dazu in Kapitel 3.2.1 und 3.2.2. (Studierende sind oftmals berechtigt, eine PDF-Version dieses Buches ohne entstehende Kosten über ihre Hochschulen von Springerlink zu beziehen.)



Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png