Kontextwechsel (englisch Context Switch) bezeichnet den Vorgang, bei dem der Prozessor von der Ausführung eines Prozesses zur Ausführung eines anderen wechselt. Er ist die mechanische Grundlage jedes Multitasking und wird vom Scheduler ausgelöst.
Was wird gesichert?
Damit ein unterbrochener Prozess später exakt weiterlaufen kann, muss der gesamte Ausführungskontext festgehalten werden: die CPU-Register, der Program Counter (nächste Befehlsadresse), der Stack-Pointer und weitere Zustandsinformationen im Process Control Block (PCB). Anschließend wird der gespeicherte Kontext des nächsten Prozesses geladen. Beim Wechsel zwischen Prozessen unterschiedlicher Adressräume muss zusätzlich die Speicherverwaltung umgeschaltet werden (Page Tables), weshalb ein Prozesswechsel teurer ist als ein Wechsel zwischen Threads desselben Prozesses — diese teilen sich den Adressraum.
Warum kostet er Zeit?
Ein Kontextwechsel verbraucht Rechenzeit, die keinem Prozess zugutekommt: Das Sichern und Laden der Register dauert selbst einige Mikrosekunden, vor allem aber werden Caches kalt. Die Daten und Befehle des alten Prozesses verdrängen die des neuen — nach dem Wechsel muss der Prozessor die Nebenläufigkeit erst wieder „aufwärmen“. Auch der TLB (Translation Lookaside Buffer, der Adressübersetzungen zwischenspeichert) muss bei einem Prozesswechsel oft geleert werden.
Praxis: Weniger ist mehr
Betriebssysteme sind so ausgelegt, dass möglichst wenige Kontextwechsel stattfinden. Bei sehr hoher Prozesszahl kann der Overhead so groß werden, dass das System mehr Zeit mit dem Wechseln als mit der eigentlichen Arbeit verbringt („Thrashing“). Auch die asynchrone Programmierung (z.B. Event-Loops in Webservern) existiert unter anderem deshalb, weil sie Kontextwechsel auf Betriebssystemebene vermeidet.
Verwandte Grundlagen: Prozess-Scheduling, Multitasking, Thread, Interrupt, Virtueller Speicher.