Wie ein Rechner viele Programme gleichzeitig laufen lässt
Ein Prozess ist ein Programm, das gerade läuft, und das Scheduling entscheidet, welcher Prozess den Prozessor als Nächstes bekommt. Ohne diese Entscheidung bliebe ein Rechner bei einem einzigen Programm stehen.
Stellen Sie sich den Rechner im Rechenzentrum einer Hochschule vor. Er nimmt Druckaufträge an, prüft Dateien auf Viren und zeigt den Studierenden den Stundenplan. Alles scheint gleichzeitig zu geschehen, obwohl jeder Kern nur eine Sache auf einmal tut.
Am Ende dieser Lektion
Notiz
Ich kann erklären, wie das Betriebssystem den Prozessor auf mehrere Prozesse verteilt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Prozess | ein laufendes Programm mit eigenem Speicher | |
| Prozesszustand | bereit, laufend oder wartend | bereit |
| Kontextwechsel | der Austausch des laufenden Prozesses gegen einen anderen | |
| Scheduler | der Teil des Betriebssystems, der den nächsten Prozess wählt | |
| Zeitscheibe | die Zeit, die ein Prozess am Stück rechnen darf | 20 ms |
| Warteschlange | die Liste der Prozesse, die auf den Prozessor warten |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Prozess ist ein laufendes Programm
Ein Programm ist eine Datei auf der Festplatte. Startet jemand es, legt das Betriebssystem einen Prozess an. Der Prozess hat eigenen Speicher, eine Nummer und einen Zustand.
Auf Ihrem Laptop laufen oft über hundert Prozesse, aber der Prozessor hat nur vier oder acht Kerne. Ein Kern führt zu einem Zeitpunkt genau einen Befehl eines Prozesses aus.
Der Kern zeigt jeden Prozess als Ordner
Linux zeigt Auskünfte über Prozesse in einem Ordner namens /proc. Dort gibt es für jeden Prozess einen Unterordner mit seiner PID. /proc/self ist der Ordner des Prozesses, der gerade nachsieht.
In der Datei status steht unter anderem der Zustand. Das Programm grep liest sie in dem Moment, in dem es selbst läuft. Deshalb steht dort immer die Zeile State mit R (running).
Der Zustand von grep selbst
grep State /proc/self/statusHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihre Prozesse mit Zustand
ps -o pid,ppid,stat,commHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Prozess ist bereit, laufend oder wartend
Ein Prozess ist in genau einem von drei Zuständen. Laufend heißt: Er rechnet gerade auf einem Kern. Bereit heißt: Er könnte rechnen, aber ein anderer Prozess hat den Kern. Wartend heißt: Er braucht erst etwas, zum Beispiel Daten von der Festplatte.
Nur der Scheduler macht einen Prozess von bereit zu laufend. Ein wartender Prozess wird nie sofort laufend, er muss erst wieder bereit sein.
Ein häufiger Fehler
Warnung
Viele glauben, ein Rechner führe hundert Prozesse zugleich aus. Ein Kern führt aber immer nur einen aus. Das System wechselt so schnell, dass es gleichzeitig wirkt. Echte Gleichzeitigkeit gibt es nur mit mehreren Kernen, und dann höchstens ein Prozess je Kern.
Ein Kontextwechsel tauscht den laufenden Prozess aus
Läuft ein Prozess nicht mehr, muss das Betriebssystem seinen Stand retten: die Werte der Register und den Befehlszähler. Es speichert sie im Prozesskontrollblock des Prozesses. Dann lädt es den Stand des nächsten Prozesses.
Diesen Austausch nennt man Kontextwechsel. Er kostet Zeit, in der kein Programm rechnet. Wechselt das System zu oft, geht viel Rechenzeit nur für das Umschalten verloren.
Freiwillige und erzwungene Wechsel
Ein Prozess gibt den Kern freiwillig ab, wenn er auf etwas wartet. Läuft seine Zeitscheibe ab, entzieht ihm das System den Kern. Das ist ein erzwungener Wechsel.
Linux zählt beides in der Datei status, in den Zeilen voluntary_ctxt_switches und nonvoluntary_ctxt_switches. Die Zahlen sind auf jeder Maschine anders. Wichtig ist, dass beide Zeilen da sind.
Die Kontextwechsel von grep zählen
grep ctxt_switches /proc/self/statusHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Round Robin gibt jedem Prozess eine Zeitscheibe
Beim Round Robin steht jeder bereite Prozess in einer Warteschlange. Der erste bekommt den Kern für eine Zeitscheibe, zum Beispiel 2 Zeiteinheiten. Ist er danach noch nicht fertig, stellt er sich hinten wieder an. Dann kommt der nächste dran.
Alle kommen reihum dran, deshalb heißt es Round Robin. Niemand wartet ewig, aber jeder Wechsel kostet einen Kontextwechsel.
Beispiel: drei Druckaufträge, Zeitscheibe 2
| Zeit | Läuft | Rest danach | Warteschlange danach |
|---|---|---|---|
| 0 bis 2 | A (Laufzeit 5) | A: 3 | B, C, A |
| 2 bis 4 | B (Laufzeit 3) | B: 1 | C, A, B |
| 4 bis 5 | C (Laufzeit 1) | C: fertig | A, B |
| 5 bis 7 | A | A: 1 | B, A |
| 7 bis 8 | B | B: fertig | A |
| 8 bis 9 | A | A: fertig | leer |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Linux nutzt ein eigenes, faires Verfahren
Linux benutzt für normale Prozesse ein eigenes Verfahren, das jedem Prozess einen fairen Anteil der Rechenzeit gibt. Die Idee der Zeitscheiben ist dieselbe wie beim Round Robin.
Der Aufruf unten fragt das Verfahren des eigenen Python-Prozesses ab. Er gibt die Zahl 0 aus. Das ist SCHED_OTHER, so heißt das normale Verfahren.
Welches Verfahren nutzt Linux für Sie?
python3 -c "import os; print(os.sched_getscheduler(0))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.