Condividi tramite


timer No-Wake

A partire da Windows 8.1, i driver possono usare timer senza riattivazione per evitare inutilmente di svegliare un processore da uno stato a basso consumo. Mantenendo il processore in uno stato a basso consumo, un timer senza 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 uno stato a basso consumo e il timer deve scadere immediatamente, il timer deve riattivare il processore. Tuttavia, quando un timer di non-riattivazione raggiunge il suo tempo di scadenza e il processore è in uno stato a basso consumo, questo timer attende di scadere fino a quando il processore non si riattiva 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 senza riattivazione per avviare operazioni non critiche che devono essere eseguite solo quando il processore si trova in uno stato attivo. Ad esempio, un driver potrebbe usare un timer senza riattivazione per scaricare periodicamente le informazioni sullo stato accumulato 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 viene generata alcuna informazione 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 senza riattivazione per farlo scadere a un orario prestabilito, il driver chiama la routine ExSetTimer. In questa chiamata, il driver può specificare quanto tempo il timer non attivo deve attendere dopo la sua scadenza prima che il timer riattivi 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 senza riattivazione. In questa chiamata, il driver passa come parametro un puntatore a una struttura WDF_TIMER_CONFIG. Per creare un timer senza risveglio che non riattiva mai il processore, il driver imposta il membro TolerableDelay di questa struttura alla costante TolerableDelayUnlimited. Questa costante è supportata a partire da Windows 8.1 e KMDF versione 1.13 o UMDF 2.0.

Confronto con timer coalescibili

La routine KeSetCoalescableTimer è stata introdotta in Windows 7. Questa routine consente a un driver di specificare la tolleranza consentita nell'ora di scadenza di un timer. Spesso, il sistema operativo può usare queste informazioni per fondere due o più interruzioni del timer in un singolo interrupt. Se i tempi di scadenza di più timer sono abbastanza vicini tra loro da far sì che le finestre di tolleranza si sovrappongano, un'unica interruzione del timer nella zona di sovrapposizione può soddisfare le esigenze 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 raggruppamento e timer senza risveglio per scopi simili.

Tuttavia, i timer coalescebili si comportano in modo diverso rispetto ai timer senza risveglio. In particolare, il ritardo tollerabile specificato per un timer no-wake si applica solo quando il processore si trova in uno stato a basso consumo, mentre la tolleranza specificata per la scadenza di un timer coalescibile si applica indipendentemente dal fatto che il processore sia in uno stato a basso consumo. Per un timer coalescable, un driver può aumentare la quantità di 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 senza riattivazione non influisce sull'accuratezza del timer quando il processore è attivo. Per molti driver, i timer senza riattivazione potrebbero essere un modo migliore per ridurre il consumo di energia.