Betriebssysteme: Drei einfache Teile. Teil 5: Planung: Mehrstufige Feedback-Warteschlange (Übersetzung)

EinfĂŒhrung in Betriebssysteme


Hallo Habr! Ich möchte Sie auf eine Reihe von ArtikelĂŒbersetzungen einer meiner Meinung nach interessanten Literatur aufmerksam machen - OSTEP. Dieser Artikel beschreibt ziemlich ausfĂŒhrlich die Arbeit von Unix-Ă€hnlichen Betriebssystemen, nĂ€mlich die Arbeit mit Prozessen, verschiedenen Schedulern, Speicher und anderen Ă€hnlichen Komponenten, aus denen das moderne Betriebssystem besteht. Das Original aller Materialien können Sie hier sehen . Bitte beachten Sie, dass die Übersetzung unprofessionell (ziemlich frei) durchgefĂŒhrt wurde, aber ich hoffe, dass ich die allgemeine Bedeutung beibehalten habe.

Laborarbeiten zu diesem Thema finden Sie hier:


Andere Teile:


Und du kannst meinen Kanal im Telegramm ansehen =)

Planung: Mehrstufige Feedback-Warteschlange


In diesem Vortrag werden wir ĂŒber die Probleme bei der Entwicklung eines der bekanntesten AnsĂ€tze sprechen
Planung namens Multi-Level Feedback Queue (MLFQ). Der MLFQ-Scheduler wurde erstmals 1962 von Fernando J. CorbatĂł in einem System namens Compatible Time-Sharing System (CTSS) beschrieben. Diese Arbeiten (einschließlich spĂ€terer Arbeiten zu Multics) wurden anschließend beim Turing Award eingereicht. Der Scheduler wurde anschließend verbessert und erhielt ein Aussehen, das bereits in einigen modernen Systemen zu finden ist.

Der MLFQ-Algorithmus versucht, zwei grundlegende Querschnittsprobleme zu lösen.
ZunĂ€chst versucht er, die Bearbeitungszeit zu optimieren, die, wie wir in der vorherigen Vorlesung untersucht haben, optimiert wird, indem am Anfang der Warteschlange der kĂŒrzesten Aufgaben begonnen wird. Das Betriebssystem weiß jedoch nicht, wie lange dieser oder jener Prozess funktionieren wird, und dies ist das notwendige Wissen fĂŒr den Betrieb der SJF- und STCF-Algorithmen. Zweitens versucht MLFQ, das System auf Benutzer (z. B. diejenigen, die auf dem Bildschirm sitzen und starren, wĂ€hrend sie auf den Abschluss der Aufgabe warten) zu reagieren und so die Antwortzeit zu minimieren. Leider reduzieren Algorithmen wie RR die Antwortzeit, haben jedoch einen sehr schlechten Einfluss auf die Durchlaufzeitmetriken. Daher unser Problem: Wie kann man einen Scheduler entwerfen, der unseren Anforderungen entspricht und gleichzeitig nichts ĂŒber die Art des Prozesses im Allgemeinen weiß? Wie kann der Planer die Merkmale der von ihm gestarteten Aufgaben kennenlernen und so bessere Planungsentscheidungen treffen?

Das Wesentliche des Problems: Wie kann man die Formulierung von Aufgaben ohne perfektes Wissen planen? Wie kann ein Scheduler entwickelt werden, der gleichzeitig die Antwortzeit fĂŒr interaktive Aufgaben minimiert und gleichzeitig die Bearbeitungszeit minimiert, ohne die Zeit fĂŒr die AusfĂŒhrung der Aufgabe zu kennen?

Hinweis: Aus frĂŒheren Ereignissen lernen

Die MLFQ-Aufstellung ist ein großartiges Beispiel fĂŒr ein System, das aus vergangenen Ereignissen lernt, um die Zukunft vorherzusagen. Ähnliche AnsĂ€tze finden sich hĂ€ufig im Betriebssystem (und in vielen anderen Bereichen der Informatik, einschließlich Hardware-Vorhersagezweigen und Caching-Algorithmen). Ähnliche Reisen funktionieren, wenn Aufgaben Verhaltensphasen haben und daher vorhersehbar sind.

