Betriebssysteme lernen heißt verstehen und rechnen: Ordne Prozesse und Speicher, übe Scheduling und Paging und löse die Transferfragen der Klausur.

"Betriebssysteme ist kein Auswendiglern-Fach, sondern ein Fach mit festen Rechenschemata."
Betriebssysteme ist das Modul, in dem viele Informatik-Studierende zum ersten Mal merken, dass Auswendiglernen nicht mehr trägt. Das Skript liest sich wie eine Begriffssammlung: Prozess, Thread, Semaphor, Paging, Seitenfehler. In der Klausur steht dann aber kein „Definieren Sie Scheduling", sondern eine Tabelle mit vier Prozessen und der Aufgabe, Round Robin mit Quantum 3 durchzurechnen. Wer die Konzepte nur benennen kann, verliert genau hier die Punkte. Die gute Nachricht: Der Stoff hat eine klare innere Ordnung, und wenn du sie einmal siehst, wird er deutlich kleiner.
Ein Betriebssystem löst im Kern immer dasselbe Problem: Mehrere Programme wollen gleichzeitig eine Ressource, die es nur einmal gibt. Eine CPU, einen begrenzten Hauptspeicher, eine Festplatte. Jedes große Kapitel deines Skripts ist eine Antwort auf dieses Problem für eine andere Ressource — Scheduling für die CPU, Speicherverwaltung für den RAM, Synchronisation für gemeinsam genutzte Daten.
Diese Klammer ist der wichtigste Lerntrick im Fach. Wenn du ein neues Verfahren liest, frag dich zuerst: Welche Ressource wird hier verteilt, und nach welcher Regel? Round Robin und Paging wirken dann nicht mehr wie zwei zusammenhanglose Themen, sondern wie zwei Varianten derselben Idee. Das Buch Operating Systems: Three Easy Pieces von Remzi und Andrea Arpaci-Dusseau ordnet den gesamten Stoff genau so — entlang der drei Achsen Virtualisierung, Nebenläufigkeit und Persistenz. Es ist frei online verfügbar und eignet sich gut als zweite Stimme neben dem Vorlesungsskript.
Typische Klausuren mischen drei Aufgabentypen: kurze Verständnisfragen, Rechenaufgaben mit festem Schema und Transferfragen („Warum ist FCFS hier ungeeignet?"). Für die Rechenaufgaben gilt dieselbe Regel wie in Algorithmen und Datenstrukturen: Nicht das Verfahren verstehen reicht, du musst es unter Zeitdruck fehlerfrei ausführen können.
Ein Prozess ist ein Programm in Ausführung — mit eigenem Adressraum, eigenen offenen Dateien und einem Eintrag in der Prozesstabelle. Ein Thread ist ein Ausführungsstrang innerhalb eines Prozesses: Er hat eigene Register und einen eigenen Stack, teilt sich aber Adressraum und Ressourcen mit den anderen Threads desselben Prozesses. Daraus folgt fast alles Weitere: Threadwechsel sind billiger als Prozesswechsel, und genau weil Threads sich Speicher teilen, brauchst du später Synchronisation.
Lerne das Zustandsmodell als Zeichnung, nicht als Liste. Ein Prozess ist bereit (wartet auf die CPU), rechnend (hat sie) oder blockiert (wartet auf ein Ereignis, etwa eine Ein-/Ausgabe). Die Übergänge sind der Prüfungsstoff: Vom Rechnen ins Bereit kommt ein Prozess durch den Scheduler, vom Rechnen ins Blockiert durch eine eigene Anforderung, vom Blockiert geht es nie direkt zurück ins Rechnen, sondern immer über Bereit. Diese eine Asymmetrie wird in Klausuren regelmäßig abgefragt.
Beim Kontextwechsel sichert das Betriebssystem den Zustand des laufenden Prozesses in dessen Prozesskontrollblock und lädt den des nächsten. Merke dir dabei: Ein Kontextwechsel kostet Zeit, in der kein Nutzprogramm läuft. Das ist der Grund, warum die Quantumgröße beim Round Robin ein Kompromiss ist — ein Argument, das du in Transferaufgaben immer wieder brauchst.
Die Scheduling-Aufgabe ist die verlässlichste Punktequelle der Klausur, weil sie immer gleich aufgebaut ist. Du bekommst Prozesse mit Ankunfts- und Bedienzeiten und sollst Ablaufdiagramm, Wartezeit und Umlaufzeit bestimmen. Halte zwei Definitionen sauber auseinander: Die Umlaufzeit ist Endzeit minus Ankunftszeit, die Wartezeit ist Umlaufzeit minus Bedienzeit.
Rechne das an einem Beispiel durch, bis es sitzt. Drei Prozesse kommen alle zum Zeitpunkt 0 an: P1 braucht 8 Zeiteinheiten, P2 braucht 4, P3 braucht 2.
| Verfahren | Reihenfolge | Ø Wartezeit | Ø Umlaufzeit |
|---|---|---|---|
| FCFS | P1, P2, P3 | (0+8+12)/3 = 6,67 | (8+12+14)/3 = 11,33 |
| SJF | P3, P2, P1 | (0+2+6)/3 = 2,67 | (2+6+14)/3 = 7,33 |
| Round Robin (q=2) | verzahnt | (6+6+4)/3 = 5,33 | (14+10+6)/3 = 10,00 |
Drei Schlüsse daraus solltest du begründen können. Erstens: FCFS ist nicht verdrängend und leidet am Konvoi-Effekt — ein langer Prozess blockiert alle kurzen hinter sich. Zweitens: SJF liefert hier die kleinste durchschnittliche Wartezeit, und das ist kein Zufall, sondern beweisbar optimal für diesen Kennwert. Der Haken: Das Verfahren setzt voraus, dass die Bedienzeiten im Voraus bekannt sind, was in echten Systemen nicht gilt — deshalb wird geschätzt, und deshalb können lange Prozesse verhungern. Drittens: Round Robin gewinnt bei keiner der beiden Durchschnittszahlen, aber bei der Antwortzeit. Jeder Prozess kommt schnell einmal dran, was für interaktive Systeme entscheidend ist.
Beim Round Robin ist die Wahl des Quantums die klassische Transferfrage. Zu groß, und das Verfahren nähert sich FCFS an. Zu klein, und der Anteil der Kontextwechsel an der Gesamtzeit steigt, ohne dass Arbeit erledigt wird. In der Antwort solltest du beide Richtungen nennen — Teilpunkte gibt es fast immer für die Begründung, nicht für die Zahl.
Paging löst das Problem, dass Programme mehr Speicher adressieren wollen, als physisch vorhanden ist. Der virtuelle Adressraum wird in Seiten zerlegt, der physische in gleich große Kacheln, und eine Seitentabelle bildet die einen auf die anderen ab. Der entscheidende Vorteil: Es entsteht keine externe Fragmentierung, weil jede Seite in jede Kachel passt.
Die Rechenaufgabe dazu ist immer eine Aufteilung der Adresse. Bei einer Seitengröße von 4 KiB gilt 4096 = 212, also belegen die untersten 12 Bit den Offset innerhalb der Seite, der Rest ist die Seitennummer. Bei einer 32-Bit-Adresse bleiben 20 Bit für die Seitennummer, das sind 220 mögliche Einträge in der Seitentabelle. Übe das an konkreten Zahlen: Die virtuelle Adresse 0x1A3F zerfällt bei 4-KiB-Seiten in Seitennummer 0x1 und Offset 0xA3F. Wer diese Zerlegung im Schlaf kann, verliert in der Klausur keine Zeit.
Der zweite Aufgabentyp ist die Kostenrechnung bei Seitenfehlern. Nimm 100 ns für einen normalen Speicherzugriff und 8 ms für das Nachladen einer Seite von der Platte. Bei einer Seitenfehlerrate von 0,1 Prozent ergibt sich eine mittlere Zugriffszeit von 0,999 · 100 ns + 0,001 · 8.000.000 ns ≈ 8,1 µs — rund achtzigmal langsamer als ohne Seitenfehler. Diese Rechnung macht anschaulich, warum Verdrängungsstrategien so viel Aufmerksamkeit bekommen.
Für die Strategien selbst brauchst du drei Namen und eine Besonderheit: FIFO verdrängt die älteste Seite, LRU die am längsten nicht benutzte, und das optimale Verfahren die, die am spätesten wieder gebraucht wird — es ist nicht implementierbar und dient als Vergleichsmaßstab. Die Besonderheit ist Beladys Anomalie: Bei FIFO kann die Zahl der Seitenfehler steigen, obwohl man mehr Kacheln zur Verfügung stellt. Das ist eine beliebte Prüfungsfrage, weil es der Intuition widerspricht.
Sobald zwei Threads dieselbe Variable verändern, hängt das Ergebnis von der Ausführungsreihenfolge ab — eine Race Condition. Die Abhilfe ist der kritische Abschnitt: ein Codebereich, in dem sich zu jedem Zeitpunkt höchstens ein Thread aufhalten darf, abgesichert über Mutex oder Semaphor. Für die Klausur solltest du das Erzeuger-Verbraucher-Problem einmal vollständig aufgeschrieben haben; daran lassen sich fast alle Semaphor-Fragen zurückbinden.
Beim Deadlock hast du ein fertiges Prüfschema, und das solltest du nutzen. Coffman, Elphick und Shoshani haben 1971 vier Bedingungen formuliert, die für einen Deadlock alle gleichzeitig erfüllt sein müssen:
Der Prüfungswert dieser Liste liegt in der Umkehrung: Weil alle vier Bedingungen nötig sind, genügt es, eine davon zu brechen, um Deadlocks auszuschließen. Genau so sind die Verhinderungsstrategien gebaut — etwa eine feste Anforderungsreihenfolge für alle Betriebsmittel, die das zirkuläre Warten unmöglich macht. Wenn eine Aufgabe nach einer Lösung fragt, gehst du die vier Bedingungen der Reihe nach durch und begründest, welche du brichst. Dieses schematische Vorgehen kennst du aus Theoretischer Informatik, wo Beweise ebenfalls an festen Mustern hängen.
Teile die Vorbereitung nach den zwei Modi, die die Klausur verlangt. Verständnisstoff wiederholst du abfragend, Rechenstoff übst du mit echten Aufgaben — und beides verteilt über mehrere Wochen statt gebündelt. Dass sich diese Kombination lohnt, ist gut belegt: Die große Übersichtsarbeit von Dunlosky und Kollegen (2013) bewertet Abrufübungen und verteiltes Lernen als die beiden Techniken mit dem höchsten Nutzen, und Roediger und Karpicke zeigten 2006, dass Abrufen dem wiederholten Lesen bei Tests nach zwei Tagen und einer Woche deutlich überlegen ist.
| Woche | Schwerpunkt | Konkrete Übung |
|---|---|---|
| 1 | Prozesse, Threads, Zustände | Zustandsdiagramm aus dem Kopf zeichnen, Übergänge erklären |
| 2 | Scheduling | Je zwei Aufgaben zu FCFS, SJF und Round Robin vollständig rechnen |
| 3 | Speicherverwaltung | Adressaufteilung und Seitenfehlerrechnungen, Verdrängung an Beispielen |
| 4 | Synchronisation, Altklausur | Vier Deadlock-Bedingungen abfragen, eine Altklausur unter Zeit |
Plane feste Slots statt vager Vorsätze — wie du das praktisch aufsetzt, zeigt der KI-Lernplan für die Klausurphase. Für die Abfrage-Schleife brauchst du Fragen zu deinem eigenen Skript, nicht zu einem fremden Kurs: Wenn du dein Vorlesungsmaterial in Learnboost hochlädst, entstehen daraus Karteikarten und Probefragen, mit denen du die Verständnisbegriffe zwischen den Rechenübungen wach hältst. Die Rechenaufgaben selbst ersetzt das nicht — die musst du mit Papier und Stift durchziehen, so wie in Datenbanken die SQL-Abfragen.
Und der wichtigste Schritt zum Schluss: Rechne mindestens eine vollständige Altklausur unter echten Bedingungen. Betriebssysteme-Klausuren sind oft zeitknapp, und der Unterschied zwischen „kann ich" und „kann ich in zwölf Minuten" entscheidet über die Note.
Lade dein Skript in Learnboost hoch und lass dir daraus Karteikarten und Probefragen für die Verständnisbegriffe erstellen — die Rechenroutine holst du dir parallel an Altklausuren.
Trenne Verständnisstoff und Rechenstoff von Anfang an. Begriffe wie Prozesszustände oder Deadlock-Bedingungen wiederholst du abfragend, Scheduling- und Paging-Aufgaben rechnest du mit Papier und Stift vollständig durch. Verteile beides über mehrere Wochen statt alles in die letzte Woche zu legen.
In den meisten Grundlagenklausuren sind es FCFS, SJF (oft auch in der verdrängenden Variante) und Round Robin. Du solltest zu jedem das Ablaufdiagramm zeichnen sowie durchschnittliche Warte- und Umlaufzeit berechnen können. Genauso wichtig ist die Begründung, warum ein Verfahren in einer gegebenen Situation ungeeignet ist.
Ein Prozess hat einen eigenen Adressraum und eigene Betriebsmittel, ein Thread läuft innerhalb eines Prozesses und teilt sich dessen Adressraum. Ein Thread besitzt nur eigene Register und einen eigenen Stack. Daraus folgt, dass Threadwechsel günstiger sind als Prozesswechsel — und dass Threads Synchronisation brauchen, weil sie gemeinsame Daten verändern.
Zerlege die virtuelle Adresse in Seitennummer und Offset. Die Seitengröße bestimmt, wie viele Bit der Offset belegt: Bei 4 KiB sind das 12 Bit, weil 4096 gleich 2 hoch 12 ist. Der Rest der Adresse ist die Seitennummer, und aus ihrer Bitbreite ergibt sich die Zahl der möglichen Einträge in der Seitentabelle.
Coffman, Elphick und Shoshani beschrieben 1971 vier Bedingungen, die gleichzeitig erfüllt sein müssen: wechselseitiger Ausschluss, Halten und Warten, keine Verdrängung und zirkuläres Warten. Weil alle vier nötig sind, genügt es, eine davon gezielt zu brechen, um Deadlocks auszuschließen. Genau darauf zielen Prüfungsaufgaben zur Deadlock-Verhinderung ab.