# Prozesse

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

# Entstehen und Vergehen

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:

1. Der Elternprozess ist anderweitig beschäftigt (befindet sich im Zustand D o.a.). In einem solchen Fall symbolisiert der Zustand Z das noch zu behandelnde Signal. Genau genommen durchläuft jeder Kindprozess die Laufbahn eines Zombies (Zeitspanne zwischen Ableben und Signalbehandlung), jedoch ist sie meist von so kurzer Dauer, dass man gar nichts davon mitbekommt.

2. Der Elternprozess existiert nicht mehr (Programmfehler o.a.). Jetzt ist der `init`-Prozess für der Signalbehandlung verantwortlich.