Bei einer solchen Technik sollte man jedoch vorsichtig sein, da sich Vorhersagen sehr leicht als falsch herausstellen und das System dazu veranlassen können, schlechtere Entscheidungen zu treffen, als dies ohne Wissen ĂŒberhaupt der Fall wĂ€re.

MLFQ: Grundregeln


Beachten Sie die Grundregeln des MLFQ-Algorithmus. Obwohl es mehrere Implementierungen dieses Algorithmus gibt, sind die grundlegenden AnsÀtze Àhnlich.

In der Implementierung, die wir betrachten werden, wird es in MLFQ mehrere separate Warteschlangen geben, von denen jede eine andere PrioritĂ€t hat. Eine zur AusfĂŒhrung bereitstehende Aufgabe befindet sich jederzeit in einer Warteschlange. MLFQ verwendet PrioritĂ€ten, um zu entscheiden, welche Aufgabe ausgefĂŒhrt werden soll, d. H. Eine Aufgabe mit einer höheren PrioritĂ€t (eine Aufgabe aus der Warteschlange mit einer höheren PrioritĂ€t) wird zuerst gestartet.

Zweifellos kann sich mehr als eine Aufgabe in einer bestimmten Warteschlange befinden, sodass sie dieselbe PrioritÀt haben. In diesem Fall wird die RR-Engine verwendet, um den Start unter diesen Aufgaben zu planen.

Somit kommen wir zu zwei Grundregeln fĂŒr MLFQ:

  • Regel 1: Wenn PrioritĂ€t (A)> PrioritĂ€t (B), wird Aufgabe A gestartet (B nicht).
  • Regel 2: Wenn PrioritĂ€t (A) = PrioritĂ€t (B), werden A & B mit RR gestartet

Auf dieser Grundlage sind die SchlĂŒsselelemente fĂŒr die MLFQ-Planung PrioritĂ€ten. Anstatt fĂŒr jede Aufgabe eine feste PrioritĂ€t festzulegen, Ă€ndert MLFQ seine PrioritĂ€t abhĂ€ngig vom beobachteten Verhalten.

Wenn beispielsweise eine Aufgabe die Arbeit an der CPU stĂ€ndig beendet, wĂ€hrend sie auf Tastatureingaben wartet, behĂ€lt MLFQ die PrioritĂ€t des Prozesses auf einem hohen Niveau bei, da der interaktive Prozess auf diese Weise funktionieren sollte. Wenn im Gegenteil die Aufgabe die CPU ĂŒber einen langen Zeitraum stĂ€ndig und intensiv nutzt, verringert MLFQ ihre PrioritĂ€t. Daher wird MLFQ das Verhalten von Prozessen zum Zeitpunkt ihres Betriebs untersuchen und das Verhalten verwenden.

Lassen Sie uns ein Beispiel zeichnen, wie die Warteschlangen zu einem bestimmten Zeitpunkt aussehen könnten, und dann erhalten wir so etwas:

Bild

In diesem Schema befinden sich 2 Prozesse A und B in der Warteschlange mit der höchsten PrioritĂ€t. Prozess C befindet sich irgendwo in der Mitte und Prozess D befindet sich ganz am Ende der Warteschlange. GemĂ€ĂŸ den obigen Beschreibungen des MLFQ-Algorithmus fĂŒhrt der Scheduler Aufgaben nur mit der höchsten PrioritĂ€t gemĂ€ĂŸ RR aus, und die Aufgaben C, D sind arbeitslos.

Ein statischer Schnappschuss liefert natĂŒrlich kein vollstĂ€ndiges Bild der Funktionsweise von MLFQ.
Es ist wichtig, genau zu verstehen, wie sich das Bild im Laufe der Zeit Àndert.

Versuch 1: So Àndern Sie die PrioritÀt


