Da jeder CPU-Kern ein oder zwei Threads gleichzeitig verarbeiten kann, wie stabil ist das Betriebssystem dann noch, wenn mehrere Threads ausgeführt werden?

0

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.

Ayman_Hilal
quelle
1
Weil das Betriebssystem die Planung
übernimmt

Antworten:

5

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).

Paul A. Clayton
quelle
Ein Thread kann entweder warten oder laufen, aber nicht beide gleichzeitig.
David Schwartz
@DavidSchwartz Bei synchronen E / A-Vorgängen wartet das Schreiben nicht auf ein E / A-Ereignis, sondern liefert die Meldung "Ich hätte genauer schreiben können", fordert die nächsten E / A-Daten an und ermöglicht dem Betriebssystem, den Thread zu deschedulen, bis weitere Daten vorliegen verfügbar". Selbst bei asynchroner E / A würde der Thread noch auf die E / A warten, aber noch ausgeführt, während er wartet (wie ein Benutzer, der auf eine E-Mail wartet, während er den Computer verwendet). (Eine Rückruffunktion würde es einem Thread ermöglichen, die neuen Daten so schnell wie möglich zu verarbeiten, oder es könnte eine grobkörnige Abfrage verwendet werden, um nach Abschluss einer Arbeitseinheit nach neuen Daten zu suchen.)
Paul A. Clayton
Beim herkömmlichen Polling wartet ein Thread (erledigt nicht unbedingt nützliche Arbeit (ähnlich wie Spin Lock), obwohl eine Polling-Schleife nützliche Arbeit beinhalten kann (nicht, dass eine Lock-Wait-Schleife nicht funktioniert)). Bei von der Hardware verwalteten Ereignissen (z. B. MONITOR / MWAIT von x86) kann ein Thread ausgeführt werden (Betriebssystemperspektive) und warten (Hardwareperspektive). Bei grobkörnigem Hardware-Multithreading kann ein E / A-Register-Lesevorgang (der normalerweise nicht zwischengespeichert werden darf) dazu führen, dass der Hardware-Scheduler Threads wechselt, obwohl er aus Sicht des Betriebssystems noch ausgeführt wird.
Paul A. Clayton
2

Wenn Sie kooperatives Multitasking verwenden und ein schlechtes Programm haben, dann haben Sie Recht.

In der realen Welt soll jedoch Folgendes passieren:

  1. 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.

  2. 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:

  • Stellen Sie einen Timer 10 Minuten. Wenn es nicht mehr funktioniert, setzen Sie es an das Ende der TODO-Liste und lesen Sie dieses Dokument weiter.
  • Entfernen Sie als Nächstes den ersten Eintrag vom oberen Rand der TODO-Liste und beginnen Sie mit der Bearbeitung.
  • Wiederholen.

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.)

Hennes
quelle
0

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.

Jamie Hanrahan
quelle