计时器准确性

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

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

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

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

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

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