Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

POSIX-Prozessverwaltung

&pagelevel(4)&pagelevel

In POSIX findet der Programmablauf in einem Prozess statt, im BS2000 in einer Task. POSIX-Prozesse werden auf BS2000-Tasks abgebildet.

Bild 11: Zugriff einer BS2000-Task auf POSIX

In POSIX sind sämtliche Prozesse hierarchisch strukturiert. Die Prozess-Hierarchie entsteht durch einen initiierenden Prozess (init) und weitere Prozesse, die diesem initiierenden Prozess untergeordnet sind. Man spricht von einer Vater-Sohn-Beziehung. Der initiierende Prozess ist der Vater aller Prozesse. Die direkt untergeordneten Prozesse sind die Söhne, die wiederum Söhne haben können. Diese Rangfolge kann bis zu einer konfigurierbaren maximalen Prozessanzahl (Steuerparameter NPROC in der POSIX-Informationsdatei) fortgeführt werden.

Im Folgenden sind die einzelnen POSIX-Mechanismen und Prozesse näher beschrieben.

fork

Durch den Aufruf der Funktion fork wird von einem Vaterprozess ein neuer Sohnprozess erzeugt. Die Funktion fork erzeugt eine neue Prozessumgebung und kopiert ausgewählte Informationen des Vaterprozesses für den Sohnprozess. Dem Sohnprozess steht ein eigener, vom Vaterprozess abgesonderter Adressraum zur Verfügung. Der Sohnprozess kann auf alle vom Vaterprozess geöffneten POSIX-Ressourcen zugreifen.

Die beiden Prozesse laufen direkt nach dem Funktionsaufruf unabhängig voneinander weiter. Sie können durch den jeweiligen Returncode unterschieden werden: Der Sohnprozess erhält den Wert 0 zurück, der Vater die Prozessidentifikation (PID) des Sohnprozesses.

Bild 12: Arbeitsweise der Funktion fork

Bei einem Aufruf der Funktion fork werden DVS-Dateien und weitere BS2000-Betriebsmittel nicht mitvererbt.

exec

Wenn in einem Programm die Funktion exec aufgerufen wird, wird die aktuelle Prozessumgebung von einer neuen vollkommen überlagert. Dadurch kann z.B. in einem Sohnprozess ein anderes Programm ablaufen als im Vaterprozess. Die Prozesse bleiben aber durch die Vater-Sohn-Beziehung weiterhin verbunden.

Bild 13: Arbeitsweise der Funktion exec

Kombination von fork und exec

Die Funktionen fork und exec können auch kombiniert werden. Der Vorteil einer solchen Kombination besteht darin, dass Teilaufgaben auf einen anderen Prozess ausgelagert werden können. Nachdem alle Teilaufgaben beendet sind, kann der Prozess beendet werden.

Ein Beispiel dafür ist die POSIX-Shell. Die POSIX-Shell startet für einige Kommandos einen neuen Prozess, der sich selbst überlagert und das kommandoausführende Programm startet. Nachdem dieses Programm beendet ist, wird der dafür erzeugte Prozess beendet und die POSIX-Shell fortgesetzt.

pipe

Anwendungsprogrammierern steht mit POSIX die Funktion pipe zur Interprozess-Kommunikation zur Verfügung. Mit der Funktion pipe wird eine Pipe erzeugt. Eine Pipe ist ein Datenbehälter vom Typ „first in - first out“. Ein Prozess kann eine Pipe verwenden, um Informationen an einen anderen Prozess zu senden.

Bild 14: Arbeitsweise der unbenannten Pipe

  1.  Durch den Aufruf der Funktion pipe durch Prozess A wird eine Pipe zum Lesen und Schreiben von Daten erstellt. Die Pipe wird durch einen Dateideskriptor identifiziert. Der Dateideskriptor kennzeichnet eine Datei als offen.

  2.  Prozess B kann später in die Pipe schreiben und eine Nachricht hinterlassen, die Prozess A danach zu einem beliebigen Zeitpunkt lesen kann.

  3.  Prozess A ruft die Funktion read auf, spezifiziert den auf die Pipe bezogenen Dateideskriptor und liest die vom Prozess B hinterlegte Nachricht.

„copy-on-write“-Mechanismus

Beim Aufruf der Funktion fork wird die komplette Prozessumgebung vom Vater auf den Sohn vererbt. Dabei kann das Kopieren des kompletten Adressraums relativ lange dauern. Der copy-on-rwrite-Mechanismus verbessert die Performance erheblich: Bei einem fork-Aufruf wird der Adressraum nicht kopiert, sondern lediglich markiert. Somit steht der Speicher dem Vater- und dem Sohnprozess gemeinsam zur Verfügung. Wenn einer der beiden Prozesse zum ersten Mal auf eine Seite zugreift, wird anhand der Markierung festgestellt, dass eine Aktion auszuführen ist. In diesem Fall wird die betreffende Speicherseite für den Sohnprozess kopiert, so dass beide Prozesse ihre eigene Version besitzen. Dadurch wird erreicht, dass nur die Speicherseiten kopiert werden, die tatsächlich benötigt werden. Der fork-Aufruf kann somit wesentlich performanter ablaufen.

Ein weiterer Vorteil des copy-on-write-Mechanismus besteht darin, das häufig nach einem fork-Aufruf auch ein exec-Aufruf folgt. In diesem Fall ist das Kopieren des Speicherbereichs überflüssig, da er beim exec-Aufruf überlagert wird. Ohne copy-on-write würde der gesamte Speicherbereich kopiert und sofort wieder überschrieben.

Holdertask

POSIX benutzt eine Holdertask. Die Initialisierung und Terminierung laufen unter Kontrolle dieser Holdertask ab. Während der Subsystem-Sitzung, d.h. zwischen Initialisierung und Terminierung, steht die Holdertask dem Subsystem POSIX nicht zur Verfügung.

Aufrufertask

Die Aufrufertask wird beim ersten POSIX-Systemaufruf mit dem Subsystem POSIX verbunden, bei Programmende wird sie getrennt. Beim ersten POSIX-Systemaufruf erhält die Aufrufertask eine POSIX-Prozessumgebung.

Subsystem-private Server

Im Subsystem POSIX gibt es zwei Arten von subsystem-privaten Servern: Systemprozesse und Dämonen. Systemprozesse sind als BS2000-Systemtasks realisiert, Dämonen als nichtprivilegierte BS2000-Tasks.

Während das Kommando /START-SUBSYSTEM SUBSYSTEM-NAME=POSIX verarbeitet wird, werden nur Systemprozesse als Server initialisiert. Erst anschließend werden Dämonen erzeugt.