temporizadores de High-Resolution
A partir de Windows 8.1, los controladores pueden usar las rutinas exXxxTimer para administrar temporizadores de alta resolución. La precisión de un temporizador de alta resolución solo está limitada por la resolución máxima admitida del reloj del sistema. En cambio, los temporizadores limitados a la resolución predeterminada del reloj del sistema son significativamente menos precisos.
Sin embargo, los temporizadores de alta resolución requieren interrupciones del reloj del sistema para, al menos, temporalmente, se producen a una velocidad más alta, lo que tiende a aumentar el consumo de energía. Por lo tanto, los controladores deben usar temporizadores de alta resolución solo cuando la precisión del temporizador es esencial y usar temporizadores de resolución predeterminados en todos los demás casos.
Para crear un temporizador de alta resolución, un controlador WDM llama a la rutina ExAllocateTimer y establece la marca EX_TIMER_HIGH_RESOLUTION en el parámetro Attributes . Cuando el controlador llama a la rutina ExSetTimer para establecer el temporizador de alta resolución, el sistema operativo aumenta la resolución del reloj del sistema, según sea necesario, para que las horas en las que el temporizador expire más precisamente se correspondan con los tiempos de expiración nominal especificados en los parámetros DueTime y Period .
Un controlador de Kernel-Mode Driver Framework (KMDF) puede llamar al método WdfTimerCreate para crear un temporizador de alta resolución. En esta llamada, el controlador pasa un puntero a una estructura de WDF_TIMER_CONFIG como parámetro. Para crear un temporizador de alta resolución, el controlador establece el miembro UseHighResolutionTimer de esta estructura en TRUE. Este miembro forma parte de la estructura a partir de Windows 8.1 y KMDF versión 1.13.
Control de la precisión del temporizador
Por ejemplo, para Windows que se ejecuta en un procesador x86, el intervalo predeterminado entre los tics del reloj del sistema suele ser de aproximadamente 15 milisegundos y el intervalo mínimo entre los tics del reloj del sistema es de aproximadamente 1 milisegundos. Por lo tanto, la hora de expiración de un temporizador de resolución predeterminado (que ExAllocateTimer crea si no se establece la marca de EX_TIMER_HIGH_RESOLUTION) solo se puede controlar en unos 15 milisegundos, pero el tiempo de expiración de un temporizador de alta resolución se puede controlar en un milisegundo.
Si un controlador especifica un tiempo de expiración relativo para un temporizador de resolución predeterminado, el temporizador puede expirar hasta aproximadamente 15 milisegundos anteriores o posteriores a la hora de expiración especificada. Si un controlador especifica un tiempo de expiración relativo para un temporizador de alta resolución, el temporizador puede expirar tan tarde como aproximadamente un milisegundo después de la hora de expiración especificada, pero nunca expira pronto. Para obtener más información sobre la relación entre la resolución del reloj del sistema y la precisión del temporizador, vea Precisión del temporizador.
Si no se establecen temporizadores de alta resolución, el sistema operativo normalmente ejecuta el reloj del sistema a su velocidad predeterminada. Sin embargo, si se establecen uno o varios temporizadores de alta resolución, es posible que el sistema operativo tenga que ejecutar el reloj del sistema a su velocidad máxima durante al menos una parte del tiempo antes de que expiren estos temporizadores.
Para evitar un aumento innecesario del consumo de energía, el sistema operativo ejecuta el reloj del sistema a su velocidad máxima solo cuando sea necesario para satisfacer los requisitos de tiempo de los temporizadores de alta resolución. Por ejemplo, si un temporizador de alta resolución es periódico y su período abarca varios tics de reloj del sistema predeterminados, el sistema operativo podría ejecutar el reloj del sistema a su velocidad máxima solo en la parte del período de temporizador que precede inmediatamente a cada expiración. Durante el resto del período del temporizador, el reloj del sistema se ejecuta a su velocidad predeterminada.
Para evitar un consumo excesivo de energía, los controladores deben evitar establecer el período de un temporizador de alta resolución de larga duración en un valor menor que el intervalo predeterminado entre los tics del reloj del sistema. De lo contrario, el sistema operativo se ve obligado a ejecutar continuamente el reloj del sistema a su velocidad máxima.
A partir de Windows 8, un controlador puede llamar a la rutina ExQueryTimerResolution para obtener el intervalo de resoluciones de temporizador compatibles con el reloj del sistema.
Comparación con ExSetTimerResolution
A partir de Windows 2000, un controlador puede llamar a la rutina ExSetTimerResolution para cambiar el intervalo de tiempo entre interrupciones sucesivas del reloj del sistema. Por ejemplo, un controlador puede llamar a esta rutina para cambiar el reloj del sistema de su velocidad predeterminada a su velocidad máxima para mejorar la precisión del temporizador. Sin embargo, el uso de ExSetTimerResolution tiene varias desventajas en comparación con el uso de temporizadores de alta resolución creados por ExAllocateTimer.
En primer lugar, después de llamar a ExSetTimerResolution para aumentar temporalmente la velocidad de reloj del sistema, un controlador debe llamar a ExSetTimerResolution una segunda vez para restaurar el reloj del sistema a su velocidad predeterminada. De lo contrario, el temporizador del reloj del sistema genera continuamente interrupciones a la velocidad máxima, lo que podría provocar un consumo excesivo de energía.
En segundo lugar, un controlador que usa la rutina ExSetTimerResolution no puede optimizar su uso temporal de velocidades de reloj del sistema más altas de forma eficaz, ya que el sistema operativo hace para temporizadores de alta resolución. Por lo tanto, el reloj del sistema pasa más tiempo ejecutándose a la velocidad máxima de lo estrictamente necesario.
En tercer lugar, si varios controladores usan simultáneamente ExSetTimerResolution para mejorar la precisión del temporizador, el reloj del sistema podría ejecutarse a su velocidad máxima durante largos períodos. En cambio, el sistema operativo coordina globalmente el funcionamiento de varios temporizadores de alta resolución para que el reloj del sistema se ejecute a la velocidad máxima solo cuando sea necesario para cumplir los requisitos de tiempo de estos temporizadores.
Por último, el uso de ExSetTimerResolution es intrínsecamente menos preciso que usar un temporizador de alta resolución. Después de que un controlador llame a ExSetTimerResolution para aumentar el reloj del sistema a su velocidad máxima, que suele ser aproximadamente un tic por milisegundos, el controlador podría llamar a una rutina como KeSetTimerEx para establecer el temporizador. Si, en esta llamada, el controlador especifica una hora de expiración relativa, el temporizador puede expirar hasta aproximadamente un milisegundo anterior o posterior a la hora de expiración especificada. Sin embargo, si se especifica un tiempo de expiración relativo para un temporizador de alta resolución, el temporizador puede expirar hasta aproximadamente milisegundos más tarde que la hora de expiración especificada, pero nunca expira pronto.