Zu diesem Zeitpunkt mĂŒssen Sie entscheiden, wie MLFQ die PrioritĂ€tsstufe der Aufgabe (und damit die Position der Aufgabe in der Warteschlange) wĂ€hrend ihres Lebenszyklus Ă€ndert. Dazu mĂŒssen Sie den Workflow berĂŒcksichtigen: eine Reihe interaktiver Aufgaben mit einer kurzen Laufzeit (und damit hĂ€ufigen CPU-Freigabe) und mehreren langen Aufgaben, die die CPU wĂ€hrend ihrer gesamten Arbeitszeit nutzen, wĂ€hrend die Antwortzeit fĂŒr solche Aufgaben nicht wichtig ist. Und so können Sie den ersten Versuch unternehmen, den MLFQ-Algorithmus mit den folgenden Regeln zu implementieren:

  • Regel 3: Wenn eine Aufgabe in das System eingeht, wird sie mit der höchsten in die Warteschlange gestellt
  • PrioritĂ€t.
  • Regel 4a: Wenn eine Aufgabe das gesamte ihr zugewiesene Zeitfenster verwendet, ist es
  • PrioritĂ€t sinkt.
  • Regel 4b: Wenn die Task die CPU vor Ablauf ihres Zeitfensters freigibt, dann sie
  • bleibt mit der gleichen PrioritĂ€t.

Beispiel 1: Eine einzelne Aufgabe mit langer Laufzeit

Wie Sie in diesem Beispiel sehen können, hat die Aufgabe bei der Zulassung die höchste PrioritĂ€t. Nach einem Zeitfenster von 10 ms wird der Prozess vom Scheduler vorrangig abgesenkt. Nach dem nĂ€chsten Zeitfenster fĂ€llt die Aufgabe schließlich auf die niedrigste PrioritĂ€t im System, wo sie verbleibt.



Beispiel 2: Sie haben eine kurze Aufgabe angesprochen

Schauen wir uns nun ein Beispiel an, wie MLFQ versuchen wird, SJF nÀher zu kommen. In diesem Beispiel gibt es zwei Aufgaben: A, eine lang laufende Aufgabe, die stÀndig die CPU beansprucht, und B, eine kurze interaktive Aufgabe. Angenommen, A hat bereits einige Zeit gearbeitet, als Aufgabe B eintrifft.



In diesem Diagramm sind die Ergebnisse des Skripts sichtbar. Aufgabe A befindet sich wie jede Aufgabe, die eine CPU verwendet, ganz unten. Aufgabe B erreicht T = 100 und wird mit der höchsten PrioritÀt in die Warteschlange gestellt. Da die Zeit ihrer Arbeit kurz ist, endet sie, bevor sie die letzte Stufe erreicht.

Anhand dieses Beispiels sollte man das Hauptziel des Algorithmus verstehen: Da der Algorithmus keine lange oder kurze Aufgabe kennt, geht er zunĂ€chst davon aus, dass die Aufgabe kurz ist, und gibt ihr die höchste PrioritĂ€t. Wenn es sich um eine wirklich kurze Aufgabe handelt, wird sie schnell erledigt. Wenn es sich um eine lange Aufgabe handelt, wird sie sich langsam in der PrioritĂ€t nach unten bewegen und bald beweisen, dass es sich um eine wirklich lange Aufgabe handelt, fĂŒr die keine Antwort erforderlich ist.

Beispiel 3: Was ist mit E / A?

Schauen Sie sich nun das E / A-Beispiel an. Wie in Regel 4b angegeben, bleibt ein Prozess auf derselben PrioritĂ€tsstufe, wenn er einen Prozessor freigibt, ohne seine Prozessorzeit vollstĂ€ndig zu nutzen. Die Absicht dieser Regel ist recht einfach: Wenn eine interaktive Aufgabe viele E / A-VorgĂ€nge ausfĂŒhrt, z. B. darauf wartet, dass ein Benutzer eine Taste oder eine Maus drĂŒckt, gibt eine solche Aufgabe den Prozessor vor dem zugewiesenen Fenster frei. Wir möchten eine solche Aufgabe nicht vorrangig weglassen, und daher bleibt sie auf dem gleichen Niveau.



Dieses Beispiel zeigt, wie der Algorithmus mit solchen Prozessen arbeitet - eine interaktive Aufgabe B, die vor dem AusfĂŒhren des E / A-Prozesses nur 1 ms lang eine CPU benötigt, und eine lange Aufgabe A, die die CPU stĂ€ndig nutzt.

MLFQ hÀlt Prozess B mit der höchsten PrioritÀt, da er die ganze Zeit fortgesetzt wird.
Geben Sie die CPU frei. Wenn B eine interaktive Aufgabe ist, hat der Algorithmus sein Ziel erreicht, interaktive Aufgaben schnell zu starten.

