Thread-Kontextwechsel Vs. Prozesskontextwechsel

Antworten:

204

Der Hauptunterschied zwischen einem Thread-Switch und einem Prozess-Switch besteht darin, dass während eines Thread-Switches der virtuelle Speicherplatz gleich bleibt, während dies während eines Prozess-Switches nicht der Fall ist. Bei beiden Typen wird die Steuerung an den Betriebssystemkern übergeben, um den Kontextwechsel durchzuführen. Das Ein- und Ausschalten des Betriebssystemkerns sowie die Kosten für das Ausschalten der Register sind die größten Fixkosten für die Durchführung eines Kontextwechsels.

Ein unschärferer Preis ist, dass ein Kontextwechsel die Cache-Mechanismen des Prozessors durcheinander bringt. Grundsätzlich werden beim Kontextwechsel alle Speicheradressen, an die sich der Prozessor in seinem Cache "erinnert", effektiv unbrauchbar. Der einzige große Unterschied besteht darin, dass beim Ändern des virtuellen Speicherplatzes der TLB (Translation Lookaside Buffer) oder ein gleichwertiger Wert des Prozessors geleert wird, wodurch Speicherzugriffe für eine Weile viel teurer werden. Dies geschieht nicht während eines Threadwechsels.

Abhay Buch
quelle
8
Dies alles setzt voraus, dass der TLB und der Cache die PID nicht für jeden Eintrag speichern.
Dramzy
2
IMHO @dramzy ist richtig, das Betriebssystem unterstützt möglicherweise Rapid Context Switching, das hier kurz erwähnt wird: youtu.be/3akTtCu_F_k?t=46m8s (von Anfang an mehr über virtuellen Speicher, Seitentabellen und TLB erfahren).
Piotrwest
@piotrwest Unterstützt eines der Mainstream-Betriebssysteme Rapid Context Switching?
Max
2
@dramzy Meinten Sie, dass das Betriebssystem oder die Hardware die PID speichern könnten? Ist das relevant?
Max
Meiner Meinung nach gibt es unter Linux nur einen Thread-Schalter (nicht sicher), sodass das Linux-Betriebssystem prüft, ob der nächste auszuführende Thread die Sicherungs-PID mit dem laufenden Thread hat, der geplant wird.
Roachsinai
16

Das Umschalten des Prozesskontexts umfasst das Umschalten des Speicheradressraums. Dies umfasst Speicheradressen, Zuordnungen, Seitentabellen und Kernelressourcen - eine relativ teure Operation. Bei einigen Architekturen bedeutet dies sogar, dass verschiedene Prozessor-Caches geleert werden, die nicht über Adressräume hinweg gemeinsam genutzt werden können. Zum Beispiel muss x86 den TLB leeren und einige ARM-Prozessoren müssen den gesamten L1-Cache leeren!

Thread-Umschaltung ist eine Kontextumschaltung von einem Thread zu einem anderen im selben Prozess (das Umschalten von Thread zu Thread über Prozesse hinweg ist nur eine Prozessumschaltung). Das Umschalten des Prozessorstatus (wie der Programmzähler und der Registerinhalt) ist im Allgemeinen sehr effizient.

aditya dogra
quelle
13

Zunächst bringt das Betriebssystem ausgehende Threads in einen Kernel-Modus, falls dieser noch nicht vorhanden ist, da der Thread-Wechsel nur zwischen Threads durchgeführt werden kann, die im Kernel-Modus ausgeführt werden. Anschließend wird der Scheduler aufgerufen, um eine Entscheidung über den Thread zu treffen, zu dem umgeschaltet werden soll. Nachdem die Entscheidung getroffen wurde, speichert der Kernel einen Teil des Thread-Kontexts, der sich in der CPU befindet (CPU-Register), an der dafür vorgesehenen Stelle im Speicher (häufig oben auf dem Kernel-Stapel des ausgehenden Threads). Dann führt der Kernel einen Wechsel vom Kernelstapel des ausgehenden Threads zum Kernelstapel des eingehenden Threads durch. Danach lädt der Kernel den zuvor gespeicherten Kontext des eingehenden Threads aus dem Speicher in die CPU-Register. Und schließlich kehrt die Steuerung in den Benutzermodus zurück, jedoch in den Benutzermodus des neuen Threads. In dem Fall, in dem das Betriebssystem festgestellt hat, dass ein eingehender Thread ausgeführt wirdIn einem anderen Prozess führt der Kernel einen weiteren Schritt aus: Legt einen neuen aktiven virtuellen Adressraum fest.

