cpu
Compiler Zeit Openssl 1.1.1 Pre7
Auf Quadcore Intel(R) Core(TM) i5-3427U CPU @ 1.80GHz mit Virenscanner
./config no-async && time make real 1h 36m 37s user 5m 9.02s sys 1h 22m 34s
Auf Quadcore Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz mit Windows Defender
./config no-async && time make real 11m 16.66s user 3m 13.19s sys 4m 27.34s
So gefühlt, rechnet der i5 also 5 Minuten statt 3 Minuten. Aber die System-Time scheint vom Virenscanner zu kommen.
Context Switching
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 Threads, Tasksoder 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.
A Crash Course in Modern Hardware
In dieser Präsentation (passt übrigens zur Vorlesung in Rechnerarchitektur) von der JVM Languages Summit 2009, erzählt Cliff Click über die Von Neumann Architektur, CISC & RISC, den Aufstieg von Multicore, Instruction-Level Parallelism (ILP), Pipelining, Out-of-order Dispatch, Static & Dynamic ILP, Performance Einflüsse von Cache Misses, Memory Performance, Memory & CPU Caching, Beispiele für Speicher / CPU Cache Wechselwirkungen, and Tipps für verbesserte Performance.
Das ganze findet sich in Englischer Sprache hier:
http://www.infoq.com/presentations/click-crash-course-modern-hardware