Probleme mit dem aktuellen MLFQ-Algorithmus

In den vorherigen Beispielen haben wir die Basisversion von MLFQ erstellt. Und es scheint, dass er seine Arbeit gut und ehrlich macht, indem er die Prozessorzeit ehrlich auf lange Aufgaben verteilt und es kurzen Aufgaben oder Aufgaben, die intensiv auf E / A zugreifen, ermöglicht, schnell zu arbeiten. Leider enthÀlt dieser Ansatz mehrere schwerwiegende Probleme.

Erstens das Problem des Hungers: Wenn es viele interaktive Aufgaben im System gibt, verbrauchen sie die gesamte Prozessorzeit und somit kann keine einzige lange Aufgabe ausgefĂŒhrt werden (sie hungern).

Zweitens könnten intelligente Benutzer ihre Programme so schreiben
Trick den Planer. Der Trick besteht darin, etwas zu tun
Scheduler, um dem Prozess mehr Prozessorzeit zu geben. Algorithmus das
oben beschrieben ist ziemlich anfĂ€llig fĂŒr solche Angriffe: bevor das Zeitfenster praktisch ist
beendet mĂŒssen Sie eine E / A-Operation ausfĂŒhren (fĂŒr einige, egal welche Datei)
und damit die CPU freigeben. Dieses Verhalten ermöglicht es Ihnen, im selben zu bleiben
die Warteschlange selbst und wieder einen grĂ¶ĂŸeren Prozentsatz der CPU-Zeit erhalten. Wenn fertig
Dies ist korrekt (z. B. 99% der Fensterzeit vor dem Freigeben der CPU).
Eine solche Aufgabe kann den Prozessor einfach monopolisieren.

Schließlich kann ein Programm sein Verhalten im Laufe der Zeit Ă€ndern. Diese Aufgaben
Wer die CPU benutzt hat, kann interaktiv werden. In unserem Beispiel Àhnlich
Aufgaben werden vom Planer nicht richtig behandelt, wie andere es tun wĂŒrden
(anfÀngliche) interaktive Aufgaben.

Frage an das Publikum: Welche Angriffe auf den Planer könnten in der modernen Welt erfolgen?

Versuch 2: PrioritÀt erhöhen



Versuchen wir, die Regeln zu Àndern und herauszufinden, ob wir Probleme mit vermeiden können
Fasten. Was könnten wir tun, um dies sicherzustellen?
CPU-Aufgaben erhalten ihre Zeit (auch wenn nicht lange).
Als einfache Lösung fĂŒr das Problem können Sie regelmĂ€ĂŸig anbieten
Erhöhen Sie die PrioritÀt aller dieser Aufgaben im System. Es gibt viele Möglichkeiten.
Um dies zu erreichen, versuchen wir, als Beispiel etwas Einfaches zu implementieren: ĂŒbersetzen
Alle Aufgaben gleichzeitig mit höchster PrioritÀt, daher die neue Regel:
  • Regel 5 : Übertragen Sie nach einer bestimmten Zeitspanne von S alle Aufgaben im System auf die höchste PrioritĂ€t.

Unsere neue Regel löst zwei Probleme gleichzeitig. Erstens die Prozesse
garantiert nicht verhungern: Aufgaben mit der höchsten PrioritÀt werden geteilt
Prozessorzeit nach dem RR-Algorithmus und damit alle Prozesse empfangen
Prozessorzeit. Zweitens, wenn es einen Prozess gibt, der zuvor verwendet wurde
Nur der Prozessor wird interaktiv, dann bleibt er im Einklang mit dem höheren
PrioritÀt nach einmal erhÀlt eine PrioritÀtserhöhung auf die höchste.
Betrachten Sie ein Beispiel. Betrachten Sie in diesem Szenario einen Prozess mit


