context switch

Context Switching

Written by  on März 9, 2014

Zuerst muss man sehen, was ein Context Switch überhaupt ist. Ganz einfach gesprochen ist es das, was auch mit nur einer CPU im System Multitasking ermöglicht.

Die Wikipedia definiert das ausführlicher:

Kontextwechsel oder Taskswitching (englischcontext switch) nennt man den Vorgang in einem Betriebssystem, bei dem die Bearbeitung des aktuellen Prozesses (oder auch ThreadsTasksoder Programms) unterbrochen wird (z. B. nach einer festgelegten Zeitspanne durch einen Timer-Interrupt oder bei Systemaufrufen) und zu einer anderen Routine gewechselt wird. Dabei wird derKontext (im Wesentlichen die Prozessor-Register) des aktuellen Prozesses/Threads/Tasks gesichert und der Kontext des neuen restauriert. Durch diesen Vorgang wird Multitasking ermöglicht, da sich so mehrere Prozesse im Zeit-Multiplexverfahren auf einem einzelnen CPU-Kern mehr oder weniger gleichzeitig ausführen lassen.

Wie aufwändig ist jetzt ein Context Switch? Dieser Frage wird ein einem Blogartikel nachgegangen: Also im Worst case 4500 ns. Schon klar, das kann deutlich besser aussehen, je nach verwendetem System oder auch der verwendeten CPU.

Wie viele Context switches passieren denn so auf einem System? Am einfachsten eniemal mit dem SAR command nachsehen:

# sar -w 1 10000
Linux 2.6.34.10-0.6-default (ServerWalterschlag) 03/09/14 _i686_ (1 CPU)
10:37:57 proc/s cswch/s
10:37:58 0.00 157.00
10:37:59 0.00 158.00
10:38:00 0.00 319.80
10:38:02 0.00 161.00
10:38:03 0.00 159.41
10:38:04 0.00 165.35
10:38:05 0.00 150.00
10:38:06 0.00 199.00
10:38:07 0.00 184.16
10:38:08 0.00 275.76
10:38:09 0.00 190.10
10:38:10 0.00 154.90
10:38:11 0.00 273.00
10:38:12 0.00 1380.20
10:38:13 0.00 2915.00
10:38:14 0.00 2785.00
10:38:15 0.00 3614.00
10:38:16 0.00 3548.00
10:38:17 0.00 2745.00
10:38:18 0.00 2072.28
10:38:19 0.00 2262.38

Das kann ganz schön Schwanken, je nachdem wie viele Prozesse da aktuell laufen. Aber ausgehend von den 2200 context switches jede Sekunde und 4500 ns pro context switch würde das 9,9ms allein für context switche ergeben. Das System würde also ca. 1% seiner Zeit mit der Prozessverwaltung verbringen. Das ist so gut wie zu vernachlässigen. Steigt aber die Prozessanzahl und die Contextswitches weiter an, um etwa einen Faktor 10, dann wird die Anzahl der Switches interessant.

Weitere Betrachtungen wären nötig, für Systeme mit mehreren CPUs – für eine erste Näherung würde ich einfach die Anzahl der Context Switche durch die Anzahl der vorhandenen CPUs dividieren, da die Prozessorkerne ja gleichzeitig die Switches durchführen können.