Linux

Die Prozesshandhabung


In Verbindung mit dem init-Prozeß haben wir bereits einiges über Prozesse in Linux gehört.

Neben dem Dateisystem sind die Prozesse ein wichtiges Standbein von jedem modernen Betriebssystem.

Linux trennt einen Prozeß streng von dem eigentlichen Programm und der Umgebung, in welcher der Prozeß abläuft. Die Prozesse werden hierarchisch durch eindeutige Nummer (Prozeßnummer, PID) und die Nummer des Elternprozesses (auch Erzeugerprozeß) geordnet. Alle Prozeße werden in einer zentralen Prozeßtabelle vom Kernel verwaltet. ð Die strenge "Regie" eines Betriebssystem über die einzelnen Prozesse nennt man preemptives Multitasking.

Wichtige Einträge in der Prozeßtabelle sind:

Lebenszyklen von Prozessen

Prozesse haben Lebenszyklen. Sie durchschreiten eine Reihe von Zuständen, bevor Sie letztendlich zerstört werden.

Name

Wert

Bedeutung

Running (Runnable)

0

Sobald der Prozeß vollends fertig ist, wird er mit runnable makiert und hält diesen Zustand. Er ist also für die CPU bereitgestellt.

Interrupable (Waiting)

1

Während der Ausführung eines Systemprozeß "wartet" dieser, bis sie ausgeführt wurde.

Uninterruptable

2

Kann nicht durch ein Signal unterbrochen werden. Wartender Zustand.

Zombie

3

Nach Prozeßende muß der Elternprozeß sein Kind noch abgreifen. Bis dies geschieht liegt der Kindprozeß noch in der Prozeßtablle auf der faulen Haut (daher wahrscheinlich Zombie).

Swapping

4

Prozeß wird in den Auslagerungsbereich (swap partion) gebracht. Muß für die CPU nachlagen werden

Mit dem Befehl top können in der bash-Shell alle aktuell laufenden Prozesse mit genauen Informationen erfragt werden.

Der Scheuduler

Damit jeder Prozeß das gleiches Recht auf die Rechenzeit der CPU hat muß dies durch ein Verfahren gewährleistet und kontrolliert werden. Ein Teil des Kernels, Scheuduler genannt, hat genau diese Aufgabe. Er durchläuft hierzu ständig die Prozeßtabelle. Scheudule wird immer zu Beginn und zum Ende eines Systemaufrufs angesprungen.

Virtuelle Speicherverwaltung (Swapping)

Als Multitasking-Betriebssystem muß Linux die speicherhungrigen Prozesse mit Prozessorzeit und Speicher versehen. Wie erwähnt kümmt sich der Scheuduler um die Prozessorzeit. Aber selbst der größte Hauptspeicher hat Grenzen. Deshalb müssen die Prozesse vom realen Speicher virtualisiert werden. Der Kernel hat folglich die Aufgabe die virtuellen Speicheradressen auf die Hardware (Hauptspeicher) umzusetzten. Dazu muß im Prozessor das MMU (Memory-Managent-System) vorhanden sein, was ab den Intel 80386-Prozessoren der Fall ist. In Linux wurde das Speichermodell gleich und unabhängig von verwendeten CPU gestaltet.

Beim Alpha-Prozessor würde oben stehende Grafik anders aussehen, da er ein mittleres Page Directory benötigt.

Dem C-mächtigen Leser sei an dieser stelle ein Blick auf den Quellcode der Datei memory.c im Verzeichnis /usr/src/linux/mm empfohlen. Die hier definierten Funktionen kümmert sich um die Verwaltung des Page Directories.

Das Ein- und Auslagern von Speicherseiten wird nach der LRU-Regel vollzogen (Least Recently Used) ð die älteste Speicherseite wird am ehesten ausgelagert (in die Paging-Area auf Platte geschreiben).

Prozeßsteuerung

Nachdem ein Kindprozeß erzeugt worden ist, kann die Shell als Elternprozeß 2 verschieden Dinge tun:

synchrone Prozeßausführung

warten auf Beendigung des Kindprozesses und dessen Rückgabewert auswerten

asynchrone Prozeßausführung

nicht warten und zum Prompt zurückkehren

Interprozeßkommunikation (ICP)

Wie bereits erwähnt laufen in Linux Prozesse normalerweise geschützt und isoliert. Es gibt allerdings Möglichkeiten, über die sich Prozesse miteinander kommunizieren können. Dies wird als Interprozeßkommunikation oder ICP bezeichnet, wobei Linux 5 Arten kennt:

Art

Kurzbeschreibung

Signale

zum Informationsaustausch zwischen Prozessen
z. B. Systemsingnale, Gerätesignale, benutzerdefinierte Signale

Pipes (benannte o. unbenannte)

für Lese/Schreibzugriffe, ermöglichen zusätzlich eine Prozeßsyncronisation

Message-Queues

In dieser Warteschlage können alle Prozesse Nachrichten hinterlassen, wobei lesende u. schreibende Prozesse nicht von einander erzeugt sein müssen .
Größter Vorteil ist die einfache Koordination

Semaphoren ("Signalmast")

verhindert das Zugreifen von 2 Prozessen auf einen gleichen Speicherbereich. Zustände v. Semaphohren sind entweder Up oder Down.

Shared Memory

Der Kernel täuscht 2 Prozessen mit zur Hilfename von Semaphoren vor, das beide den selben Speicherbereich nutzen. In Wirklichkeit ist einer der beiden virtualisiert. Am Ende des einen Prozesses wird der ausgelagerte Prozeß in die realen Speicherbereich zurückgeholt.

Mit dem Kommando ps können Daten zu den vorhandenen Prozessen am Terminal (Bildschrim) angezeigt werden. Folgeden Optionen stehen zur Verfügung

Option

Bedeutung

-a

Info zu allen Prozessen

-f

Ausgabe mit Abhänigkeiten d. Prozesse

-l

Langfromat

-m

zusätzliche Speicherinformation

-x

Prozesse ohne Kontrollterminals anzeigen

Da ps die PID zurückgibt kann mit dem Befehl kill PID ein Signal an den Prozesse gesendet werden, welches ihn terminieren läßt. So kann man sich von lästigen möglicherweise abgestützten oder halbtoten (zombies) Prozessen befreien.




[Zurück]