Freigeben über


Hochauflösende Zeitgeber

Ab Windows 8.1 können Treiber die ExXxxTimer-Routinen verwenden, um hochauflösende Zeitgeber zu verwalten. Die Genauigkeit eines hochauflösenden Zeitgebers ist nur durch die maximal unterstützte Auflösung der Systemuhr begrenzt. Im Gegensatz dazu sind Zeitgeber, die auf die Standardmäßige Systemuhrauflösung beschränkt sind, deutlich weniger genau.

Allerdings erfordern hochauflösende Timer, dass Systemuhrunterbrechungen zumindest vorübergehend mit einer höheren Frequenz auftreten, was in der Regel den Stromverbrauch erhöht. Daher sollten Treiber hochauflösende Zeitgeber nur dann verwenden, wenn die Zeitgebergenauigkeit unerlässlich ist, und in allen anderen Fällen Standardauflösungstimer verwenden.

Um einen hochauflösenden Timer zu erstellen, ruft ein WDM-Treiber die ExAllocateTimer-Routine auf und legt das EX_TIMER_HIGH_RESOLUTION Flag im Attributes-Parameter fest. Wenn der Treiber die ExSetTimer-Routine aufruft, um den hochauflösenden Timer festzulegen, erhöht das Betriebssystem die Auflösung der Systemuhr nach Bedarf, sodass die Zeiten, zu denen der Timer abläuft, genauer den nominalen Ablaufzeiten entsprechen, die in den Parametern DueTime und Period angegeben sind.

Ein Kernel-Mode Driver Framework (KMDF)-Treiber kann die WdfTimerCreate-Methode aufrufen, um einen hochauflösenden Timer zu erstellen. In diesem Aufruf übergibt der Treiber einen Zeiger an eine WDF_TIMER_CONFIG Struktur als Parameter. Um einen hochauflösenden Timer zu erstellen, legt der Treiber das UseHighResolutionTimer-Element dieser Struktur auf TRUE fest. Dieser Bestandteil ist Teil der Struktur, beginnend mit Windows 8.1 und KMDF Version 1.13.

Steuerung der Timer-Genauigkeit

Für Windows, das auf einem x86-Prozessor ausgeführt wird, beträgt das Standardintervall zwischen Systemuhr-Ticks in der Regel etwa 15 Millisekunden, und das Mindestintervall zwischen Systemuhr-Ticks beträgt etwa 1 Millisekunden. Daher kann die Ablaufzeit eines Standardauflösungszeitgebers (der von ExAllocateTimer erstellt wird, wenn das EX_TIMER_HIGH_RESOLUTION Flag nicht festgelegt ist) nur auf etwa 15 Millisekunden gesteuert werden, aber die Ablaufzeit eines hochauflösenden Timers kann innerhalb einer Millisekunden gesteuert werden.

Wenn ein Treiber eine relative Ablaufzeit für einen Standardauflösungstimer angibt, kann der Timer bis zu 15 Millisekunden früher oder später als die angegebene Ablaufzeit ablaufen. Wenn ein Treiber eine relative Ablaufzeit für einen hochauflösenden Timer angibt, kann der Timer so spät ablaufen wie etwa eine Millisekunden nach der angegebenen Ablaufzeit, läuft aber nie früh ab. Weitere Informationen zur Beziehung zwischen Systemuhrauflösung und Zeitgebergenauigkeit finden Sie unter Timer Accuracy.

Wenn keine hochauflösenden Timer festgelegt sind, führt das Betriebssystem normalerweise die Systemuhr mit seiner Standardrate aus. Wenn jedoch ein oder mehrere Zeitgeber mit hoher Auflösung festgelegt sind, muss das Betriebssystem möglicherweise die Systemuhr auf ihre maximale Geschwindigkeit stellen, zumindest für einen Teil der Zeit, bevor diese Zeitgeber ablaufen.

