Timergenauigkeit

Eine Systemtimerroutine ermöglicht es dem Aufrufer in der Regel, entweder eine absolute oder eine relative Ablaufzeit für einen Timer anzugeben. Siehe z. B. KeWaitForSingleObject, KeSetTimer oder KeDelayExecutionThread. Die Genauigkeit, mit der das Betriebssystem Ablaufzeiten messen kann, wird durch die Granularität der Systemuhr begrenzt.

Die Systemzeit wird bei jedem Tick der Systemuhr aktualisiert und ist nur auf den neuesten Tick genau. Wenn der Aufrufer eine absolute Ablaufzeit angibt, wird der Ablauf des Timers während der Verarbeitung des ersten Systemuhr ticks erkannt, der nach der angegebenen Zeit auftritt. Daher kann der Timer bis zu einer Systemuhrperiode später ablaufen als die angegebene absolute Ablaufzeit. Wenn stattdessen ein Timerintervall oder eine relative Ablaufzeit angegeben wird, kann der Ablauf bis zu einem Zeitraum vor oder einem Zeitraum später als die angegebene Zeit erfolgen, je nachdem, wo genau die Start- und Endzeiten dieses Intervalls zwischen den Ticks der Systemuhr liegen. Unabhängig davon, ob eine absolute oder eine relative Zeit angegeben wird, wird der Ablauf des Timers möglicherweise erst später erkannt, wenn die Interruptverarbeitung für die Systemuhr durch die Interruptverarbeitung für andere Geräte verzögert wird.

Wenn der Aufrufer eine relative Ablaufzeit angibt, fügt die Timerroutine die aktuelle Systemuhrzeit der angegebenen relativen Ablaufzeit hinzu, um die absolute Ablaufzeit zu berechnen, die für den Timer verwendet werden soll. Da die Systemzeit nur auf den neuesten Tick der Systemuhr genau ist, kann die berechnete Ablaufzeit bis zu einem Systemuhrzeitraum früher als die vom Aufrufer erwartete Ablaufzeit sein. Wenn eine angegebene relative Ablaufzeit nahe oder kleiner als der Systemuhrzeitraum ist, läuft der Timer möglicherweise sofort ab, ohne Verzögerung.

Eine mögliche Möglichkeit, kürzere Ablaufzeiten genauer zu unterstützen, besteht darin, die Zeit zwischen Den Ticks der Systemuhr zu verkürzen, aber dies wird wahrscheinlich den Stromverbrauch erhöhen. Darüber hinaus kann die Reduzierung der Systemuhrzeit möglicherweise nicht zuverlässig eine feinere Systemuhrgranularität erzielen, es sei denn, die Unterbrechungsverarbeitung für die anderen Geräte auf der Plattform kann garantiert werden, dass die Verarbeitung von Systemuhrunterbrechungen nicht verzögert wird.

Ab Windows 8 verwendet KeDelayExecutionThread eine präzisere Technik, um die absolute Ablaufzeit aus einer vom Aufrufer angegebenen relativen Ablaufzeit zu berechnen. Um eine genauere Schätzung der aktuellen Systemzeit zu erhalten, verwendet die Routine den Systemleistungsindikator, um die seit dem letzten Systemuhr-Tick verstrichene Zeit zu messen. Als Nächstes fügt die Routine diese genauere Schätzung der Systemzeit der relativen Ablaufzeit hinzu, um die absolute Ablaufzeit zu berechnen. Die von diesem Verfahren berechnete absolute Ablaufzeit ist innerhalb einer Mikrosekunde genau. Infolgedessen läuft der Timer nicht ab, bevor die angegebene relative Ablaufzeit verstrichen ist. Der Timer kann immer noch bis zu einem Systemuhrzeitraum später als die angegebene Zeit ablaufen und kann auch später ablaufen, wenn die Verarbeitung des Systemuhrunterbrechungs durch die Interruptverarbeitung für andere Geräte verzögert wird.

Wenn sich die Systemzeit ändert, bevor ein Timer abläuft, ist ein relativer Timer nicht betroffen, aber das System passt jeden absoluten Timer an. Ein relativer Timer läuft immer nach der angegebenen Anzahl von Zeiteinheiten ab, unabhängig von der absoluten Systemzeit. Ein absoluter Timer läuft zu einer bestimmten Systemzeit ab, sodass eine Änderung der Systemzeit die Wartezeit eines absoluten Timers ändert.