Compartir a través de


Precisión del temporizador

Normalmente, una rutina del temporizador del sistema permite al autor de la llamada especificar un tiempo de expiración absoluto o relativo para un temporizador. Por ejemplo, vea KeWaitForSingleObject, KeSetTimer o KeDelayExecutionThread. La precisión con la que el sistema operativo puede medir los tiempos de expiración está limitado por la granularidad del reloj del sistema.

La hora del sistema se actualiza en cada tic del reloj del sistema y es precisa solo para el tic más reciente. Si el autor de la llamada especifica un tiempo de expiración absoluto, se detecta la expiración del temporizador durante el procesamiento del primer tic del reloj del sistema que se produce después de la hora especificada. Por lo tanto, el temporizador puede expirar tanto como un período de reloj del sistema más tarde que la hora de expiración absoluta especificada. Si en su lugar se especifica un intervalo de temporizador o una hora de expiración relativa, la expiración puede producirse hasta un período anterior o un período posterior a la hora especificada, dependiendo de dónde se encuentran exactamente las horas de inicio y finalización de este intervalo entre los tics del reloj del sistema. Independientemente de si se especifica un tiempo absoluto o relativo, es posible que la expiración del temporizador no se detecte hasta más adelante si el procesamiento de interrupciones para el reloj del sistema se retrasa mediante el procesamiento de interrupciones para otros dispositivos.

Cuando el autor de la llamada especifica una hora de expiración relativa, la rutina del temporizador agrega la hora del reloj del sistema actual a la hora de expiración relativa especificada para calcular la hora de expiración absoluta que se usará para el temporizador. Dado que la hora del sistema es precisa solo para el último tic del reloj del sistema, la hora de expiración calculada puede ser hasta un período de reloj del sistema anterior a la hora de expiración esperada por el autor de la llamada. Si un tiempo de expiración relativo especificado está cerca o menor que el período de reloj del sistema, el temporizador puede expirar inmediatamente, sin retraso.

Una posible manera de admitir con mayor precisión los tiempos de expiración más cortos es reducir el tiempo entre los tics del reloj del sistema, pero es probable que esto aumente el consumo de energía. Además, reducir el período de reloj del sistema podría no lograr de forma confiable una granularidad más fina del reloj del sistema, a menos que se pueda garantizar el procesamiento de interrupciones de interrupción para los demás dispositivos de la plataforma para no retrasar el procesamiento de interrupciones del reloj del sistema.

A partir de Windows 8, KeDelayExecutionThread usa una técnica más precisa para calcular el tiempo de expiración absoluto a partir de una hora de expiración relativa especificada por el autor de la llamada. En primer lugar, para obtener una estimación más precisa de la hora actual del sistema, la rutina usa el contador de rendimiento del sistema para medir el tiempo transcurrido desde el último tic del reloj del sistema. A continuación, la rutina agrega esta estimación más precisa de la hora del sistema a la hora de expiración relativa para calcular la hora de expiración absoluta. El tiempo de expiración absoluto calculado por esta técnica es preciso en un microsegundo. Como resultado, el temporizador no expirará antes de que transcurre el tiempo de expiración relativo especificado. El temporizador todavía puede expirar hasta un período de reloj del sistema más tarde que la hora especificada y puede expirar incluso más tarde si el procesamiento de la interrupción del reloj del sistema se retrasa mediante el procesamiento de interrupciones para otros dispositivos.

Si la hora del sistema cambia antes de que expire un temporizador, un temporizador relativo no se ve afectado, pero el sistema ajusta cada temporizador absoluto. Un temporizador relativo siempre expira una vez transcurrido el número especificado de unidades de tiempo, independientemente de la hora absoluta del sistema. Un temporizador absoluto expira en un momento específico del sistema, por lo que un cambio en el tiempo del sistema cambia la duración de espera de un temporizador absoluto.