{"id":32158,"date":"2019-10-31T21:45:27","date_gmt":"2019-10-31T18:45:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\/"},"modified":"2019-10-31T21:45:27","modified_gmt":"2019-10-31T18:45:27","slug":"operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","title":{"rendered":"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Einf\u00fchrung in Betriebssysteme<\/h1>\n<p>\nHallo, Habr! Ich m\u00f6chte Ihnen eine Serie von \u00dcbersetzungen einer interessanten Literatur \u2014 OSTEP \u2014 vorstellen. In diesem Material wird die Funktionsweise von Unix-\u00e4hnlichen Betriebssystemen ziemlich gr\u00fcndlich behandelt, insbesondere die Arbeit mit Prozessen, verschiedenen Planern, Speicher und anderen \u00e4hnlichen Komponenten, die ein modernes Betriebssystem ausmachen. Das Original aller Materialien k\u00f6nnen Sie hier ansehen <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">hier<\/a><\/noindex>. Bitte beachten Sie, dass die \u00dcbersetzung unprofessionell (relativ frei) durchgef\u00fchrt wurde, aber ich hoffe, dass ich den allgemeinen Sinn bewahrt habe.<\/p>\n<p>Die Laborarbeiten zu diesem Thema finden Sie hier:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">Original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">Original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">meine pers\u00f6nliche Anpassung<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nAndere Teile:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Teil 1: Einf\u00fchrung<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Teil 2: Abstraktion: Prozess<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Teil 3: Einf\u00fchrung in die API von Prozessen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Teil 4: Einf\u00fchrung in den Scheduler<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nUnd Sie k\u00f6nnen auch meinen Kanal auf <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">Telegramm<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Einf\u00fchrung in den Scheduler<\/h2>\n<p>\n<u>Kernproblem: Wie entwickelt man die Politik des Schedulers?<br \/>\nWie sollten die grundlegenden Rahmenbedingungen f\u00fcr die Scheduler-Politik entwickelt werden? Welche wesentlichen Annahmen sollten getroffen werden? Welche Metriken sind wichtig? Welche grundlegenden Techniken wurden in fr\u00fcheren Computersystemen verwendet?<\/u><\/p>\n<h3>Annahmen zur Arbeitslast<\/h3>\n<p>\n Bevor wir m\u00f6gliche Politiken diskutieren, machen wir zun\u00e4chst einige vereinfachende Abschweifungen \u00fcber die Prozesse, die im System gestartet wurden, die zusammen als <b>Arbeitslast<\/b>definiert werden. Die Definition der Arbeitslast ist ein kritischer Teil des Aufbaus von Politiken, und je mehr Sie \u00fcber die Arbeitslast wissen, desto qualitativ hochwertiger wird die Politik, die Sie schreiben k\u00f6nnen.<\/p>\n<p>Wir werden die folgenden Annahmen \u00fcber die im System gestarteten Prozesse treffen, die manchmal auch als <b>jobs<\/b> (Jobs) bezeichnet werden. Praktisch alle diese Annahmen sind unrealistisch, aber notwendig, um das Denken zu entwickeln.<\/p>\n<ol>\n<li> Jeder Job l\u00e4uft die gleiche Zeit,<\/li>\n<li> Alle Jobs werden gleichzeitig gestartet,<\/li>\n<li> Ein gestarteter Job l\u00e4uft bis zu seinem Abschluss,<\/li>\n<li> Alle Jobs verwenden nur die CPU,<\/li>\n<li> Die Laufzeit jedes Jobs ist bekannt.<\/li>\n<\/ol>\n<h3>Metriken des Schedulers<\/h3>\n<p>\n Neben einigen Annahmen zur Arbeitslast ist auch ein gewisses Vergleichsinstrument f\u00fcr verschiedene Planungsstrategien notwendig: die Metriken des Schedulers. Eine Metrik ist lediglich ein Ma\u00df f\u00fcr irgendetwas. Es gibt eine Reihe von Metriken, die verwendet werden k\u00f6nnen, um Scheduler zu vergleichen.<\/p>\n<p>Als Beispiel verwenden wir die Metrik, die <b>Durchlaufzeit<\/b> (turnaround time) genannt wird. Die Durchlaufzeit eines Jobs wird als die Differenz zwischen der Abschlusszeit des Jobs und der Ankunftszeit des Jobs im System definiert.<\/p>\n<p><u>Tturnaround = Tcompletion \u2212 Tarrival<\/u><\/p>\n<p>Da wir angenommen haben, dass alle Jobs zur gleichen Zeit eingetroffen sind, ist Ta=0 und somit Tt=Tc. Dieser Wert wird sich nat\u00fcrlich \u00e4ndern, wenn wir die oben genannten Annahmen \u00e4ndern.<\/p>\n<p>Eine andere Metrik ist die <b>Fairness<\/b> (Gerechtigkeit, Fairness). Leistung und Fairness sind oft gegens\u00e4tzliche Merkmale in der Planung. Zum Beispiel kann ein Scheduler die Leistung optimieren, jedoch auf Kosten der Wartezeiten f\u00fcr andere Aufgaben, wodurch die Fairness verringert wird.<\/p>\n<h3>FIRST IN FIRST OUT (FIFO)<\/h3>\n<p>\n Der einfachste Algorithmus, den wir implementieren k\u00f6nnen, hei\u00dft FIFO oder <b>first come (in), first served (out)<\/b>. Dieser Algorithmus hat mehrere Vorteile: Er ist sehr einfach zu implementieren und erf\u00fcllt alle unsere Annahmen, indem er seine Arbeit ziemlich gut erledigt.<\/p>\n<p>Betrachten wir ein einfaches Beispiel. Angenommen, 3 Aufgaben wurden gleichzeitig gestellt. Aber nehmen wir an, dass Aufgabe A etwas fr\u00fcher als alle anderen angekommen ist, daher wird sie in der Ausf\u00fchrungsliste vor den anderen stehen, genau wie B im Verh\u00e4ltnis zu C. Nehmen wir an, dass jede von ihnen 10 Sekunden ben\u00f6tigt. Wie w\u00e4re in diesem Fall die durchschnittliche Ausf\u00fchrungszeit dieser Aufgaben?<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/8c17c29e10ac8c2e15f5f9d865922e49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWenn wir die Werte rechnen \u2014 10+20+30 und durch 3 teilen, erhalten wir eine durchschnittliche Ausf\u00fchrungszeit des Programms von 20 Sekunden.<br \/>\n Jetzt versuchen wir, unsere Annahmen zu \u00e4ndern. Insbesondere die Annahme 1 und nehmen daher nicht mehr an, dass jede Aufgabe gleich lange ausgef\u00fchrt wird. Wie wird sich FIFO diesmal verhalten?<\/p>\n<p>Wie sich herausstellt, wirken sich unterschiedliche Ausf\u00fchrungszeiten der Aufgaben \u00e4u\u00dferst negativ auf die Produktivit\u00e4t des FIFO-Algorithmus aus. Angenommen, Aufgabe A ben\u00f6tigt 100 Sekunden, w\u00e4hrend B und C weiterhin jeweils 10 ben\u00f6tigen.<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/a375f3d1571f24df30f446b9bc7a9a9e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n Wie aus der Abbildung hervorgeht, ergibt sich eine durchschnittliche Zeit f\u00fcr das System von (100+110+120)\/3=110. Dieser Effekt wird genannt <b>Konvoieffekt<\/b>, wenn einige kurzfristige Verbraucher einer bestimmten Ressource hinter einem schwergewichtigen Verbraucher in der Schlange stehen. Das ist vergleichbar mit einer Warteschlange im Supermarkt, wenn vor Ihnen ein K\u00e4ufer mit einem vollen Einkaufswagen steht. Die beste L\u00f6sung f\u00fcr dieses Problem ist, an eine andere Kasse zu wechseln oder sich zu entspannen und tief durchzuatmen.<\/p>\n<h3>Shortest Job First<\/h3>\n<p>\n Kann man eine solche Situation mit schweren Prozessen irgendwie l\u00f6sen? Nat\u00fcrlich. Ein anderer Typ der Planung nennt sich<b>Shortest Job First<\/b> (SJF). Sein Algorithmus ist ebenfalls recht primitiv \u2014 wie der Name schon sagt, werden zun\u00e4chst die k\u00fcrzesten Aufgaben nacheinander ausgef\u00fchrt.<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/d0723e313adc9ce7367da611216bf3ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn diesem Beispiel wird das Ergebnis der Ausf\u00fchrung derselben Prozesse die durchschnittliche Durchlaufzeit der Programme verbessern und sie wird <b>50 statt 110<\/b>, was praktisch doppelt so gut ist.<\/p>\n<p>Somit scheint der SJF-Algorithmus f\u00fcr die gegebene Annahme, dass alle Aufgaben gleichzeitig ankommen, der optimalste Algorithmus zu sein. Unsere Annahmen erscheinen jedoch immer noch unrealistisch. Dieses Mal \u00e4ndern wir Annahme 2 und stellen uns vor, dass Aufgaben zu beliebigen Zeiten ankommen k\u00f6nnen und nicht alle gleichzeitig. Welche Probleme k\u00f6nnte das mit sich bringen?<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/2f0145551779f2733281d12bffad3a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nStellen wir uns vor, dass Aufgabe A (100s) als erste ankommt und mit der Ausf\u00fchrung beginnt. Zu t=10 kommen die Aufgaben B und C an, von denen jede 10 Sekunden in Anspruch nimmt. Somit betr\u00e4gt die durchschnittliche Ausf\u00fchrungszeit (100+(110-10)+(120-10))3 = 103. Was k\u00f6nnte der Scheduler tun, um die Situation zu verbessern?<\/p>\n<h3>Shortest Time-to-Completion First (STCF)<\/h3>\n<p>\n Um die Situation zu verbessern, lassen wir die Annahme 3 fallen, dass das Programm gestartet wird und bis zur Fertigstellung l\u00e4uft. Au\u00dferdem ben\u00f6tigen wir Hardwareunterst\u00fctzung und wie Sie sich denken k\u00f6nnen, werden wir einen <b>Timer<\/b> zum Unterbrechen der laufenden Aufgabe und <b>zum Kontextwechsel<\/b>. Dadurch kann der Scheduler etwas unternehmen, wenn die Aufgaben B und C ankommen \u2014 die Ausf\u00fchrung von Aufgabe A beenden und die Aufgaben B und C bearbeiten, um danach die Ausf\u00fchrung von Aufgabe A fortzusetzen. Ein solcher Scheduler wird genannt <b>STCF<\/b>oder <b>Preemptive Job First<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/81644f82b7b1489f239ebbdc5d78000b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Ergebnis dieses Schedulers wird folgendes Ergebnis haben: ((120-0)+(20-10)+(30-10))\\\/3=50. Somit wird dieser Scheduler noch optimaler f\u00fcr unsere Aufgaben.<\/p>\n<h3>Die Metrik Reaktionszeit (Response Time)<\/h3>\n<p>\n Somit, wenn wir die Laufzeit der Aufgaben und die Tatsache wissen, dass diese Aufgaben nur die CPU nutzen, wird STCF die beste L\u00f6sung sein. Fr\u00fcher waren diese Algorithmen recht effektiv. Allerdings verbringt der Benutzer heutzutage die meiste Zeit an der Konsole und erwartet eine produktive interaktive Interaktion. So entstand die neue Metrik \u2014 <b>Antwortzeit<\/b> (Response Time).<\/p>\n<p>Die Antwortzeit wird wie folgt berechnet:<\/p>\n<p><u>Tresponse=Tfirstrun\u2212Tarrival<\/u><\/p>\n<p>Somit wird die Antwortzeit f\u00fcr das vorherige Beispiel wie folgt sein: A=0, B=0, C=10 (abg=3,33).<\/p>\n<p>Und der STCF-Algorithmus ist nicht so gut in Situationen, in denen drei Aufgaben gleichzeitig ankommen \u2013 er muss warten, bis die kleinen Aufgaben vollst\u00e4ndig abgeschlossen sind. Somit ist der Algorithmus gut f\u00fcr die Durchlaufzeit-Metrik, aber schlecht f\u00fcr die Interaktivit\u00e4ts-Metrik. Stellen Sie sich vor, Sie sitzen an einem Terminal und versuchen, Zeichen in einen Editor zu tippen, aber Sie m\u00fcssten mehr als 10 Sekunden warten, weil eine andere Aufgabe den Prozessor besch\u00e4ftigt. Das ist alles andere als angenehm.<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/f1412665826f845fdc685ec3c1a5bdad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDamit stehen wir vor einem anderen Problem \u2013 wie k\u00f6nnen wir einen Scheduler erstellen, der sensitiv auf die Reaktionszeit reagiert?<\/p>\n<h3>Round Robin<\/h3>\n<p>\n Um dieses Problem zu l\u00f6sen, wurde ein Algorithmus entwickelt <b>Round Robin<\/b> (RR). Die Grundidee ist recht einfach: Anstatt Aufgaben bis zur vollst\u00e4ndigen Fertigstellung auszuf\u00fchren, f\u00fchren wir eine Aufgabe f\u00fcr einen bestimmten Zeitraum (genannt Zeitscheibe) aus und wechseln dann zu einer anderen Aufgabe aus der Warteschlange. Der Algorithmus wiederholt diese Arbeit, bis alle Aufgaben abgeschlossen sind. Dabei muss die Ausf\u00fchrungszeit des Programms ein Vielfaches der Zeit sein, nach der der Timer den Prozess unterbricht. Zum Beispiel, wenn der Timer den Prozess alle x=10 ms unterbricht, dann muss die Ausf\u00fchrungsfenstergr\u00f6\u00dfe ein Vielfaches von 10 sein und entweder 10, 20 oder x*10 betragen.<\/p>\n<p>Betrachten wir ein Beispiel: Die Aufgaben ABC kommen gleichzeitig im System an und jede von ihnen m\u00f6chte 5 Sekunden lang arbeiten. Der SJF-Algorithmus w\u00fcrde jede Aufgabe bis zum Ende ausf\u00fchren, bevor er die n\u00e4chste startet. Im Gegensatz dazu w\u00fcrde der RR-Algorithmus mit einem Zeitfenster von 1 Sekunde die Aufgaben wie folgt abarbeiten (siehe Abb. 4.3):<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/a7790cb63c880b286db2a2e3782d59b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(SJF Wieder (Schlecht f\u00fcr die Reaktionszeit)<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/f7e82d68a6118828ea4561a4911744e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Round Robin (Gut f\u00fcr die Reaktionszeit)<\/p>\n<p>Die durchschnittliche Reaktionszeit f\u00fcr den RR-Algorithmus betr\u00e4gt (0+1+2)\/3=1, w\u00e4hrend sie f\u00fcr SJF (0+5+10)\/3=5 betr\u00e4gt.<\/p>\n<p>Es ist logisch anzunehmen, dass das Zeitfenster ein sehr wichtiger Parameter f\u00fcr RR ist; je kleiner es ist, desto h\u00f6her ist die Antwortzeit. Man kann es jedoch auch nicht zu klein w\u00e4hlen, da die Zeit f\u00fcr den Kontextwechsel ebenfalls eine Rolle f\u00fcr die Gesamtleistung spielt. Daher wird die Wahl der Ausf\u00fchrungszeitfenster vom OS-Architekten festgelegt und h\u00e4ngt von den Aufgaben ab, die darin ausgef\u00fchrt werden sollen. Der Kontextwechsel ist nicht die einzige Dienstleistung, die Zeit kostet \u2013 das laufende Programm interagiert mit vielen anderen, beispielsweise verschiedenen Caches, und bei jedem Wechsel muss diese Umgebung gespeichert und wiederhergestellt werden, was ebenfalls viel Zeit in Anspruch nehmen kann.<\/p>\n<p>RR ist ein hervorragender Planer, wenn es nur um die Metrik der Antwortzeit geht. Aber wie verh\u00e4lt sich die Metrik der Durchlaufzeit bei diesem Algorithmus? Betrachten wir das obige Beispiel, bei dem die Ausf\u00fchrungszeiten A, B, C = 5s sind und gleichzeitig eintreffen. Aufgabe A wird um 13 Uhr, B um 14 Uhr und C um 15 Uhr abgeschlossen und die durchschnittliche Durchlaufzeit betr\u00e4gt 14s. Somit ist RR der schlechteste Algorithmus f\u00fcr die Durchlaufzeit-Metrik.<\/p>\n<p>Im Allgemeinen ist jeder Algorithmus vom Typ RR fair, da er die CPU-Bearbeitungszeit gleichm\u00e4\u00dfig zwischen allen Prozessen verteilt. Daher stehen diese Metriken st\u00e4ndig im Konflikt miteinander.<\/p>\n<p>Damit haben wir mehrere gegens\u00e4tzliche Algorithmen und es bleiben einige Annahmen \u2013 dass die Zeit der Aufgabe bekannt ist und dass die Aufgabe nur die CPU nutzt.<\/p>\n<h3>Mischung mit I\/O<\/h3>\n<p>\n Zun\u00e4chst entfernen wir die Annahme 4, dass der Prozess nur die CPU nutzt, das ist nat\u00fcrlich nicht der Fall und Prozesse k\u00f6nnen auch auf andere Hardware zugreifen.<\/p>\n<p>In dem Moment, in dem ein Prozess eine Ein- oder Ausgabeoperation anfordert, wechselt der Prozess in den Zustand 'blocked', in Erwartung des Abschlusses der I\/O. Wenn die I\/O an die Festplatte gesendet wird, kann eine solche Operation mehrere Millisekunden oder l\u00e4nger in Anspruch nehmen, und der Prozessor wird in dieser Zeit unt\u00e4tig sein. In dieser Zeit kann der Scheduler die CPU von einem anderen Prozess nutzen. Die n\u00e4chste Entscheidung, die der Scheduler treffen muss, besteht darin, wann der Prozess seine I\/O abgeschlossen hat. Wenn dies geschieht, tritt eine Unterbrechung auf und das Betriebssystem versetzt den den I\/O anfordernden Prozess in den Zustand 'ready'.<\/p>\n<p>Betrachten wir ein Beispiel aus mehreren Aufgaben. Jede davon ben\u00f6tigt 50 ms Prozessorzeit. Die erste wird jedoch alle 10 ms auf I\/O zugreifen (das ebenfalls alle 10 ms ausgef\u00fchrt wird). Der Prozess B hingegen verwendet einfach 50 ms Prozessor ohne I\/O.<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/a32f5346eda86042c18d6424c19ad6b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn diesem Beispiel verwenden wir den STCF-Planer. Wie wird sich der Planer verhalten, wenn wir einen Prozess wie A darauf starten? Er wird folgenderma\u00dfen vorgehen \u2013 zuerst wird er den Prozess A vollst\u00e4ndig abarbeiten und dann den Prozess B.<\/p>\n<p><img decoding=\"async\" alt=\"Betriebssysteme: Drei einfache St\u00fccke. Teil 4: Einf\u00fchrung in den Scheduler (\u00dcbersetzung)\" src=\"\/wp-content\/uploads\/2019\/04\/9fb709a822b9fc35871b8a342ac38c7e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDer herk\u00f6mmliche Ansatz zur L\u00f6sung dieses Problems besteht darin, jede 10-ms-Unteraufgabe von Prozess A als separate Aufgabe zu interpretieren. So wird bei Start mit dem Algorithmus STJF die Wahl zwischen der 50-ms-Aufgabe und der 10-ms-Aufgabe offensichtlich. Wenn die Unteraufgabe A abgeschlossen ist, wird Prozess B und I\/O gestartet. Nach Abschluss des I\/O wird beschlossen, den 10-ms-Prozess A erneut zu starten, anstatt Prozess B. Dadurch ist es m\u00f6glich, \u00dcberlappungen zu realisieren, bei denen die CPU von einem anderen Prozess genutzt wird, w\u00e4hrend der erste auf I\/O wartet. Das Ergebnis ist eine bessere Auslastung des Systems \u2013 w\u00e4hrend interaktive Prozesse auf I\/O warten, k\u00f6nnen andere Prozesse auf der CPU ausgef\u00fchrt werden.<\/p>\n<h3>Der Oracle ist weg.<\/h3>\n<p>\n Jetzt versuchen wir, die Annahme aufzugeben, dass die Laufzeit einer Aufgabe bekannt ist. Dies ist im Allgemeinen die schlechteste und unrealistischste Annahme aus der gesamten Liste. Tats\u00e4chlich wei\u00df das Betriebssystem in g\u00e4ngigen, durchschnittlichen Systemen normalerweise sehr wenig \u00fcber die Ausf\u00fchrungszeit von Aufgaben, wie w\u00fcrde man also einen Planer ohne das Wissen \u00fcber die Dauer der Aufgabe erstellen? Vielleicht k\u00f6nnten wir einige Prinzipien des RR verwenden, um dieses Problem zu l\u00f6sen?<\/p>\n<h3>Fazit<\/h3>\n<p>\n Wir haben die grundlegenden Ideen der Aufgabenplanung betrachtet und zwei Familien von Planern betrachtet. Der erste startet die k\u00fcrzeste Aufgabe zuerst und erh\u00f6ht so die Durchlaufzeit, w\u00e4hrend der zweite gleichm\u00e4\u00dfig zwischen allen Aufgaben wechselt und die Reaktionszeit erh\u00f6ht. Beide Algorithmen sind dort schlecht, wo die Algorithmen der anderen Familie gut sind. Au\u00dferdem haben wir gesehen, wie die parallele Nutzung von CPU und I\/O die Leistung verbessern kann, aber das Problem mit dem Hellsehen des Betriebssystems nicht gel\u00f6st. Im n\u00e4chsten Kurs werden wir einen Planer betrachten, der in die nahen Vergangenheit schaut und versucht, die Zukunft vorherzusagen. Er hei\u00dft Multi-Level-Feedback-Queue.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449026\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Betriebssysteme: Drei einfache Teile. Teil 4: Einf\u00fchrung in den Planer (\u00dcbersetzung) | ProHoster","description":"Einf\u00fchrung in Betriebssysteme Hallo, Habr! Ich m\u00f6chte Ihnen eine Reihe von Artikel\u00fcbersetzungen einer interessanten Literatur \u2014 OSTEP \u2014 vorstellen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:45:27+00:00","article:modified_time":"2019-10-31T18:45:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32158","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 09:34:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:03:25","updated":"2026-01-21 09:34:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=32158"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/23990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}