Precisão do temporizador

Uma rotina de temporizador do sistema normalmente permite que o chamador especifique um tempo de expiração absoluto ou relativo para um temporizador. Por exemplo, consulte KeWaitForSingleObject, KeSetTimer ou KeDelayExecutionThread. A precisão com que o sistema operacional pode medir os tempos de expiração é limitada pela granularidade do relógio do sistema.

A hora do sistema é atualizada em cada tique do relógio do sistema e é precisa apenas para o tique mais recente. Se o chamador especificar um tempo de expiração absoluto, a expiração do temporizador será detectada durante o processamento do primeiro tique do relógio do sistema que ocorre após o horário especificado. Assim, o temporizador pode expirar até um período de relógio do sistema posterior ao tempo de expiração absoluto especificado. Se um intervalo de temporizador ou tempo de expiração relativo for especificado, a expiração poderá ocorrer até um período anterior ou um período posterior à hora especificada, dependendo de onde exatamente as horas de início e término desse intervalo se enquadram entre os tiques do relógio do sistema. Independentemente de um tempo absoluto ou relativo ser especificado, a expiração do temporizador pode não ser detectada até mesmo mais tarde se o processamento de interrupção para o relógio do sistema for atrasado pelo processamento de interrupção para outros dispositivos.

Quando o chamador especifica um tempo de expiração relativo, a rotina do temporizador adiciona o tempo de relógio do sistema atual ao tempo de expiração relativo especificado para calcular o tempo de expiração absoluto a ser usado para o temporizador. Como a hora do sistema é precisa apenas para o último tique do relógio do sistema, o tempo de expiração calculado pode ser até um período de relógio do sistema anterior ao tempo de expiração esperado pelo chamador. Se um tempo de expiração relativo especificado for próximo ou menor que o período do relógio do sistema, o temporizador poderá expirar imediatamente, sem atraso.

Uma maneira possível de dar suporte mais preciso a tempos de expiração mais curtos é diminuir o tempo entre tiques de relógio do sistema, mas isso provavelmente aumentará o consumo de energia. Além disso, a redução do período do relógio do sistema pode não atingir de forma confiável uma granularidade mais fina do relógio do sistema, a menos que o processamento de interrupção para os outros dispositivos na plataforma possa ser garantido para não atrasar o processamento de interrupções do relógio do sistema.

Começando com Windows 8, KeDelayExecutionThread usa uma técnica mais precisa para calcular o tempo de expiração absoluto de um tempo de expiração relativo especificado pelo chamador. Primeiro, para obter uma estimativa mais precisa da hora atual do sistema, a rotina usa o contador de desempenho do sistema para medir o tempo decorrido desde o último tique do relógio do sistema. Em seguida, a rotina adiciona essa estimativa mais precisa do tempo do sistema ao tempo de expiração relativo para calcular o tempo de expiração absoluto. O tempo de expiração absoluto calculado por essa técnica é preciso em um microssegundo. Como resultado, o temporizador não expirará antes que o tempo de expiração relativo especificado decorrido. O temporizador ainda pode expirar até um período de relógio do sistema posterior à hora especificada e pode expirar ainda mais tarde se o processamento da interrupção do relógio do sistema for atrasado por interrupção do processamento para outros dispositivos.

Se o tempo do sistema for alterado antes de um temporizador expirar, um temporizador relativo não será afetado, mas o sistema ajustará cada temporizador absoluto. Um temporizador relativo sempre expira após o número especificado de unidades de tempo decorrido, independentemente do tempo absoluto do sistema. Um temporizador absoluto expira em um momento específico do sistema, portanto, uma alteração no tempo do sistema altera a duração de espera de um temporizador absoluto.