Um unnötige Erhöhung des Stromverbrauchs zu vermeiden, führt das Betriebssystem die Systemuhr nur dann mit seiner maximalen Rate aus, wenn dies erforderlich ist, um die Zeitlichkeit der Zeitgeber mit hoher Auflösung zu erfüllen. Wenn ein Zeitgeber mit hoher Auflösung z. B. periodisch ist und sich über mehrere Standard-Systemuhr-Ticks erstreckt, kann das Betriebssystem die Systemuhr nur während des Teils der Periode des Zeitgebers ausführen, der unmittelbar vor jedem Ablauf liegt. Für den Zeitraum des Timers läuft die Systemuhr mit ihrer Standardrate.

Um übermäßigen Stromverbrauch zu verhindern, sollten Driver vermeiden, den Zeitraum eines hochauflösenden, langsam laufenden Zeitgebers auf einen Wert zu setzen, der kleiner als das Standardintervall zwischen den Systemuhr-Ticks ist. Andernfalls wird das Betriebssystem gezwungen, die Systemuhr mit ihrer maximalen Geschwindigkeit kontinuierlich laufen zu lassen.

Ab Windows 8 kann ein Treiber die ExQueryTimerResolution-Routine aufrufen, um den Bereich der Zeitgeberauflösungen abzurufen, die von der Systemuhr unterstützt werden.

Vergleich mit ExSetTimerResolution

Ein Treiber kann die ExSetTimerResolution-Routine aufrufen, um das Zeitintervall zwischen aufeinander folgenden Systemuhrunterbrechungen zu ändern. Beispielsweise kann ein Treiber diese Routine aufrufen, um die Systemuhr von der Standardrate in die maximale Rate zu ändern, um die Zeitgebergenauigkeit zu verbessern. Die Verwendung von ExSetTimerResolution hat jedoch mehrere Nachteile gegenüber der Verwendung von hochauflösenden Zeitgebern, die von ExAllocateTimer erstellt wurden.

Erstens muss ein Treiber nach dem Aufruf von ExSetTimerResolution , um die Systemuhrrate vorübergehend zu erhöhen, exSetTimerResolution ein zweites Mal aufrufen, um die Systemuhr auf seine Standardrate wiederherzustellen. Andernfalls erzeugt der Systemuhrzeitgeber kontinuierlich Unterbrechungen mit der maximalen Rate, was zu einem übermäßigen Stromverbrauch führen kann.

Zweitens kann ein Treiber, der die ExSetTimerResolution-Routine verwendet, seine temporäre Verwendung höherer Systemuhrraten nicht so effektiv optimieren wie das Betriebssystem für hochauflösende Timer. Somit läuft die Systemuhr länger mit der maximalen Geschwindigkeit als unbedingt nötig.

Drittens, wenn mehrere Treiber gleichzeitig ExSetTimerResolution verwenden, um die Zeitgebergenauigkeit zu verbessern, kann die Systemuhr für lange Zeiträume mit der maximalen Rate ausgeführt werden. Im Gegensatz dazu koordiniert das Betriebssystem global den Betrieb mehrerer hochauflösender Timer so, dass die Systemuhr nur auf Höchstgeschwindigkeit läuft, wenn dies erforderlich ist, um die Zeitvorgaben dieser Timer zu erfüllen.

Schließlich ist die Verwendung von ExSetTimerResolution inhärent weniger genau als die Verwendung eines hochauflösenden Timers. Nachdem ein Treiber ExSetTimerResolution aufgerufen hat, um die Systemuhr auf seine maximale Rate zu erhöhen, was in der Regel etwa eine Tick pro Millisekunden ist, ruft der Treiber möglicherweise eine Routine wie KeSetTimerEx auf, um den Timer festzulegen. Wenn der Treiber in diesem Aufruf eine relative Ablaufzeit angibt, kann der Timer bis zu einer Millisekunde früher oder später als die angegebene Ablaufzeit ablaufen. Wenn jedoch eine relative Ablaufzeit für einen hochauflösenden Timer angegeben ist, kann der Timer bis zu etwa einer Millisekunde später als die angegebene Ablaufzeit ablaufen, jedoch niemals früher.