Freigeben über


No-Wake Timer

Ab Windows 8.1 können Treiber keine Wake-Timer verwenden, um unnötiges Aufwachen eines Prozessors aus einem Energiesparzustand zu vermeiden. Durch die Beibehaltung des Prozessors in einem Energiesparzustand reduziert ein No-Wake-Timer den Stromverbrauch und erweitert die Zeit, die ein Tablet oder ein anderer mobiler Computer auf einer Akkuladung ausführen kann.

Ein Timer kann nur ablaufen, wenn sich der Prozessor in einem aktiven, laufenden Zustand befindet. Wenn ein Timer seine Ablaufzeit erreicht und sich der Prozessor in einem niedrigem Energiezustand befindet, und der Timer sofort ablaufen muss, muss der Timer den Prozessor reaktivieren. Wenn ein No-Wake-Timer jedoch seine Ablaufzeit erreicht und sich der Prozessor in einem niedrigen Energiemodus befindet, wartet dieser Timer, bis der Prozessor aus einem anderen Grund als durch den Timer reaktiviert wird. Als Option kann ein Treiber eine maximale Verzögerungstoleranz für einen No-Wake-Timer angeben, damit der Timer den Prozessor aufweckt, wenn dieser aus einem anderen Grund nicht innerhalb der maximalen Verzögerungstoleranz nach Ablauf der Timer-Zeit aufgewacht ist.

Ein Treiber kann einen No-Wake-Timer 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 No-Wake-Timer verwenden, um in regelmäßigen Abständen gesammelte Statusinformationen aus einem Speicherpuffer in eine Datei zu leeren. Diese Statusinformationen beschreiben die Verarbeitung der Arbeit, die der Treiber nur ausführt, wenn der Prozessor aktiv ist. Wenn sich der Prozessor in einem Energiesparzustand befindet, werden keine Statusinformationen generiert, und der Prozessor muss nicht aktiviert werden.

Um einen No-Wake-Timer zu erstellen, ruft ein WDM-Treiber die ExAllocateTimer-Routine auf. In diesem Aufruf legt der Treiber das EX_TIMER_NO_WAKE Flag-Bit im Attributes-Parameter fest.

Um den Ablauf eines No-Wake-Timers zu einem bestimmten Fälligkeitszeitpunkt festzulegen, ruft der Treiber die ExSetTimer-Routine auf. In diesem Aufruf kann der Treiber angeben, wie lange der No-Wake-Timer 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 das NoWakeTolerance-Element auf den speziellen Wert EX_TIMER_UNLIMITED_TOLERANCE festlegt, reaktiviert der Timer den Prozessor nie und kann daher nicht ablaufen, bis der Prozessor aus einem anderen Grund reaktiviert wird.

Ein Kernel-Mode Driver Framework(KMDF)-Treiber oder User-Mode Driver Framework (UMDF)-Treiber kann die WdfTimerCreate-Methode aufrufen, um einen No-Wake-Timer zu erstellen. In diesem Aufruf übergibt der Treiber einen Zeiger an eine WDF_TIMER_CONFIG Struktur als Parameter. Um einen No-Wake-Timer zu erstellen, der den Prozessor nie reaktiviert, legt der Treiber das TolerableDelay-Element 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 koalierbaren Zeitgebern

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 Timerunterbrechungen in einen einzelnen Interrupt zusammenzugliedern. Wenn die Ablaufzeiten mehrerer Timer nahe genug sind, dass sich ihre Toleranzfenster überlappen, kann ein einzelner Timerinterrupt im Bereich der Überlappung die Zeitvorgaben aller dieser Timer erfüllen.

Der Hauptvorteil der Zeitgeber-Koaleszierung besteht darin, dass sie die Zeit verlängert, die der Prozessor zwischen den Auslösungen der Zeitgeber in einem Energiesparzustand verweilen kann. Daher verwenden die Treiber Timer-Coalescing und No-Wake-Timer für ähnliche Zwecke.

Allerdings verhalten sich koaleszierbare Zeitgeber anders als aufweckfreie Zeitgeber. Insbesondere gilt die für einen No-Wake-Timer angegebene tolerierbare Verzögerung nur, wenn sich der Prozessor in einem Energiesparzustand befindet, während die für den Ablauf eines koessierbaren Timers angegebene Toleranz unabhängig davon gilt, ob sich der Prozessor in einem Energiesparzustand befindet. Bei einem koaleszierbaren Timer kann ein Treiber die Toleranz der Ablaufzeit erhöhen, um die Wahrscheinlichkeit zu verringern, dass der Timer den Prozessor aufweckt, aber die Erhöhung der Toleranz führt dazu, dass die Genauigkeit des Timers sinkt, wenn der Prozessor aktiv ist. Im Gegensatz dazu wirkt sich die für einen No-Wake-Timer angegebene tolerierbare Verzögerung nicht auf die Genauigkeit des Timers aus, wenn der Prozessor aktiv ist. Für viele Autofahrer könnten No-Wake-Timer eine bessere Möglichkeit sein, den Energieverbrauch zu reduzieren.