Nehmen wir an, wir haben eine Dual-Core-CPU ohne Hyper-Threading, das heißt, sie kann nur zwei Threads gleichzeitig verarbeiten. Nehmen wir nun an, wir haben eine Netzwerkanwendung, die zwei Hintergrund-Netzwerk-Threads ausführt, von denen jeder auf eingehende Verbindungen wartet zu handhaben, also sollten diese Threads die ganze Zeit laufen, warum funktionieren die Prozesse und Threads des anderen Betriebssystems immer noch ?! Wie es scheint, können sie nicht verarbeitet werden, da zwei Threads die CPU-Verarbeitungseinheit vollständig entleeren, da sie auf eingehende Netzwerkverbindungen warten und daher jede Nanosekunde für Verbindungen bereit sein sollten. Wie geschieht das und funktioniert es? Wie CPU kann mit vielen und vielen Threads gleichzeitig umgehen, ohne dass ein merkliches Einfrieren auftritt?! (Ich weiß, manchmal wird Windows langsam und verrückt, wenn viele schwere Programme gleichzeitig ausgeführt werden.)
Vielen Dank.
quelle
Antworten:
Die Antwort ist relativ einfach: Wenn ein Thread auf ein E / A-Ereignis wartet, gibt er den Rest seiner Zeitscheibe an das Betriebssystem weiter, das dann einen anderen Thread einplanen kann. Wenn die E / A mit hoher Latenz abgeschlossen ist, wird der Thread als ausführungsbereit markiert.
Dies ist größtenteils möglich, da die meisten E / A-Vorgänge mit Interrupts verwaltet werden, anstatt wiederholt zu prüfen, ob die E / A-Anforderung abgeschlossen wurde (sogenanntes Polling).
quelle
Wenn Sie kooperatives Multitasking verwenden und ein schlechtes Programm haben, dann haben Sie Recht.
In der realen Welt soll jedoch Folgendes passieren:
Kooperatives Multitasking: Ich nutze die CPU nicht für immer. Stattdessen gibt es einem anderen Programm nach einiger Zeit oder wenn es blockiert ist, eine Chance.
Die Antwort des Paulus beschreibt die letztere.
Präventives Multitasking (fast überall verwendet): Das Betriebssystem (nicht das Programm) gibt der CPU für kurze Zeit Zeit für ein Programm und nimmt es dann weg. Dies kann so einfach sein wie das Ausführen eines Timers und wenn dies abgelaufen ist, wird der Prozess angehalten und an das nächste wartende Profil / Programm übergeben.
Stellen Sie sich in Ihrem Fall ein Büro mit zwei Mitarbeitern und drei (oder mehr) Aufgaben vor. (Nennen wir sie Aufgabe-A, Aufgabe-B und Aufgabe-C).
Die erste Arbeit prüft die Anweisungen des Vorgesetzten, in denen es heißt:
Arbeiter 1 stellt den Timer ein und erhält die erste Aufgabe der TODO-Liste (in diesem Fall Aufgabe A).
Arbeiter 2 macht dasselbe: Er setzt einen Timer und holt das, was jetzt oben in der TODO-Liste steht. Da der Arbeiter 1 die Aufgabe A entfernt hat, beginnt der Arbeiter 2 nun mit Aufgabe B.
Zehn Minuten später geht der Timer aus. Arbeiter 1 hört auf, an Aufgabe A zu arbeiten und erhält die Anweisungen des Vorgesetzten. Diese geben an, dass die aktuelle Aufgabe am Ende der TODO-Liste steht. Wenn Sie die Anweisungen des Supervisors fortsetzen, wird der Timer neu gestartet und Sie können mit der Arbeit beginnen, die sich jetzt oben in der TODO-Liste befindet (dies ist Aufgabe C).
Worker 2 macht dasselbe und stoppt Task-B und beginnt mit dem Anfang der TODO-Liste (im Beispiel Task-A).
Usw.
Dies ist etwas vereinfacht. Aber es sollte Ihnen eine Vorstellung davon geben, wie zwei Stufen (Arbeiter) 100% der Zeit an drei oder mehr Aufgaben arbeiten können.
In echten Schedulern gibt es noch viel mehr Dinge. ZB Unterbrechungen (vergleiche es mit einem Telefon, das mitten in einer Aufgabe klingelt, und wie man damit umgeht), intelligente Zeitplanung (die gleiche Aufgabe demselben Arbeiter zu übertragen, wird wahrscheinlich dazu führen, dass sie schneller erledigt wird, da der Arbeiter bereits mit ihr vertraut ist) , I / O (Wenn ein Mitarbeiter ein Buch aus einer Bibliothek benötigt, wartet er nicht, bis der Timer abgelaufen ist, sondern fährt sofort mit der nächsten Aufgabe usw. fort.)
quelle
Das Betriebssystem bleibt weitgehend stabil, wenn mehrere Threads auf verschiedenen CPUs ausgeführt werden. Von außerhalb eines CPU-Kerns ist kaum ein Unterschied im Verhalten zwischen zwei LPs im selben Kern und je einer LP in zwei unterschiedlichen Kernen erkennbar. In beiden Fällen müssen dieselben "prozessorsicheren" Programmiertechniken wie Semaphoren verwendet werden.
quelle