Zum Inhalt springen

Prozessverwaltung

Ein Prozess ist ein laufendes Programm. Der Unterschied ist wichtig: Ein Programm ist eine Datei auf der Festplatte (/usr/bin/bash), ein Prozess ist die lebende Instanz davon im Arbeitsspeicher – mit eigenem Speicher, eigenem Zustand und eigener Identität.

Dasselbe Programm kann gleichzeitig in mehreren Prozessen laufen – etwa wenn zwei Benutzer gleichzeitig eine Shell öffnen: zwei Prozesse, ein Programm.

Jeder Prozess bekommt beim Start eine eindeutige PID (Process ID) – eine fortlaufende Nummer. Zusätzlich kennt jeder Prozess seine PPID (Parent PID): die PID des Prozesses, der ihn gestartet hat.

Terminal-Fenster
echo $$ # PID der aktuellen Shell
echo $PPID # PPID der aktuellen Shell

Daraus ergibt sich ein Prozessbaum: Jeder Prozess hat genau einen Elternprozess, kann aber beliebig viele Kindprozesse haben.

Beim Systemstart ist der erste Prozess, den der Kernel startet, immer PID 1. Auf modernen Linux-Systemen ist das systemd. Alle anderen Prozesse sind direkte oder indirekte Kinder davon:

PID 1: systemd
├── PID 312: sshd
│ └── PID 891: sshd (Sitzung alice)
│ └── PID 892: bash
│ └── PID 1034: vim bericht.txt
├── PID 318: cron
└── PID 421: nginx
├── PID 422: nginx (worker)
└── PID 423: nginx (worker)

Neue Prozesse entstehen in Linux immer nach demselben Muster:

  1. Fork – Ein laufender Prozess erstellt eine identische Kopie von sich selbst. Die Kopie ist der neue Kindprozess.
  2. Exec – Der Kindprozess ersetzt sein Programm durch ein anderes (z. B. vim).

Wenn man in der Shell vim datei.txt eingibt, forkt die Shell sich selbst, und der Kindprozess führt dann exec vim aus. Die Shell (Elternprozess) wartet, bis vim beendet ist.

Ein Prozess befindet sich zu jedem Zeitpunkt in einem von mehreren Zuständen:

fork()
┌─────────┐ Scheduler ┌─────────┐
│ READY │ ────────────► │ RUNNING │
│ (bereit)│ ◄──────────── │(läuft) │
└─────────┘ Zeitscheibe └────┬────┘
┌───────────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│SLEEPING │ │ STOPPED │ │ ZOMBIE │
│(wartet) │ │(gestoppt)│ │(beendet, │
└──────────┘ └──────────┘ │ nicht │
│ │ │ abgeholt)│
│ Ereignis │ SIGCONT └──────────┘
└──────────────────────┘
ZustandBedeutung
RunningProzess wird gerade von der CPU ausgeführt
ReadyProzess ist bereit, wartet auf CPU-Zuteilung
SleepingWartet auf ein Ereignis (Tastatureingabe, Netzwerk, Datei)
StoppedDurch Signal angehalten (z. B. Strg+Z)
ZombieBeendet, aber Elternprozess hat Exit-Code noch nicht abgeholt

Linux macht Prozessinformationen als virtuelle Dateien zugänglich – im Verzeichnis /proc. Für jeden laufenden Prozess existiert dort ein Unterverzeichnis mit seiner PID:

Terminal-Fenster
ls /proc/$$ # Verzeichnis der aktuellen Shell
cat /proc/$$/status # Statusinfos: Name, PID, PPID, Zustand, Speicher
cat /proc/$$/cmdline # Mit welchem Befehl gestartet?
ls /proc/$$/fd # Offene Datei-Handles (Dateideskriptoren)
Terminal-Fenster
cat /proc/$$/status | grep -E "^(Name|Pid|PPid|State)"
# Name: bash
# Pid: 892
# PPid: 891
# State: S (sleeping)