No-Wake Timer

Ab Windows 8.1 können Treiber Timer ohne Aktivierung verwenden, um zu vermeiden, dass ein Prozessor unnötig aus einem Energiesparzustand aktiviert wird. Durch die Beibehaltung des Prozessors in einem stromarmen Zustand reduziert ein Timer ohne Aktivierung den Stromverbrauch und verlängert die Zeit, die ein Tablet oder ein anderer mobiler Computer mit einer Akkuladung ausführen kann.

Ein Timer kann nur ablaufen, wenn sich der Prozessor in einem aktiven, ausgeführten Zustand befindet. Wenn ein Timer seine Ablaufzeit erreicht, wenn sich der Prozessor in einem Low-Power-Zustand befindet und der Timer sofort ablaufen muss, muss der Timer den Prozessor reaktivieren. Wenn jedoch ein Timer ohne Aktivierung seine Ablaufzeit erreicht und sich der Prozessor in einem Energiesparzustand befindet, wartet dieser Timer auf den Ablauf, bis der Prozessor aus einem anderen Grund als dem Timer reaktiviert wird. Optional kann ein Treiber eine maximale Verzögerungstoleranz für einen Timer ohne Aktivierung angeben, sodass der Timer den Prozessor reaktiviert, wenn der Prozessor (aus einem anderen Grund) nicht innerhalb der maximalen Verzögerungstoleranz nach der Ablaufzeit des Timers aktiviert wird.

Ein Treiber kann einen Timer ohne Aktivierung verwenden, um nicht kritische Vorgänge zu initiieren, die nur ausgeführt werden müssen, wenn sich der Prozessor in einem aktiven Zustand befindet. Beispielsweise kann ein Treiber einen Timer ohne Aktivierung verwenden, um akkumulierte status Informationen aus einem Speicherpuffer regelmäßig in eine Datei zu leeren. Diese status Informationen beschreiben verarbeitungsvorgänge, die der Treiber nur ausführt, wenn der Prozessor aktiv ist. Wenn sich der Prozessor in einem Low-Power-Zustand befindet, werden keine status Informationen generiert, und es ist nicht erforderlich, den Prozessor zu reaktivieren.

Um einen Timer ohne Aktivierung zu erstellen, ruft ein WDM-Treiber die ExAllocateTimer-Routine auf. In diesem Aufruf legt der Treiber das EX_TIMER_NO_WAKE Flagbit im Attributes-Parameter fest.

Um festzulegen, dass ein Timer ohne Aktivierung zu einem bestimmten Zeitpunkt abläuft, ruft der Treiber die ExSetTimer-Routine auf. In diesem Aufruf kann der Treiber angeben, wie lange der Timer ohne Aktivierung warten soll, nachdem er seine Ablaufzeit erreicht hat, bevor der Timer den Prozessor reaktiviert. Der Treiber schreibt diese tolerierbare Verzögerungszeit in das NoWakeTolerance-Element in der EXT_SET_PARAMETERS-Struktur , die der Treiber als Eingabeparameter an die ExSetTimer-Routine übergibt. Wenn der Treiber den NoWakeTolerance-Member auf den speziellen Wert EX_TIMER_UNLIMITED_TOLERANCE festlegt, wird der Timer nie den Prozessor reaktiviert und kann daher erst ablaufen, wenn der Prozessor aus einem anderen Grund reaktiviert wird.

Ein Kernel-Mode Driver Framework(KMDF)-Treiber oder umdf-Treiber (User-Mode Driver Framework) kann die WdfTimerCreate-Methode aufrufen, um einen Timer ohne Aktivierung zu erstellen. In diesem Aufruf übergibt der Treiber einen Zeiger auf eine WDF_TIMER_CONFIG-Struktur als Parameter. Um einen Timer ohne Aktivierung zu erstellen, der den Prozessor nie reaktiviert, legt der Treiber den TolerableDelay-Member dieser Struktur auf die TolerableDelayUnlimited-Konstante fest. Diese Konstante wird ab Windows 8.1 und KMDF Version 1.13 oder UMDF 2.0 unterstützt.

Vergleich mit zusammensetzbaren Timern

Die KeSetCoalescableTimer-Routine wurde in Windows 7 eingeführt. Mit dieser Routine kann ein Treiber angeben, wie viel Toleranz in der Ablaufzeit eines Timers zulässig ist. Häufig kann das Betriebssystem diese Informationen verwenden, um zwei oder mehr Timer-Interrupts zu einem einzelnen Interrupt zusammenzugliedern. Wenn die Ablaufzeiten mehrerer Zeitgeber so nahe beieinander liegen, dass sich ihre Toleranzfenster überlappen, kann ein einzelner Timer-Interrupt im Bereich der Überlappung die Zeitsteuerungsanforderungen aller dieser Zeitgeber erfüllen.

Der Hauptvorteil der Timer-Zusammenführung besteht darin, dass es die Zeit verlängert, in der der Prozessor zwischen dem Ablauf des Timers in einem Energiesparzustand bleiben kann. Daher verwenden Treiber Timer-Koalescing- und No-Wake-Timer für ähnliche Zwecke.

Koaleszierbare Timer verhalten sich jedoch anders als Timer ohne Aktivierung. Insbesondere gilt die tolerierbare Verzögerung, die für einen Timer ohne Aktivierung angegeben wird, nur, wenn sich der Prozessor in einem Energiesparzustand befindet, während die für den Ablauf eines zusammensetzbaren Timers angegebene Toleranz unabhängig davon gilt, ob sich der Prozessor in einem Energiesparzustand befindet. Bei einem zusammensetzbaren Timer kann ein Treiber die Toleranz in der Ablaufzeit erhöhen, um die Wahrscheinlichkeit zu verringern, dass der Timer den Prozessor reaktiviert, aber das Erhöhen der Toleranz hat den Nebeneffekt, dass die Genauigkeit des Timers verringert wird, wenn der Prozessor aktiv ist. Im Gegensatz dazu wirkt sich die für einen Timer ohne Aktivierung angegebene tolerierbare Verzögerung nicht auf die Genauigkeit des Timers aus, wenn der Prozessor aktiv ist. Für viele Treiber sind Timer ohne Aktivierung möglicherweise eine bessere Möglichkeit, den Stromverbrauch zu reduzieren.