计时器准确性

系统计时器例程通常使调用方能够指定计时器的绝对或相对过期时间。 例如,请参阅 KeWaitForSingleObjectKeSetTimerKeDelayExecutionThread。 操作系统测量过期时间的准确性受到系统时钟粒度的限制。

系统时间在系统时钟的每个时钟周期上更新,并且仅准确到最新的时钟周期。 如果调用方指定绝对过期时间,则会在处理在指定时间之后发生的第一个系统时钟计时周期期间检测到计时器的到期时间。 因此,计时器的过期时间可能比指定的绝对过期时间晚一个系统时钟周期。 如果改为指定计时器间隔或相对过期时间,则过期时间可能早于指定时间或晚于指定时间的时间段,具体取决于此间隔的开始和结束时间在系统时钟时钟周期之间的确切位置。 无论是指定了绝对时间还是相对时间,如果系统时钟的中断处理由于其他设备中断处理的延迟而推迟,那么计时器的过期可能直到更晚的时候才会被检测到。

当调用方指定相对过期时间时,计时器例程会将当前系统时钟时间添加到指定的相对过期时间,以计算用于计时器的绝对过期时间。 由于系统时间仅精确到系统时钟的最新滴答,因此计算出的过期时间可能会比调用方预期的过期时间最多提前一个时钟周期。 如果指定的相对过期时间接近或小于系统时钟周期,计时器可能会立即过期,且不会延迟。

更准确地支持较短的过期时间的可能方法是减少系统时钟周期之间的时间,但这样做可能会增加能耗。 此外,减少系统时钟周期可能无法可靠地实现更精细的系统时钟粒度,除非可以保证平台中的其他设备的中断处理不会延迟系统时钟中断的处理。

从 Windows 8 开始,KeDelayExecutionThread 使用更精确的技术从调用方指定的相对过期时间计算出绝对过期时间。 首先,为了获取对当前系统时间的更精确的估计,例程使用系统性能计数器来测量自上次系统时钟计时周期以来所经过的时间。 接下来,例程会将系统时间的更精确估计添加到相对过期时间,以计算绝对过期时间。 此方法计算的绝对过期时间准确到微秒内。 因此,计时器在指定的相对过期时间过后不会过期。 计时器仍可能会在指定时间后延迟一个系统时钟周期才过期,如果系统时钟中断因其他设备的中断处理而延迟,计时器可能会更晚过期。

如果计时器过期前的系统时间发生更改,则相对计时器不会受到影响,但系统会调整每个绝对计时器。 无论绝对系统时间如何,相对计时器在指定的时间单位数过后始终过期。 绝对计时器在特定系统时间过期,因此系统时间的更改会更改绝对计时器的等待持续时间。