Dies hängt stark von der Art der Anwendung ab, die Sie ausführen. Wenn Sie Anwendungen haben, die sehr auslöserfreundliche WRT-Systemaufrufe ausführen, ist mit einem hohen Grad an Kontextwechsel zu rechnen. Wenn die meisten Ihrer Anwendungen im Leerlauf ausgeführt werden und nur dann aktiviert werden, wenn an einem Socket etwas passiert, ist mit niedrigen Kontextwechselraten zu rechnen.
Systemaufrufe
Systemaufrufe verursachen von Natur aus Kontextwechsel. Wenn ein Prozess einen Systemaufruf ausführt, weist er den Kernel an, den aktuellen Zeitpunkt und den aktuellen Arbeitsspeicher zu übernehmen, um die Aufgaben zu erledigen, für die der Prozess keine Berechtigung hat, und an dieselbe Stelle zurückzukehren, wenn er fertig ist.
Wenn wir uns die Definition des write (2) -Syscalls von Linux ansehen, wird dies sehr deutlich:
NAME
write - Schreibt in einen Dateideskriptor
ZUSAMMENFASSUNG
#umfassen
ssize_t write (int fd, const void * buf, size_t count);
BESCHREIBUNG
write () schreibt bis zur Anzahl der Bytes aus dem Puffer, auf den buf zeigt, in die Datei
bezeichnet durch den Dateideskriptor fd. [..]
RÜCKGABEWERT
Bei Erfolg wird die Anzahl der geschriebenen Bytes zurückgegeben (Null bedeutet
es wurde nichts geschrieben). Im Fehlerfall wird -1 zurückgegeben und errno gesetzt
passend.
[..]
Dies weist den Kernel grundsätzlich an, die Operation vom Prozess zu übernehmen, auf count
Bytes aufzusteigen , beginnend mit der Speicheradresse, auf die von gezeigt wird *buf
, um den Deskriptor fd
des aktuellen Prozesses abzulegen, und dann zum Prozess zurückzukehren und ihm mitzuteilen, wie er gelaufen ist.
Ein gutes Beispiel dafür ist der dedizierte Spieleserver für Valve Source-basierte Spiele, hlds . http://nopaste.narf.at/f1b22dbc9 zeigt einen Sekundenwert von Systemaufrufen, die von einer einzelnen Instanz eines Spielservers ausgeführt wurden, auf dem keine Spieler installiert waren. Dieser Vorgang benötigt auf einem Xeon X3220 (2,4 GHz) ca. 3% CPU-Zeit, um Ihnen ein Gefühl dafür zu vermitteln, wie teuer dies ist.
Multitasking
Eine weitere Ursache für das Wechseln des Kontexts können Prozesse sein, die keine Systemaufrufe ausführen, jedoch von einer bestimmten CPU entfernt werden müssen, um Platz für andere Prozesse zu schaffen.
Ein guter Weg, dies zu visualisieren, ist cpuburn . cpuburn führt selbst keine Systemaufrufe durch, sondern iteriert nur über den eigenen Speicher, sodass keine Kontextumschaltung erfolgen sollte.
Nehmen Sie einen inaktiven Rechner, starten Sie vmstat und führen Sie dann für jeden CPU-Kern des Systems einen burnMMX (oder einen anderen Test aus dem Paket cpuburn) aus. Sie sollten bis dahin die volle Systemauslastung haben, aber kaum eine erhöhte Kontextumschaltung. Versuchen Sie dann, ein paar weitere Prozesse zu starten. Sie werden feststellen, dass die Kontextwechselrate zunimmt, wenn die Prozesse um CPU-Kerne konkurrieren. Der Umfang der Umschaltung hängt vom Verhältnis von Prozessen zu Kern und von der Multitasking-Auflösung Ihres Kernels ab.
Weitere Lektüre
linfo.org hat einen guten Überblick darüber, was Kontextwechsel und Systemaufrufe sind. Wikipedia bietet allgemeine Informationen und eine schöne Linksammlung zu Systemaufrufen.