计时器准确性

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

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

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

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

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

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