timer No-Wake
A partire da Windows 8.1, i driver possono usare timer senza riattivazione per evitare di svegliare inutilmente un processore da uno stato a basso consumo. Mantenendo il processore in uno stato a basso consumo, un timer di riattivazione riduce il consumo di energia e estende il tempo in cui un tablet o un altro computer mobile può essere eseguito su una carica a batteria.
Un timer può scadere solo quando il processore si trova in uno stato attivo e in esecuzione. Se un timer raggiunge la scadenza quando il processore è in stato a basso consumo e il timer deve scadere immediatamente, il timer deve riattivare il processore. Tuttavia, quando un timer di riattivazione non raggiunge la scadenza e il processore è in uno stato a basso consumo, questo timer attende la scadenza fino alla riattivazione del processore per qualche motivo diverso dal timer. Come opzione, un driver può specificare una tolleranza massima di ritardo per un timer senza riattivazione in modo che se il processore non si riattiva (per qualche altro motivo) entro la tolleranza massima di ritardo dopo la scadenza del timer, il timer riattiva il processore.
Un driver può usare un timer di riattivazione per avviare operazioni non critiche che devono essere eseguite solo quando il processore è in uno stato attivo. Ad esempio, un driver potrebbe usare un timer senza riattivazione per scaricare periodicamente le informazioni sullo stato accumulate da un buffer di memoria a un file. Queste informazioni sullo stato descrivono il lavoro di elaborazione eseguito dal driver solo quando il processore è attivo. Quando il processore è in stato a basso consumo, non vengono generate informazioni sullo stato e non è necessario riattivare il processore.
Per creare un timer senza riattivazione, un driver WDM chiama la routine ExAllocateTimer . In questa chiamata, il driver imposta il bit del flag EX_TIMER_NO_WAKE nel parametro Attributes .
Per impostare un timer di riattivazione senza scadenza, il driver chiama la routine ExSetTimer . In questa chiamata, il driver può specificare per quanto tempo il timer di riattivazione deve attendere dopo che raggiunge la scadenza prima che il timer riattiva il processore. Il driver scrive questo tempo di ritardo tollerabile nel membro NoWakeTolerance nella struttura EXT_SET_PARAMETERS che il driver passa come parametro di input alla routine ExSetTimer . Se il driver imposta il membro NoWakeTolerance sul valore speciale EX_TIMER_UNLIMITED_TOLERANCE, il timer non riattiva mai il processore e, pertanto, non può scadere fino alla riattivazione del processore per qualche altro motivo.
Un driver Kernel-Mode Driver Framework (KMDF) o User-Mode Driver Framework (UMDF) può chiamare il metodo WdfTimerCreate per creare un timer di riattivazione. In questa chiamata, il driver passa un puntatore a una struttura WDF_TIMER_CONFIG come parametro. Per creare un timer di riattivazione che non riattiva mai il processore, il driver imposta il membro TolerableDelay di questa struttura sulla costante TolerableDelayUnlimited . Questa costante è supportata a partire da Windows 8.1 e KMDF versione 1.13 o UMDF 2.0.
Confronto con timer coalescable
La routine KeSetCoalescableTimer è stata introdotta in Windows 7. Questa routine consente a un driver di specificare la tolleranza da consentire nell'ora di scadenza di un timer. Spesso, il sistema operativo può usare queste informazioni per unire due o più interrupt timer in un singolo interrupt. Se le scadenze di più timer sono sufficientemente vicine tra loro che si sovrappongono alle finestre di tolleranza, un singolo interrupt timer nell'area di sovrapposizione può soddisfare i requisiti di temporizzazione di tutti questi timer.
Il vantaggio principale dell'unione del timer è che estende il tempo in cui il processore può rimanere in uno stato a basso consumo tra le scadenze del timer. Pertanto, i driver usano timer di unione e timer di riattivazione per scopi simili.
Tuttavia, i timer coalescebili si comportano in modo diverso dai timer di riattivazione. In particolare, il ritardo tollerabile specificato per un timer di riattivazione non si applica solo quando il processore è in uno stato a basso consumo, mentre la tolleranza specificata per la scadenza di un timer coalescabile si applica indipendentemente dal fatto che il processore sia in uno stato a basso consumo. Per un timer coalescable, un driver può aumentare la tolleranza nel tempo di scadenza per ridurre la probabilità che il timer riattiva il processore, ma aumentando la tolleranza ha l'effetto collaterale di ridurre l'accuratezza del timer quando il processore è attivo. Al contrario, il ritardo tollerabile specificato per un timer di riattivazione non influisce sull'accuratezza del timer quando il processore è attivo. Per molti driver, i timer di riattivazione potrebbero essere un modo migliore per ridurre il consumo di energia.