Unter Linux können mehrere Prozesse gleichzeitig ausgeführt werden. "Gleichzeitig" bedeutet hier quasi-parallel, d.h. dem Nutzer wird durch die sequentielle Abarbeitung mehrerer Prozesse in kleinen Zeitscheiben die Existenz mehrerer Prozessoren vorgegaukelt.
Welche Prozesse im Augenblick laufen, verrät uns z.B. das Kommando ps:
user@sonne> ps ax PID TTY STAT TIME COMMAND 1 ? S 0:03 init [2] 2 ? SW 0:00 (kflushd) 3 ? SW< 0:00 (kswapd) 8 ? S 0:00 update (bdflush) 57 ? S 0:00 /sbin/kerneld 68 ? S 0:00 /usr/sbin/klogd -c 1 70 ? S 0:00 /usr/sbin/syslogd 89 ? S 0:00 /usr/sbin/rpc.mountd 91 ? S 0:00 /usr/sbin/rpc.nfsd 93 ? S 0:00 /usr/sbin/rpc.ugidd 105 ? S 0:00 /usr/sbin/cron 110 ? S 0:00 /usr/sbin/inetd 112 a0 S 0:00 /usr/bin/gpm -t ms -m /dev/mouse 115 ? S 0:00 /usr/sbin/lpd 127 ? S 0:01 /usr/sbin/sshd 129 ? S 0:00 sendmail: accepting connections on port 25 144 3 S 0:00 /sbin/mingetty tty3 145 4 S 0:00 /sbin/mingetty tty4 146 5 S 0:00 /sbin/mingetty tty5 147 6 S 0:00 /sbin/mingetty tty6 160 ? S 1:54 /usr/X11R6/bin/Xwrapper :0 -bpp 8 1561 2 S 0:00 bash 1568 2 R 0:00 ps x |
Aus obigem Listing sind folgende Informationen abzulesen:
PID | Prozessnummer, jeder Prozess erhält bei seiner Erstellung eine eindeutige PID. Der erste Prozess beim Systemstart erhält die PID 1, der init-Prozess. | |
TTY | Welcher Prozess läuft auf welchem virtuellen Terminal (Konsole)? tty3-6 warten auf ein Login (mingetty). Ein Fragezeichen kennzeichnet Prozesse, die kein Terminal kontrollieren. | |
STATE | Zustand des Prozesses: | |
D | Der Prozess wartet auf einen bestimmten Hardwarezustand (uninterruptible sleep). | |
L | Die Speicherseite(n) des Prozesses darf nicht ausgelagert werden. | |
N | Der Prozess läuft mit einer niedrigeren Priorität (ihm wird weniger Rechenzeit als gewöhnlichen Prozessen zugestanden). | |
R | Der Prozess wartet auf die Zuteilung der CPU (runable). | |
S | Der Prozess wartet auf das Eintreten eines Ereignisses, z.B. das Beenden eines IO-Transfers... (spleeping). | |
T | Der Prozess befindet sich im Einzelschrittlauf, z.B. für Debuggingzwecke (traced). | |
Z | Der Prozess existiert nicht mehr, aber der Vaterprozess hat den Rückgabestatus noch nicht geprüft (zombie). | |
W | Die dem Prozess zugehörige Speicherseite befindet sich nicht im Hauptspeicher (ist also ausgelagert). | |
< | Der Prozess läuft mit einer höheren Priorität (ihm wird mehr Rechenzeit als gewöhnlichen Prozessen zugestanden). | |
TIME | Verbrauchte CPU-Zeit des Prozesses | |
COMMAND | Name des Programmes, welches vom Prozess ausgeführt wird |
Ein Prozess entsteht, indem ein Elternprozess mittels des Systemrufes
fork()
einen neuen Prozess erzeugt (Ausnahme ist init
,
der einzige "von Hand generierte" Prozess). Dieser Kindprozess teilt sich
alle Ressourcen mit dem Elternprozess, wesentliche Unterschiede sind nur
ein eigener Stack und eine eigene PID.
Anhand des Rückgabewertes von fork()
ist es den beiden Prozessen nun möglich, zu unterscheiden,
ob es sich um den Vorfahren oder einen Nachkommen handelt.
In Abhängigkeit
hiervon wird nun ein Kindprozess mittels des Systemrufes exec()
ein neues Programm laden.
Irgendwann wird ein Kindprozess seine Arbeit beenden und diesen Zustand seinem Elternprozess durch eine entsprechende Nachricht signalisieren. Obwohl der Kindprozess bereits jetzt aus Speicher und Prozesstabelle entfernt ist, muss dieses Signal noch verarbeitet werden. Für gewöhnlich zeichnet der Elternprozess dafür verantwortlich.
Zwei Situationen könnten den "normalen Werdegang" durcheinander bringen:
Der Elternprozess existiert nicht mehr (Programmfehler o.a.). Jetzt ist
der init
-Prozess für der Signalbehandlung verantwortlich.