Da das CPU-Kernsystem einen oder zwei Threads gleichzeitig verarbeiten kann, bleibt das Betriebssystem auch dann stabil, wenn mehrere Threads ausgeführt werden?

593
Ayman_Hilal

Angenommen, wir haben eine Dual-Core-CPU ohne Hyper-Threading. Das bedeutet, dass sie nur zwei Threads gleichzeitig verarbeiten kann. Nun, nehmen wir an, wir haben eine Netzwerkanwendung, die zwei Hintergrund-Netzwerkthreads ausführt, von denen jeder auf eingehende Verbindungen wartet zu handhaben, also sollten diese Threads die ganze Zeit laufen, warum die Prozesse und Threads des anderen Betriebssystems immer noch funktionieren?! Wie mir 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 wie funktioniert das? Wie kann eine CPU mit vielen Threads gleichzeitig umgehen, ohne dass es zu einem Einfrieren kommt?! (Ich weiß, manchmal werden Fenster langsam und verrückt, wenn viele schwere Programme gleichzeitig ausgeführt werden.

Vielen Dank.

0
Weil das Betriebssystem die Planung übernimmt Ramhound vor 9 Jahren 1

3 Antworten auf die Frage

5
Paul A. Clayton

Die Antwort ist relativ einfach: Wenn ein Thread auf ein E / A-Ereignis wartet, gibt er den Rest seiner Zeit dem Betriebssystem, das dann einen anderen Thread planen kann. Wenn die I / O mit hoher Latenz abgeschlossen ist, wird der Thread als für die Ausführung bereit markiert.

Dies ist weitgehend möglich, da die meisten E / A mit Interrupts verwaltet werden und nicht wiederholt überprüft werden, ob die E / A-Anforderung abgeschlossen ist (als Polling bezeichnet).

Ein Thread kann entweder warten oder laufen, aber nicht beide gleichzeitig. David Schwartz vor 7 Jahren 0
@DavidSchwartz Mit synchroner E / A, statt zu schreiben "Wartet auf ein E / A-Ereignis, ergibt es" Ich hätte präziser schreiben können ", fordert die nächsten E / A-Daten an und ermöglicht es dem Betriebssystem, den Thread zu entschlüsseln, bis mehr Daten vorhanden sind verfügbar". Selbst bei asynchroner E / A wartet der Thread immer noch auf die E / A, läuft jedoch während des Wartens (wie ein Benutzer, der auf eine E-Mail wartet, während er den Computer verwendet). (Eine Callback-Funktion 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, die nach Abschluss einer Arbeitseinheit nach neuen Daten sucht.) Paul A. Clayton vor 7 Jahren 0
Bei herkömmlichen Abfragen wartet ein Thread (es muss nicht notwendigerweise eine nützliche Arbeit geleistet werden (vergleichbar mit der Spin-Lock-Funktion), obwohl eine Abfrageschleife nützliche Arbeit beinhalten kann (nicht dass eine Lock-Wait-Schleife nicht kalt ist)). Bei durch Hardware verwalteten Ereignissen (wie MONITOR / MWAIT von x86) kann ein Thread ausgeführt werden (Betriebssystemperspektive) und warten (Hardwareperspektive). Bei grobkörnigem Hardware-Multithreading kann ein E / A-Register-Lesen (das normalerweise nicht zwischengespeichert werden darf) dazu führen, dass der Hardware-Scheduler Threads aus der Betriebssystemperspektive wechselt, die er noch ausführt. Paul A. Clayton vor 7 Jahren 0
2
Hennes

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 werde die CPU nicht für immer benutzen. Stattdessen gibt es einem anderen Programm nach einiger Zeit eine Chance oder wenn es gesperrt ist.
    Die Antwort von Paul beschreibt das Letztere.

  2. Präemptives Multitasking (fast überall verwendet): Das Betriebssystem (nicht das Programm) übergibt die CPU für kurze Zeit an ein Programm und nimmt es dann weg. Dies kann so simpel sein wie das Ausführen eines Timers, und sobald dieser abgelaufen ist, wird der Prozess angehalten und an das nächste Programm / Programm weitergegeben, das gerade wartet.


Stellen Sie sich in Ihrem Fall ein Büro mit zwei Mitarbeitern und drei (oder mehr) Aufgaben vor. (Nennen wir sie Task-A, Task-B und Task-C).

Der erste, der bearbeitet wird, prüft die Anweisungen des Vorgesetzten, der besagt

  • Stellen Sie einen Timer auf 10 Minuten. Unterbrechen Sie die Arbeit an Ihrer aktuellen Aufgabe, setzen Sie sie unter das Ende der TODO-Liste und lesen Sie dieses Dokument weiter.
  • Entfernen Sie als Nächstes den ersten Eintrag oben in der TODO-Liste und beginnen Sie damit, daran zu arbeiten.
  • Wiederholen.

Worker 1 setzt den Timer und erhält die erste Task der TODO-Liste (in diesem Fall Task-A).

Arbeiter 2 macht dasselbe: Er setzt einen Timer und erhält das, was jetzt ist, von der Spitze der TODO-Liste. Da Worker 1 Task-A von ihm entfernt hat, beginnt Worker 2 nun mit Task-B.

Zehn Minuten später geht der Timer aus. Arbeiter 1 beendet die Arbeit an Task-A 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, startet der Timer jetzt neu und beginnt zu arbeiten, was sich jetzt ganz oben in der TODO-Liste befindet (Task-C).

Worker 2 macht dasselbe und stoppt Task-B und beginnt mit dem Anfang der TODO-Liste (im Beispiel Task-A).

Usw. usw.

Dies ist etwas vereinfacht. Aber es sollte Ihnen eine Vorstellung davon vermitteln, wie zwei Trittstufen (Arbeiter) zu 100% mit drei oder mehr Aufgaben arbeiten können.

In echten Schedulern gibt es noch viel mehr. ZB Interrupts (vergleiche es mit einem Telefon, das mitten in einer Aufgabe klingelt und wie man damit umgeht), intelligente Planung (wenn dieselbe Aufgabe demselben Mitarbeiter zugewiesen wird, wird sie wahrscheinlich schneller erledigt, da der Mitarbeiter bereits damit vertraut ist), E / A (wenn ein Arbeiter ein Buch aus einer Bibliothek benötigt), wartet er nicht bis der Timer abgelaufen ist, sondern fährt sofort mit der nächsten Aufgabe fort usw.

0
Jamie Hanrahan

Das Betriebssystem bleibt auf die gleiche Art und Weise stabil, wenn mehrere Threads auf verschiedenen CPUs laufen. Außerhalb eines CPU-Kerns gibt es sehr wenig offensichtlichen Unterschied im Verhalten zwischen zwei LPs in demselben Kern und einem LP in zwei verschiedenen Kernen. In beiden Fällen müssen alle "Multiprozessor-sicheren" Programmiertechniken wie Semaphore verwendet werden.