Da jeder CPU-Kern einen oder zwei Threads gleichzeitig verarbeiten kann, wie bleibt das Betriebssystem weiterhin stabil, selbst wenn mehrere Threads ausgeführt werden?

Da jeder CPU-Kern einen oder zwei Threads gleichzeitig verarbeiten kann, wie bleibt das Betriebssystem weiterhin stabil, selbst wenn mehrere Threads ausgeführt werden?

Um das genauer zu erklären: 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 Netzwerk-Threads im Hintergrund ausführt. Jeder von ihnen wartet auf eingehende Verbindungen, also sollten diese Threads die ganze Zeit laufen. Warum laufen dann die Prozesse und Threads des anderen Betriebssystems noch?! Meiner Ansicht nach können sie nicht verarbeitet werden, da es zwei Threads gibt, die die CPU-Verarbeitungseinheit vollständig belasten, da sie auf eingehende Netzwerkverbindungen warten und daher jede Nanosekunde für Verbindungen bereit sein sollten ... Wie passiert das und wie funktioniert das? Wie kann die CPU viele, viele Threads gleichzeitig verarbeiten, ohne dass es merklich einfriert?! (Ich weiß, manchmal wird Windows langsam und verrückt, wenn viele schwere Programme gleichzeitig laufen, aber das ist kein allgemeines Problem.)

Danke.

Antwort1

Die Antwort ist relativ einfach: Wenn ein Thread auf ein I/O-Ereignis wartet, übergibt er den Rest seines Zeitfensters an das Betriebssystem, das dann einen anderen Thread planen kann. Wenn der I/O mit hoher Latenz abgeschlossen ist, wird der Thread als zur Ausführung bereit markiert.

Dies ist größtenteils möglich, weil die meisten E/A-Vorgänge mit Interrupts verwaltet werden, anstatt wiederholt zu prüfen, ob die E/A-Anforderung abgeschlossen ist (bekannt als Polling).

Antwort2

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

In der realen Welt sollte jedoch Folgendes passieren:

  1. Kooperatives Multitasking: Mein Ansatz verwendet die CPU nicht für immer. Stattdessen gibt es entweder nach einiger Zeit oder wenn es blockiert ist einem anderen Programm eine Chance.
    Pauls Antwort beschreibt Letzteres.

  2. Präemptives Multitasking (wird fast überall verwendet): Das Betriebssystem (nicht das Programm) gibt einem Programm für kurze Zeit die CPU und nimmt sie dann wieder weg. Das kann so einfach sein wie das Ausführen eines Timers und das Stoppen des Prozesses nach Ablauf und die Übergabe an den nächsten wartenden Thread/das nächste wartende Programm.


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

Der erste Prüfer überprüft die Anweisungen des Vorgesetzten, in denen steht:

  • Stellen Sie einen Timer auf 10 Minuten. Wenn er klingelt, hören Sie mit der Arbeit an Ihrer aktuellen Aufgabe auf, setzen Sie sie ans Ende der To-do-Liste und lesen Sie dieses Dokument weiter.
  • Entfernen Sie als Nächstes das erste Element oben aus der TODO-Liste und beginnen Sie damit.
  • Wiederholen.

Arbeiter 1 stellt den Timer ein und holt die erste Aufgabe der TODO-Liste (in diesem Fall ist das Aufgabe A).

Worker 2 macht dasselbe: Er stellt einen Timer ein und holt sich, was jetzt ganz oben auf der TODO-Liste steht. Da Worker 1 Aufgabe A von ihm entfernt hat, beginnt Worker 2 jetzt mit Aufgabe B.

Zehn Minuten später läuft der Timer ab. Arbeiter 1 beendet die Arbeit an Aufgabe A und erhält die Anweisungen des Vorgesetzten. Diese besagen, dass die aktuelle Aufgabe ans Ende der To-do-Liste gesetzt werden soll. Er befolgt die Anweisungen des Vorgesetzten und startet nun den Timer neu und beginnt mit der Arbeit an dem, was jetzt ganz oben auf der To-do-Liste steht (das ist Aufgabe C).

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

Usw. usw.

Dies ist etwas vereinfacht. Es sollte Ihnen jedoch eine Vorstellung davon vermitteln, wie zwei Treads (Arbeiter) 100 % der Zeit an drei oder mehr Aufgaben arbeiten können.

In echten Schedulern gibt es noch viel mehr Dinge. Z. B. Unterbrechungen (vergleichen Sie es mit einem Telefon, das mitten in einer Aufgabe klingelt, und wie man damit umgeht), intelligente Planung (wenn Sie demselben Mitarbeiter dieselbe Aufgabe geben, wird sie wahrscheinlich schneller erledigt, da der Mitarbeiter bereits damit vertraut ist), I/O (wenn ein Mitarbeiter ein Buch aus einer Bibliothek benötigt, wartet er nicht, bis der Timer abgelaufen ist, sondern macht sofort mit der nächsten Aufgabe weiter usw. usw.

Antwort3

Das Betriebssystem bleibt ziemlich genau so stabil, wie es stabil bleibt, wenn mehrere Threads auf verschiedenen CPUs laufen. Von außerhalb eines CPU-Kerns gibt es kaum erkennbare Unterschiede im Verhalten zwischen zwei LPs im selben Kern und jeweils einem LP in zwei verschiedenen Kernen. In beiden Fällen müssen dieselben „multiprozessorsicheren“ Programmiertechniken wie Semaphoren verwendet werden.

verwandte Informationen