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:
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.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.
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).
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 |
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 |
|
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 . |
|
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.