Die Hauptkosten in beiden Szenarien hängen mit einer Cache-Verschmutzung zusammen. In den meisten Fällen unterscheidet sich der vom ausgehenden Thread verwendete Arbeitssatz erheblich von dem vom eingehenden Thread verwendeten Arbeitssatz. Infolgedessen beginnt der eingehende Thread sein Leben mit einer Lawine von Cache-Fehlern, wodurch alte und nutzlose Daten aus den Caches gelöscht und die neuen Daten aus dem Speicher geladen werden. Gleiches gilt für TLB (Translation Look Aside Buffer, der sich auf der CPU befindet). Im Fall der Rücksetzen des virtuellen Adressraumes (Lauf Fäden in verschiedenen Prozessen) ist die Strafe noch schlimmer, weil Reset des virtuellen Adressraum führt zur Spülung des gesamten TLB, sogarWenn ein neuer Thread tatsächlich nur wenige neue Einträge laden muss. Infolgedessen beginnt der neue Thread sein Zeitquantum mit vielen TLB-Fehlern und häufigem Seitenlauf. Die direkten Kosten für den Thread-Wechsel sind ebenfalls nicht zu vernachlässigen (von ~ 250 bis zu ~ 1500-2000 Zyklen) und hängen von der CPU-Komplexität, den Zuständen der Threads und den Registersätzen ab, die sie tatsächlich verwenden.

PS: Guter Beitrag zum Overhead von Kontextwechseln: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html

ZarathustrA
quelle
3
  • Prozessumschaltung: Dies ist ein Übergang zwischen zwei Prozessspeichern in einer Multiprogrammierumgebung.
  • Kontextwechsel: Es handelt sich um einen sich ändernden Kontext von einem ausführenden Programm zu einer Interrupt-Serviceroutine (ISR).
John
quelle
2

Beim Thread Context Switching bleibt der virtuelle Speicherplatz gleich, während dies beim Process Context Switch nicht der Fall ist. Außerdem ist Process Context Switch teurer als Thread Context Switch.

Palak Jain
quelle
0

Ich denke, der Hauptunterschied besteht darin, beim Aufrufen switch_mm()die Speicherbeschreibungen der alten und neuen Aufgabe zu verarbeiten. Bei Threads bleibt der Adressraum des virtuellen Speichers unverändert (Threads teilen sich den virtuellen Speicher), sodass nur sehr wenig getan werden muss und daher weniger Kosten anfallen.

Dražen G.
quelle
0

Die Thread-Kontextumschaltung muss zwar den Ausführungskontext ändern (Register, Stapelzeiger, Programmzähler), sie muss jedoch nicht den Adressraum ändern, wie dies bei Prozesskontextwechseln der Fall ist. Es gibt zusätzliche Kosten, wenn Sie den Adressraum wechseln, mehr Speicherzugriff (Paging, Segmentierung usw.) und TLB leeren müssen, wenn Sie einen neuen Prozess betreten oder verlassen ...

Herr Günther
quelle
-1

Kurz gesagt, der Thread-Kontextschalter weist keinen brandneuen Satz von Speicher und PID zu, sondern verwendet denselben wie der übergeordnete, da er im selben Prozess ausgeführt wird. Ein Prozess, den man erzeugt, erzeugt einen neuen Prozess und weist somit ein neues Mem und eine neue PID zu.

Es steckt noch viel mehr dahinter. Sie haben Bücher darüber geschrieben.

Bezüglich der Kosten kann ein Prozesskontext >>>> Thread wechseln, da Sie alle Stapelzähler usw. zurücksetzen müssen.

CtrlDot
quelle
-1

Angenommen, an die CPU, auf der das Betriebssystem ausgeführt wird, sind einige Geräte mit hoher Latenz angeschlossen.

Es ist sinnvoll, einen anderen Thread des Adressraums des Prozesses auszuführen, während das Gerät mit hoher Latenz zurück antwortet.

Wenn das Gerät mit hoher Latenz jedoch schneller reagiert als die erforderliche Zeit, um eine Tabelle + Übersetzung von virtuellen in physische Speicher für einen NEUEN Prozess einzurichten, ist es fraglich, ob ein Wechsel überhaupt erforderlich ist.

Außerdem ist der HOT-Cache (Daten, die zum Ausführen des Prozesses / Threads benötigt werden, in kürzerer Zeit erreichbar) die bessere Wahl.

Lösch mich
quelle