高解析度计时器

从 Windows 8.1 开始,驱动程序可以使用 ExXxx计时器例程来管理高分辨率计时器。 高分辨率计时器的准确性仅受系统时钟支持的最大分辨率的限制。 相比之下,限制为默认系统时钟分辨率的计时器的准确度明显较低。

但是,高分辨率计时器需要系统时钟中断(至少暂时)以更高的速率发生,这往往会增加功耗。 因此,驱动程序应仅在计时器准确性至关重要时才使用高分辨率计时器,并在所有其他情况下使用默认分辨率计时器。

为了创建高分辨率计时器,WDM 驱动程序调用 ExAllocateTimer 例程并在 Attributes 参数中设置EX_TIMER_HIGH_RESOLUTION标志。 当驱动程序调用 ExSetTimer 例程来设置高分辨率计时器时,操作系统会根据需要增加系统时钟的分辨率,以便计时器过期的时间更准确地对应于 DueTimePeriod 参数中指定的名义过期时间。

Kernel-Mode驱动程序框架 (KMDF) 驱动程序可以调用 WdfTimerCreate 方法来创建高分辨率计时器。 在此调用中,驱动程序将指向 WDF_TIMER_CONFIG 结构的指针作为参数传递。 若要创建高分辨率计时器,驱动程序会将此结构的 UseHighResolutionTimer 成员设置为 TRUE。 从 Windows 8.1 和 KMDF 版本 1.13 开始,此成员是结构的一部分。

控制计时器准确性

例如,对于在 x86 处理器上运行的 Windows,系统时钟周期之间的默认间隔通常约为 15 毫秒,系统时钟周期之间的最小间隔约为 1 毫秒。 因此,如果未设置EX_TIMER_HIGH_RESOLUTION标志 (, 则 exAllocateTimer 创建的默认分辨率计时器的过期时间) 只能控制在大约 15 毫秒内,但高分辨率计时器的过期时间可以控制在一毫秒内。

如果驱动程序为默认分辨率计时器指定相对过期时间,则计时器最多可以早于或晚于指定的过期时间约 15 毫秒。 如果驱动程序为高分辨率计时器指定相对过期时间,则计时器的过期时间可能晚于指定过期时间后大约一毫秒,但它永远不会提前过期。 有关系统时钟分辨率与计时器精度之间的关系的详细信息,请参阅 计时器准确性

如果未设置高分辨率计时器,操作系统通常按其默认速率运行系统时钟。 但是,如果设置了一个或多个高分辨率计时器,则操作系统可能需要在其最大速率下运行系统时钟至少一部分时间,然后这些计时器才会过期。

为了避免不必要地增加功耗,操作系统仅在需要满足高分辨率计时器的计时要求时才以最大速率运行系统时钟。 例如,如果高分辨率计时器是周期性的,并且其周期跨越多个默认的系统时钟时钟周期,则操作系统可能仅在每次到期前的计时器时间段内以最大速率运行系统时钟。 在计时器的剩余时间内,系统时钟按其默认速率运行。

为防止过度耗电量,驱动程序应避免将长时间运行的高分辨率计时器的时间段设置为小于系统时钟周期之间的默认间隔的值。 否则,操作系统将被迫以其最大速率连续运行系统时钟。

从 Windows 8 开始,驱动程序可以调用 ExQueryTimerResolution 例程来获取系统时钟支持的计时器分辨率范围。

与 ExSetTimerResolution 的比较

从 Windows 2000 开始,驱动程序可以调用 ExSetTimerResolution 例程来更改连续系统时钟中断之间的时间间隔。 例如,驱动程序可以调用此例程,将系统时钟从默认速率更改为最大速率,以提高计时器准确性。 但是,与使用 ExAllocateTimer 创建的高分辨率计时器相比,使用 ExSetTimerResolution 有几个缺点。

首先,在调用 ExSetTimerResolution 以暂时提高系统时钟速率后,驱动程序必须再次调用 ExSetTimerResolution 才能将系统时钟还原到其默认速率。 否则,系统时钟计时器会以最大速率持续生成中断,这可能会导致过度的功耗。

其次,使用 ExSetTimerResolution 例程 的驱动程序无法像操作系统对高分辨率计时器那样有效地优化对更高系统时钟速率的临时使用。 因此,系统时钟以最大速率运行的时间比严格必要的时间要多。

第三,如果多个驱动程序同时使用 ExSetTimerResolution 来提高计时器准确性,则系统时钟可能会长时间以最大速率运行。 相比之下,操作系统全局协调多个高分辨率计时器的操作,以便系统时钟仅在需要满足这些计时器的计时要求时才以最大速率运行。

最后,使用 ExSetTimerResolution 本质上不如使用高分辨率计时器准确。 在驱动程序调用 ExSetTimerResolution 将系统时钟增加到其最大速率(通常为每毫秒一个时钟周期)后,驱动程序可能会调用 KeSetTimerEx 等例程来设置计时器。 如果在此调用中,驱动程序指定相对过期时间,则计时器最多可以早于或晚于指定的过期时间约一毫秒。 但是,如果为高分辨率计时器指定了相对过期时间,则计时器可能比指定的过期时间晚大约一毫秒,但它永远不会提前过期。