David Schirrmeister 714b53e396 update
2024-07-01 17:45:48 +02:00

145 lines
5.8 KiB
Markdown

# Scheduling
Prozess, wie das Betriebssystem die Ausführung von Aufgaben (Prozessen, Threads, ...) plant und verwaltet
- Hauptziel: Effiziente Nutzung der Systems
- Erfüllung der Anforderungen des Systems und des Benutzers
- Kritisches Element im BS-Design
- direkter Einfluss auf Leistung, Benutzererfahrung
## Aufgaben eines Schedulers
- **Prozessorzuweisung**
- welcher Prozess als nächstes?
- **Prozessorwechsel**
- Wechsel von einem laufenden Prozess zu einem anderen
- **Prioritätszuweisung**
- Bestimmt Priorität von Prozessen → wichtige Aufgaben werden bevorzugt behandelt
- **Warteschlangenmanagement**
- Verwaltung der Warteschlangen mit Prozessen
## Entscheidungsverfahren
- **CPU-Auslastung**
- Maximierung der CPU-Auslastung
- **Durchsatz**
- Anzahl abgeschlossene Aufgaben pro Zeit
- **Wartezeit**
- Minimierung der Wartezeit der Prozesse in der Warteschlange
- **Umlaufzeit**
- Gesamtzeit die ein Prozess benötigt um abgeschlossen zu werden
- **Antwortzeit**
- Zeit zwischen der Anforderung eines Benutzers und der ersten Reaktion des Systems
## Nicht präemptives Scheduling
- Art von Prozessorscheduling beo dem der laufende Prozess nicht unterbrochen werden kann
- bis CPU-Zeitscheibe vollständig oder andere Blockierungsbedingung
- Eingesetz in
- einfache Systeme, Batch-Verarbeitung-Umgebungen
- Vorhersagbarkeit, einfache Implementierung wichtiger als schnelle Reaktion auf Benutzerinteraktion
## Präemptives Scheduling
- Betriebssystemkern kann Kontrolle über CPU von einem laufenden Prozess übernehmen
- kann anderem Prozess CPU-Zeit zuweisen, _falls best. Bedingungen erfüllt_
## Prioritätengesteuertes Scheduling
- Ausführungsreihenfolge der Prozesse hängt von deren Priorität ab
- Jeder Prozess kriegt bestimmte Prio
- Scheduler nimmt Prozess mit höchster Prio
- es gibt präemptive und nicht präemptive Ansätze
- Wird in Echtzeitsystemen und vielen anderen verwendet
- wichtige oder zeitkritische Aufgaben werden bevorzugt behandelt
## Zeitscheiben-Scheduling
- spezielle Form des [präemptiven Schedulings](#pr-emptives-scheduling)
- Jeder Prozess wird für eine festgelegte Zeitscheibe auf dem Prozessor ausgeführt
- sobald abgelaufen → nächster Prozess
- wiederholt sich zyklisch
- Wird verwendet in
- _Mehrbenutzersystemen_
## Weitere Scheduling-Strategien
- First Come First Served
- Shortest / Longest Process next
- Shortest / Longest Remaining Time next
- Highest Response Ratio next
- Earliest Deadline next
- [Fair-Share-Scheduling](#scheduling-unter-linux)
- Multilevel-Scheduling
- ...
## Scheduling unter Linux
![image_161.png](image_161.png)
[![Youtube: Linux Completely Fair Scheduler](http://i3.ytimg.com/vi/2UYuWWX3SMc/hqdefault.jpg)](https://www.youtube.com/watch?v=2UYuWWX3SMc)
### Completely Fair Scheduler (CFS)
- faire Verteilung der CPU-Ressourcen zwischen verschiedenen Prozessen oder Threads
- erstmals in Linux im Kernel 2.6.23
- Bemühung **bessere Leistung** und **Gerechtigkeit** bei Verteilung von Ressourcen in Mehrbenutzersystemen
- Implementierungen und genutzte Algorithmen können variieren
### Grundprinzipien des CFS
- **Fairness**
- jeder ausführbare Prozess sollte proportional zur Anzahl der CPU-Ressourcen, die er benötigt, bedient werden
- **Keine festen Zeitscheiben**
- Ausführungszeit wird dynamisch an Prozesse angepasst
- **Gewichtungen**
- Prozesse mit höherem "Gewicht" erhalten größere Zeiteinteilung an CPU
- **Virtual Runtime**
- Gewicht und Ausführungszeit → vRuntime
- Prozesse mit kürzerer vRuntime priorisiert
- Entscheidungsstruktur: [Rot-Schwarz-Baum](https://de.wikipedia.org/wiki/Rot-Schwarz-Baum)
- ![image_162.png](image_162.png)
### Beispiel Funktionsweise des CFS
![image_163.png](image_163.png)
- Neue Prozesse können während Latenz des Schedulers eingefügt werden
- **vruntime** wird initialisiert mit minimaler Laufzeit (**min_vruntime**)der bereits vorhanden Tasks
- weil jetzt ein zusätzlicher Task da ist, wird allen vorhandenen Tasks automatisch anteilig weniger Laufzeit zugeteilt
- ![image_164.png](image_164.png)
> Manchmal möchte man die Priorität eines Prozesses verändern. Sie kann mit **nice** gesetzt werden
> und mit **renice** angepasst werden
>
> Jeder Prozess kann einen [nice-Wert](#nicewert) von -20 bis 19(20) haben. Standard ist 0
### Berechnung der Gewichtung (CFS)
- **1024/1,25<sup>[niceWert](#nicewert)</sup>**
- Falls [niceWert](#nicewert) abnimmt, steigt Gewicht an
- Zeitscheibe ist proportional zur Gewichtung dividiert durch Gesamtgewichtung aller Prozesse
- ![image_165.png](image_165.png)
#### Beispiel
- 131 Tasks (nice = 0) → Gewicht w = 1024
- 20 Tasks (nice = -20) → Gewicht w = 88817,84
- Alle Tasks mit nice=0 belegen ca. 7% der CPU
- $131*1024 / (131*1024 + 20*88817,84) → ca. 7%$
- tun i.d.R nichts → genug runtime
- Alle Tasks mit $nice = -20$ belegen ca. 93% der CPU
### niceWert
Befehle mit [POSIX-API](06_prozessstruktur.md#posix-api)
- **setpriority** - niceLevel eines Prozesses setzen
- **getpriority** - niceLevel eines Prozesses lesen
## Real-Time Scheduling
- zielt darauf ab, dass Prozesse oder Aufgaben spezifische zeitliche Anforderungen erfüllen
- Bsp.:
- Dekodierung von Bildern eines Videostreams
- 30 Bilder / Sekunde
- Jedes Bild muss in 1/30s dekodiert und angezeigt werden
- in **harten Echtzeitsystemen** müssen Aufgaben ihre zeitlichen Anforderungen strikt und zuverlässig erfüllen
- bspw. Flugzeug, medizinische Geräte, ...
- _Scheduling-Algorithmen_
- Rate Monotonic Scheduling (RMS)
- Earliest Deadline First (EDF)
- in **weichen Echtzeitsystemen** sind zeitliche Anforderung auch wichtig, aber Versäumnis ist nicht katastrophal
- bspw. Multimediale Anwendungen, Spiele
- _Scheduling-Algorithmen_
- Weighted Fair Queuing (WFQ)
- Proportional Share Scheduling