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