temporizadores de No-Wake
A partir de Windows 8.1, los controladores pueden usar temporizadores sin reactivación para evitar despertar innecesariamente un procesador de un estado de bajo consumo. Al mantener el procesador en un estado de bajo consumo de energía, un temporizador sin reactivación reduce el consumo de energía y extiende el tiempo que una tableta u otro equipo móvil puede funcionar con una carga de batería.
Un temporizador solo puede expirar cuando el procesador está en un estado activo y en ejecución. Si un temporizador alcanza su hora de expiración cuando el procesador está en un estado de bajo consumo y el temporizador debe expirar inmediatamente, el temporizador debe reactivar el procesador. Sin embargo, cuando un temporizador sin reactivación alcanza su hora de expiración y el procesador está en un estado de bajo consumo, este temporizador espera a que expire hasta que el procesador se active por algún motivo distinto del temporizador. Como opción, un controlador puede especificar una tolerancia de retraso máxima para un temporizador sin reactivación para que si el procesador no se activa (por algún otro motivo) dentro de la tolerancia de retraso máxima después del tiempo de expiración del temporizador, el temporizador reactiva el procesador.
Un controlador puede usar un temporizador sin reactivación para iniciar operaciones no críticas que solo se deben realizar cuando el procesador está en un estado activo. Por ejemplo, un controlador podría usar un temporizador sin reactivación para vaciar periódicamente la información de estado acumulada de un búfer de memoria en un archivo. Esta información de estado describe el trabajo de procesamiento que el controlador realiza solo cuando el procesador está activo. Cuando el procesador está en un estado de bajo consumo, no se genera ninguna información de estado y no es necesario reactivar el procesador.
Para crear un temporizador sin reactivación, un controlador WDM llama a la rutina ExAllocateTimer . En esta llamada, el controlador establece el bit de marca EX_TIMER_NO_WAKE en el parámetro Attributes .
Para establecer un temporizador sin reactivación para que expire en algún momento, el controlador llama a la rutina ExSetTimer . En esta llamada, el controlador puede especificar cuánto tiempo debe esperar el temporizador sin reactivación después de que alcance su tiempo de expiración antes de que el temporizador active el procesador. El controlador escribe este tiempo de retraso tolerable en el miembro NoWakeTolerance de la estructura EXT_SET_PARAMETERS que el controlador pasa como parámetro de entrada a la rutina ExSetTimer . Si el controlador establece el miembro NoWakeTolerance en el valor especial EX_TIMER_UNLIMITED_TOLERANCE, el temporizador nunca reactiva el procesador y, por lo tanto, no puede expirar hasta que el procesador se active por algún otro motivo.
Un controlador de Kernel-Mode Driver Framework (KMDF) o User-Mode Driver Framework (UMDF) puede llamar al método WdfTimerCreate para crear un temporizador sin reactivación. En esta llamada, el controlador pasa un puntero a una estructura WDF_TIMER_CONFIG como parámetro. Para crear un temporizador sin reactivación que nunca reactiva el procesador, el controlador establece el miembro TolerableDelay de esta estructura en la constante TolerableDelayUnlimited . Esta constante se admite a partir de Windows 8.1 y KMDF versión 1.13 o UMDF 2.0.
Comparación con temporizadores fusionables
La rutina KeSetCoalescableTimer se introdujo en Windows 7. Esta rutina permite a un controlador especificar la tolerancia que se debe permitir en el tiempo de expiración de un temporizador. Con frecuencia, el sistema operativo puede usar esta información para fusionar dos o más interrupciones del temporizador en una sola interrupción. Si los tiempos de expiración de varios temporizadores están lo suficientemente cerca entre sí de que sus ventanas de tolerancia se superponen, una única interrupción del temporizador en la región de superposición puede satisfacer los requisitos de tiempo de todos estos temporizadores.
La principal ventaja del temporizador es que extiende el tiempo que el procesador puede permanecer en un estado de baja potencia entre expiraciones del temporizador. Por lo tanto, los controladores usan temporizadores de fusión y temporizadores sin reactivación con fines similares.
Sin embargo, los temporizadores fusionables se comportan de forma diferente a los temporizadores sin reactivación. En concreto, el retraso tolerable especificado para un temporizador sin reactivación solo se aplica cuando el procesador está en un estado de baja potencia, mientras que la tolerancia especificada para la expiración de un temporizador fusionable se aplica independientemente de si el procesador está en estado de baja potencia. En el caso de un temporizador fusionable, un controlador puede aumentar la cantidad de tolerancia en el tiempo de expiración para reducir la probabilidad de que el temporizador active el procesador, pero aumentar la tolerancia tiene el efecto secundario de disminuir la precisión del temporizador cuando el procesador está activo. En cambio, el retraso tolerable especificado para un temporizador sin reactivación no afecta a la precisión del temporizador cuando el procesador está activo. Para muchos controladores, los temporizadores sin reactivación pueden ser una mejor manera de reducir el consumo de energía.