diff --git a/Writerside/images/image_161.png b/Writerside/images/image_161.png new file mode 100644 index 0000000..85abede Binary files /dev/null and b/Writerside/images/image_161.png differ diff --git a/Writerside/images/image_162.png b/Writerside/images/image_162.png new file mode 100644 index 0000000..1bde339 Binary files /dev/null and b/Writerside/images/image_162.png differ diff --git a/Writerside/images/image_163.png b/Writerside/images/image_163.png new file mode 100644 index 0000000..2150b9e Binary files /dev/null and b/Writerside/images/image_163.png differ diff --git a/Writerside/images/image_164.png b/Writerside/images/image_164.png new file mode 100644 index 0000000..bd406ab Binary files /dev/null and b/Writerside/images/image_164.png differ diff --git a/Writerside/images/image_165.png b/Writerside/images/image_165.png new file mode 100644 index 0000000..6c767d6 Binary files /dev/null and b/Writerside/images/image_165.png differ diff --git a/Writerside/in.tree b/Writerside/in.tree index 49572a2..faa2529 100644 --- a/Writerside/in.tree +++ b/Writerside/in.tree @@ -14,6 +14,7 @@ + diff --git a/Writerside/topics/BS/09_Interprozesskommunikation.md b/Writerside/topics/BS/09_Interprozesskommunikation.md index 6617b8d..562dea7 100644 --- a/Writerside/topics/BS/09_Interprozesskommunikation.md +++ b/Writerside/topics/BS/09_Interprozesskommunikation.md @@ -108,9 +108,7 @@ - Programm wartet auf Ergebnis/Rückmeldung einer asynchronen Operation - blockiert dabei NICHT Haupt-Thread - Wird oft verwendet in - - JavaScript - - Python - - Frameworks wie Javas CompletableFuture + - _JavaScript, Python, Frameworks wie Javas CompletableFuture_ - ![image_160.png](image_160.png) ### Sockets diff --git a/Writerside/topics/BS/10_Scheduling.md b/Writerside/topics/BS/10_Scheduling.md new file mode 100644 index 0000000..82f72d9 --- /dev/null +++ b/Writerside/topics/BS/10_Scheduling.md @@ -0,0 +1,145 @@ +# 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[niceWert](#nicewert)** +- 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 \ No newline at end of file