CPU und zwei interaktive, kurze Prozesse. Links in der Abbildung zeigt die Abbildung das Verhalten, ohne die PrioritĂ€t zu erhöhen, und daher beginnt die lange Aufgabe zu verhungern, nachdem zwei interaktive Aufgaben im System angekommen sind. In der Abbildung rechts wird alle 50 ms die PrioritĂ€t erhöht, sodass alle Prozesse garantiert Prozessorzeit erhalten und regelmĂ€ĂŸig gestartet werden. In diesem Fall werden 50 ms als Beispiel genommen, in Wirklichkeit ist diese Zahl etwas grĂ¶ĂŸer.
Offensichtlich fĂŒhrt die HinzufĂŒgung von Zeit fĂŒr eine periodische Erhöhung von S zu
logische Frage: Welcher Wert sollte gesetzt werden? Einer der Geehrten
Systemingenieure John Ousterhout nannte Ă€hnliche GrĂ¶ĂŸen in Systemen wie voo-doo
konstant, weil sie irgendwie schwarze Magie fĂŒr richtig forderten
ausstellen. Und leider hat S so ein Aroma. Wenn Sie den Wert auch einstellen
große - lange Aufgaben werden anfangen zu verhungern. Und wenn Sie den Wert zu niedrig einstellen,
Interaktive Aufgaben erhalten keine ordnungsgemĂ€ĂŸe Prozessorzeit.

Versuch 3: Beste Buchhaltung



Jetzt haben wir noch ein Problem, das gelöst werden muss: wie nicht
unseren Planer betrĂŒgen lassen? Schuld an dieser Gelegenheit sind
Regeln 4a, 4b, die es der Aufgabe ermöglichen, die PrioritÀt beizubehalten und den Prozessor freizugeben
vor Ablauf der zugewiesenen Zeit. Wie gehe ich damit um?
Die Lösung in diesem Fall kann als die beste Abrechnung der CPU-Zeit auf jedem angesehen werden
MLFQ-Level. Anstatt die Zeit zu vergessen, die das Programm verwendet hat
Prozessor fĂŒr den zugewiesenen Zeitraum sollten Sie ihn berĂŒcksichtigen und speichern. Nachdem
Der Prozess hat Zeit dafĂŒr aufgewendet, sollte auf den nĂ€chsten reduziert werden
PrioritÀtsstufe. Egal wie der Prozess seine Zeit nutzt - wie
stÀndig auf dem Prozessor oder so viele Anrufe rechnen. Auf diese Weise,
Regel 4 sollte wie folgt umgeschrieben werden:

  • Regel 4 : Nachdem die Aufgabe die ihr in der aktuellen Warteschlange zugewiesene Zeit aufgebraucht hat (unabhĂ€ngig davon, wie oft sie die CPU freigegeben hat), nimmt die PrioritĂ€t einer solchen Aufgabe ab (sie bewegt sich in der Warteschlange nach unten).

Schauen wir uns ein Beispiel an:
""

Die Abbildung zeigt, was passiert, wenn Sie versuchen, den Scheduler zu tÀuschen, wie
Wenn es mit den vorherigen Regeln 4a, 4b wÀre, erhalten wir das Ergebnis auf der linken Seite. Frohes neues
Die Regel ist das Ergebnis auf der rechten Seite. Vor dem Schutz kann jeder Prozess E / A bis zum Abschluss aufrufen und
dominieren somit die CPU nach Aktivierung des Schutzes, unabhÀngig vom Verhalten
I / O, es wird immer noch auf der ganzen Linie fallen und wird daher nicht unehrlich sein
CPU-Ressourcen in Besitz nehmen.

Verbesserung des MLFQ und anderer Probleme


Mit den oben genannten Verbesserungen treten neue Probleme auf: eines der Hauptprobleme
Fragen - wie man einen solchen Scheduler parametriert? Das heißt, Wie viel sollte sein
platzt? Wie groß sollte das Programmfenster in der Warteschlange sein? Wie
Die ProgrammprioritÀt sollte hÀufig erhöht werden, um Hunger zu vermeiden
Änderungen im Programmverhalten berĂŒcksichtigen? Auf diese Fragen ist es nicht einfach
Antwort und nur Experimente mit Lasten und nachfolgender Konfiguration
Der Planer kann zu einem zufriedenstellenden Gleichgewicht fĂŒhren.

