Scheduler

Lernziele und Kompetenzen

  • Verstehen wie Prozesse im Betriebssystem gesteuert werden

  • Verstehen welche Probleme bei der direkten Ausführung von Prozessen auf der CPU entstehen und wie dem im Betriebssystem begegnet wird

  • Grundlagen der Scheduling-Mechanismen kennen lernen

  • Verstehen wie Prozesse von Betriebssystemen geschedult werden können

Direct Execution

Problem

Bisher haben wir gelernt, dass es Prozesse gibt, diese irgendwie gestartet werden können.

Das Betriebssystem lädt also ein Programm, dei Daten lädt alle Register und startet den Prozess...

Annahme: Der Prozess bekommt vollen Zugriff auf alle Ressourcen und läuft direkt auf der CPU, bis der Prozess die Kontrolle wieder an das Betriebssystem abgibt (engl. direct execution).

  • Frage 1: Wie stellen wir sicher, dass der Prozess nichts »Verbotenes« tut?

  • Frage 2: Die direkte Ausführung des Prozesses auf der CPU (engl. direct execution) ist zwar schnell, aber was passiert nun, wenn der Prozess eingeschränkte Aktionen durchführen will (z.B. mehr Speicher, I/O-Operation etc.)?

  • Frage 3: Und wie stellen wir überhaupt sicher, dass der Prozess die Kontrolle wieder abgibt? Solange der Prozess ausgeführt wird, hat das Betriebssystem ja keine Kontrolle über die CPU... 🤔

Lösungsidee

Programme laufen im sog. »User Mode Linux« oder allgemein »User Mode«.

  • Es wird eingeschränkt, was das Programm »tun« kann

  • Z.b. werden I/O-Operationen eingeschränkt

  • Wenn ein Programm versucht etwas unerlaubtes auszuführen wird eine »Exception« im Prozessor erzeugt (das heißt tatsächlich so, hat aber nichts z.B. mit Java Exceptions zu tun)

Der Gegensatz: »Kernel Mode«

  • Hier sind alle Operationen, auch bzw. insbesondere I/O-Operationen erlaubt

SysCall

Wenn ein Programm im User Mode etwas ausführen möchte, das eigentlich untersagt ist, führt es einen sog. »System Call« oder kurz »Syscall« aus.

  • System Calls werden von allen modernen Betriebssystemen angeboten

  • POSIX-Systeme (Portable Operating System Interface1) bieten mehrere hundert solcher System Calls an

System Call

Wenn ein Programm im User Mode etwas ausführen möchte, das eigentlich untersagt ist, führt es einen sog. »System Call« oder kurz »Syscall« aus.

  • System Calls werden von allen modernen Betriebssystemen angeboten

  • POSIX-Systeme (Portable Operating System Interface1) bieten mehrere hundert solcher System Calls an

SysCall Ablauf

Das Programm...

  • Führt ein sog. Trap-Instruktion aus

  • Springt in Kernel und startet im privilegierten Modus (Kernel Modus)

  • Führt die Operationen aus, die im »System Call Handler« hinterlegt sind

  • Führt eine sog. Return-From-Trap-Instruktion aus

  • Kehrt in den User Mode zurück

Vorsicht

Die Hardware muss darauf achten „genügend Bestandteile vom Programm bestehen zu lassen“, so dass es später wieder ausgeführt werden kann.

Am Beispiel des x86:

Hier werden...

  • Program Counter, Flags und weitere Register in einen sog. Per-Process-Kernel-Stack »gepusht« (Datenstruktur Stack klar? Ggf. Exkurs am Ende)

  • Bei der Return-From-Trap-Instruktion werden diese wieder vom Stack geladen

  • Danach kann das Programm wieder im User Mode ausgeführt werden

Dieses Vorgehen wird von Betriebssystem zu Betriebssystem zwar unterschiedlich gehandhabt, ist im Grundsatz aber immer ähnlich

Nochmal Vorsicht

Frage: Woher weiß das OS, welcher Code für System Calls ausgeführt werden soll?

Das Programm kann ja kein Speicherbereich angeben

Grundsätzlich wäre das auch eine sehr schlechte Idee… Das ist schon klar warum, oder?

Lösung: Trap Table

  • Es wird eine sog. »Trap Table« zur Boot-Zeit erstellt

  • Beim Booten ist das System immer im Kernel Mode

  • Das Betriebssystem kann der Hardware somit sagen, welcher Code bei welchem Ereignis ausgeführt wird

  • Das Betriebssystem informiert die Hardware über diese sog. Trap Handlers oder System Call Handlers

Nur mal so... Was könnte man denn machen, wenn man eine eigene Trap Table installieren könnte? 🤔

Scheduler

Der Scheduler regelt nun, welcher Prozess laufend darf, und wann der nächste Prozess dran ist, wie genau macht der Scheduler das jedoch? Hierfür wird ein Regelwerk benötigt.

Scheduling Policy

  • Die »Scheduling Policy« (also das Regelwerk) hängt vorrangig vom »Workload« der Prozesse ab

  • Zur Vereinfachung werden zunächst folgende (absolut unrealistische) Annahmen getroffen:

    • Jeder Job läuft gleich lang

    • Alle Jobs treffen zur gleichen Zeit ein

    • Einmal gestartet, läuft ein Job bis er beendet ist

    • Alle Jobs verwenden ausschließlich die CPU

    • Laufzeit (engl. runtime) eines jeden Jobs ist bekannt

