Wenn man sich mit der Welt der CPUs beschäftigt, ist es schon fast verrückt, wie sie mehrere Aufgaben gleichzeitig bewältigen, ohne den Überblick zu verlieren. Bei frühen CPUs drehte sich alles um geradlinige Verarbeitung, was zwar einfach klingt, aber die Geschwindigkeit stark einschränkte, da sie auf Daten aus dem RAM oder, schlimmer noch, der Festplatte warten mussten. Man saß da ​​und sah zu, wie die CPU im Leerlauf lief, weil sie auf Daten wartete, die einfach nicht sofort verfügbar waren. Und wenn die Festplatte im Spiel ist? Ja, dann wird das System noch langsamer, denn die Geschwindigkeit der Festplatte lässt den RAM wie einen Ferrari aussehen, obwohl er eher einem Fahrrad ähnelt.

Glücklicherweise sind Prozessoren heute keine leichte Beute mehr – sie beherrschen allerlei clevere Funktionen wie Out-of-Order-Ausführung und Multithreading. Out-of-Order bedeutet, dass die CPU vorausschaut und die Anweisungen neu anordnet, sodass sie immer beschäftigt ist, anstatt zu warten. Multithreading bedeutet, dass mehrere Threads ausgeführt werden können, sodass es so aussieht, als würde viel Arbeit gleichzeitig erledigt – auch wenn technisch gesehen nicht zwei Dinge gleichzeitig erledigt werden können. Im Hintergrund wechselt die CPU blitzschnell zwischen den Threads, um alle Kerne zu beschäftigen – ein sogenannter Kontextwechsel. Ehrlich gesagt ist es schon verrückt, wie schnell das alles passiert – die meisten Benutzer bemerken die kurzen Pausen nicht, aber diese Wechsel finden ständig im Hintergrund statt.

Wie funktioniert ein Kontextwechsel?

Hier geschieht die Magie – oder vielleicht auch ein bisschen Chaos, je nach Konfiguration. Grundsätzlich muss die CPU den Zustand des alten Threads speichern, damit sie später dort weitermachen kann, wo sie aufgehört hat. Das bedeutet, dass alle wichtigen Informationen – Registerwerte, Programmzähler usw.– in einer Datenstruktur namens Prozesskontrollblock oder Switch Frame gespeichert werden. Unter Windows können Sie dies manchmal in Aktion sehen, wenn Sie den Task-Manager öffnen und einen Blick auf Details wie Thread-Informationen werfen, obwohl dies normalerweise automatisch im Hintergrund geschieht. Unter Linux zeigen Tools wie htop oder „top“ die Thread-Zustände an und helfen zu verstehen, was im Hintergrund vor sich geht.

Sobald der alte Thread sicher gespeichert ist, wählt die CPU den nächsten Thread aus. Normalerweise greift der Scheduler einen Thread aus einer Warteschlange zu – man kann es sich als eine Reihe einsatzbereiter Aufgaben vorstellen – oder erhält einen Anstoß durch einen Interrupt, beispielsweise ein Hardwaresignal, das anzeigt, dass etwas abgeschlossen ist oder Aufmerksamkeit erfordert. Die Daten für diesen neuen Thread werden zurück in die CPU-Register geladen – es ist, als würde man einen Schalter umlegen. Dieser Thread wird dann genau dort fortgesetzt, wo er aufgehört hat. Für den Benutzer wirkt dies nahtlos, im Hintergrund läuft es jedoch blitzschnell.

Auswirkungen auf die Leistung

Der Haken dabei ist: Jeder Kontextwechsel kostet etwas Zeit. Nicht viel, da moderner Speicher recht schnell ist, aber genug, um in Hochleistungsumgebungen eine Rolle zu spielen. Beim Wechsel enthalten der Cache und die Puffer der CPU – diese kleinen Geschwindigkeitsbooster – nicht mehr die richtigen Daten für den neuen Thread, was zu Cache-Fehlern führt. Durch die gemeinsame Nutzung von Daten innerhalb desselben Prozesses wird dieser Verlust minimiert, aber beim Wechsel zwischen verschiedenen Prozessen oder unabhängigen Threads? Ja, dann kommt es zu mehr Cache-Fehlern und TLB-Leerläufen, die alles noch weiter verlangsamen. In manchen Setups kann das zu spürbaren Lags oder Verzögerungen führen.

Eine weitere Besonderheit: Hardware kann zwar Kontextwechsel durchführen, die meisten Betriebssysteme bevorzugen jedoch Software, da diese intelligenter entscheiden kann, was gespeichert und wiederhergestellt werden soll. Hardware weiß nicht, was wichtig ist, und ist daher eine Art Vorschlaghammer – sie speichert alle Register unabhängig von ihrer Relevanz. Daher greift das Betriebssystem ein und übernimmt das eigentliche Speichern und Wiederherstellen, einschließlich Dingen wie Gleitkommadaten, die bei hardwarebasierten Wechseln möglicherweise übersprungen werden. Aus diesem Grund sind Software-Kontextwechsel die Norm; sie sind insgesamt effizienter, gehen aber dennoch mit Leistungseinbußen einher.

Abschluss

Alles in allem ist ein Kontextwechsel ein grundlegender Bestandteil des Multitaskings – er ermöglicht es CPUs, mehrere Threads gleichzeitig zu jonglieren, ohne Aufgaben zu verlieren. Dabei wird der Zustand des aktuellen Threads gespeichert und der nächste geladen, was zwar superschnell ist, aber dennoch etwas Leistung kostet. Diese winzigen Verzögerungen summieren sich, wenn Sie häufig wechseln, insbesondere zwischen verschiedenen Prozessen oder bei hoher Arbeitslast. Dennoch ist es der Preis für eine moderne Multi-Core-CPU, die alles von Spielen bis zur Datenverarbeitung im Browser bewältigen kann.