Bei den meisten MLFQ-Implementierungen können Sie beispielsweise unterschiedliche Zuweisungen vornehmen
Zeitintervalle zu verschiedenen Warteschlangen. Warteschlangen mit hoher PrioritÀt normalerweise
kurze Intervalle werden zugewiesen. Diese Warteschlangen bestehen aus interaktiven Aufgaben.
Das Umschalten ist sehr empfindlich und sollte 10 oder weniger dauern
ms Im Gegensatz dazu bestehen Warteschlangen mit niedriger PrioritÀt aus langen Aufgaben
CPU In diesem Fall passen lange Zeitintervalle sehr gut (100 ms).


In diesem Beispiel gab es zwei Aufgaben, die in der Warteschlange 20 mit hoher PrioritĂ€t ausgefĂŒhrt wurden
ms, 10 ms lang durch Windows unterbrochen. 40 ms in der mittleren Warteschlange (Fenster bei 20 ms) und in der niedrigen PrioritÀt
Das Zeitfenster fĂŒr die Warteschlange betrug 40 ms, in dem die Aufgaben ihre Arbeit erledigten.

Die Solaris OS MLFQ-Implementierung ist eine Klasse von Time-Sharing-Schedulern.
Der Scheduler bietet eine Reihe von Tabellen, die genau bestimmen, wie es sein soll
Ändern Sie die PrioritĂ€t des Prozesses ĂŒber seine Lebensdauer, was sollte die GrĂ¶ĂŸe sein
das ausgewĂ€hlte Fenster und wie oft Sie die PrioritĂ€ten der Aufgabe erhöhen mĂŒssen. Admin
Systeme können mit dieser Tabelle interagieren und den Scheduler verhalten
anders. StandardmĂ€ĂŸig enthĂ€lt diese Tabelle 60 inkrementelle Warteschlangen.
FenstergrĂ¶ĂŸe von 20 ms (hohe PrioritĂ€t) bis zu mehreren hundert ms (niedrigste PrioritĂ€t) und
auch mit einem Schub aller Aufgaben einmal pro Sekunde.

Andere MLFQ-Planer verwenden keine Tabelle oder eine bestimmte
die Regeln, die in dieser Vorlesung beschrieben werden, im Gegenteil, sie berechnen PrioritÀten mit
mathematische Formeln. So verwendet beispielsweise der Scheduler in FreeBSD die Formel fĂŒr
Berechnen der aktuellen PrioritÀt einer Aufgabe basierend auf dem Umfang des Prozesses
gebrauchte CPU. DarĂŒber hinaus nimmt die Nutzung der CPU mit der Zeit ab und so weiter
Somit erfolgt die PrioritÀtserhöhung etwas anders als oben beschrieben. Ist das so
Zerfallsalgorithmen genannt. Seit Version 7.1 verwendet FreeBSD den ULE-Scheduler.

Schließlich haben viele Planer andere Funktionen. Zum Beispiel einige
Planer reservieren die höchsten Ebenen fĂŒr das Betriebssystem und so weiter
Auf diese Weise kann kein Benutzerprozess die höchste PrioritÀt erhalten
System. Bei einigen Systemen können Sie Tipps geben, um zu helfen.
der Scheduler, um PrioritÀten richtig zu setzen. Zum Beispiel mit dem Befehl nice
Sie können die PrioritÀt der Aufgabe erhöhen oder verringern und damit oder erhöhen
Reduzieren Sie die Wahrscheinlichkeit, dass das Programm Prozessorzeit benötigt.

MLFQ: Zusammenfassung


Wir haben einen Planungsansatz namens MLFQ beschrieben. Sein Name
im Prinzip der Arbeit abgeschlossen - es hat mehrere Warteschlangen und verwendet Feedback
.
:
  • Rule1 : () > (), ( )
  • Rule2 : () = (), RR
  • Rule3 : , .
  • Rule4 : ( CPU) ( ).
  • Rule5 : S .

MLFQ —
,
. — (SJF, STCF) ,
CPU . , BSD ,
Solaris, Windows, Mac
MLFQ .

:


  1. manpages.debian.org/stretch/manpages/sched.7.en.html
  2. en.wikipedia.org/wiki/Scheduling_ (computing)
  3. pages.lip6.fr/Julia.Lawall/atc18-bouron.pdf
  4. www.usenix.org/legacy/event/bsdcon03/tech/full_papers/roberson/roberson.pdf
  5. chebykin.org/freebsd-process-scheduling

Source: https://habr.com/ru/post/de450116/


All Articles