Obwohl jeder Prozess eine unabhängige Einheit mit eigenem Programmzähler und eigenen Variablen ist, müssen Prozesse oft miteinander kommunizieren. Betrachten wir den Unix-Aufruf
cat file1 file2 | more5.1
Der Befehl cat verbindet zwei Textdateien miteinander, während more diese verbundenen Dateien auf dem Bildschirm ausgibt. Der Prozess, der durch den Aufruf von more gestartet wird, kann nur arbeiten wenn der cat-Prozess eine Ausgabe liefert. Ein Prozess der auf die Ausgabe eines anderen Prozesses wartet kann nicht arbeiten. Man versetzt ihn deshalb in einen Zustand, den man blockiert nennt. Das bedeutet, dass dieser Prozess im Moment von der Ausführung ausgenommen wird.
Nehmen wir nun an, dass es während der Ausführung mehr nichtblockierte Prozesse gibt, als Prozessoren im Computersystem zur Verfügung stehen, so müssen auch nicht-blockierte Prozesse von der Ausführung ausgenommen werden. Deshalb führt man einen weiteren Zustand ein, in dem sich Prozesse befinden können: rechenbereit. Insgesamt gibt es dann drei unterschiedliche Zustände, in denen sich Prozesse befinden können:
Darüberhinaus gibt es noch zwei Zustände neu (Prozess ist eben erstellt wurden) und beendet (Ausführung des Prozesses wurde beendet).
In Abbildung
ist dargestellt, welche Übergänge zwischen
den drei Zuständen möglich sind.
Wenn ein rechnender Prozess eine Eingabe erwartet, die im Moment nicht da ist,
so wird er blockiert. Wenn eine solche Eingabe dann erfolgt, wird der Zustand
von blockiert in rechenbereit umgewandelt. Das Betriebssystem, besser gesagt der
Scheduler (wird in Abschnitt
ausführlich behandelt) des
Betriebssystems, entscheidet welche Prozesse rechnend bzw. rechenbereit sind.