Um die Scheduling Policy zu bewerten benötigen wir eine Kennzahl, eine sog Metrik:

  • Hinweis: Metriken werden im 3. Semester in SEKS vertieft

  • Für heute genügt: Metrik = einfach um etwas zu messen

  • Für uns: zunächst nur eine Metrik

Scheduler Metriken: Turnaround-Zeit

Aufgrund unserer vorherigen Annahmen gelten

  • Alle Jobs kommen zum gleichen Zeitpunkt an:

  • Somit gilt:


First In, First Out

First in, First out (abk. FIFO) oder manchmal auch First Come, First Serve (abk. FCFS)

Einfach und daher auch einfach zu implementieren

  • Beispiel

    • Jobs A, B und C kommen kurz nacheinander an

    • Jeder Job hat eine Laufzeit von 10 Sekunden

    • Was ist die durchschnittliche Turnaround-Zeit?

    • 10+20+303=20

  • Heben wir jetzt die erste Annahme auf

    • Zur Erinnerung: Jeder Job läuft gleich lang

    • Ab sofort: Jeder Job läuft eben nicht mehr gleich lang

    • Gibt es einen Workload, der FIFO »alt aussehen lässt«?

    • 100+110+1203=110

Convoy Effect (dt. Konvoieffekt)

  • Kennt jeder

  • Mehrere Kunden mit wenigen Waren warten hinter einem einzigen Kunden mit vielen Waren

  • Nur eine Supermarktkasse offen... 😤

Shortes Job First

  • Shortest Job first (Abk. SJF)

  • Beschreibt die Policy recht treffend

    • Führt den kürzesten Job aus, dann den zweit kürzesten etc.

  • Beispiel von zuvor

    • SJF reduziert Turnaround-Zeit von 110 auf 50

  • 10+20+1203=50

Problem bei SJF

  • Lösen wir ab jetzt die Restriktion, dass alle Jobs zum selben Zeitpunkt eintreffen

  • Beispiel: A trifft bei 𝑡=0, B und C bei 𝑡=10 ein

  • Turnaround-Zeit hat sich hierdurch verdoppelt

  • 100+(110−10)+(120−10)3=103,33

Shortest Time-to-Completion First

  • Shortest Time-to-Completion First (STCF)

  • SJF ist non-preemptive ▶ versuchen wir es preemptive

  • Was bedeutet überhaupt preemptive bzw. non-preemptive?

Exkurs: Non-Preemptive vs. Preemptive

  • Non-Preemptive

    • Stammt aus den Zeiten von sog. Batch-Systemen

    • Jeder Job wurde zu Ende gerechnet, bevor überhaupt in Erwägung gezogen wurde einen anderen Job zu starten

  • Preemptive

    • Alle modernen Betriebssysteme sind »preemptive«

    • Jederzeit gewillt einen Job zu stoppen und einen anderen dafür zu starten

    • Nutzen den zuvor behandelten Context Switch

  • Lösen wir nun die Restriktion, dass alle Jobs bis zum Ende durchlaufen

  • Jedes Mal wenn ein Job eintrifft, wird derjenige der die geringste Restlaufzeit

  • Achtung! Das geht nur wegen unserer letzten noch bestehenden Annahme: Die (Rest-)Laufzeit ist bekannt!

  • (120−0)+(20−10)+(30−10)3=50

Problem mit STCF

  • Benutzer wartet bis Job A (z.B. Aktualisierung in Excel o.ä.) fertig ist

  • Nun kommt die Hausaufgabe vom letzten Mal ins Spiel: Sie erinnern sich an den Unterschied zwischen Foreground- und Background-Jobs?

  • Was ist denn, wenn andauernd neue kürzere Jobs eintreffen, die keine Benutzereingabe erfordern… 🥱

Round Robin

Um eine weitere Scheduling Policy zu prüfen benötigen wir eine weitere Metrik.

{{1}}


Scheduler Metriken: Antwortzeit

  • Zweite Metrik für heute: Antwortzeit (eng. response time)

  • Dauer vom Zeitpunkt an dem Job eintrifft bis er das erste Mal »gescheduled« wird:

Round Robin

  • Grundprinzip von Round Robin (RR): Jeder Job wird nur für eine bestimmte Zeitspanne (engl. time slice) ausgeführt

  • Zeitscheibe ist ein Vielfaches vom Timer Interrupt (d.h. bei einem Timer Interrupt von 10ms ein Vielfaches von 10)

  • Durchschnittliche Antwortzeit im Vergleich zu SJF (vorherige Folie) ist 1

  • 0+1+23=1

  • Der Context Switch kostet Ressourcen

  • D.h. wie lange müssten die Time Slices sein, dass sich ein Context Switch überhaupt lohnt?

  • Für Antwortzeit hervorragend geeignet, für Turnaround-Zeit überhaupt nicht

  • Round Robin zieht Ausführungsdauer in die Länge, in manchen Fällen ist die Ausführung sogar schlechter als FIFO

  • Allgemein lässt sich festhalten: Jede Policy die fair ist, d.h. die CPU auf Prozesse aufteilt, führt zu einem schlechten Ergebnis in Bezug auf Turnaround-Zeit

Last updated