High-Resolution計時器
從Windows 8.1開始,驅動程式可以使用ExXxxTimer常式來管理高解析度計時器。 高解析度計時器的精確度只受限於系統時鐘的最大支援解析度。 相反地,受限於預設系統時鐘解析度的計時器會明顯較不精確。
不過,高解析度計時器需要系統時鐘中斷,至少暫時以較高的速率發生,這通常會增加耗電量。 因此,驅動程式只有在計時器精確度很重要時,才應該使用高解析度計時器,並在所有其他情況下使用預設解析度計時器。
若要建立高解析度計時器,WDM 驅動程式會呼叫 ExAllocateTimer 常式,並在 Attributes 參數中設定EX_TIMER_HIGH_RESOLUTION旗標。 當驅動程式呼叫 ExSetTimer 常式來設定高解析度計時器時,作業系統會視需要增加系統時鐘的解析度,讓計時器到期的時間更精確地對應到 DueTime 和 Period 參數中指定的具名到期時間。
Kernel-Mode Driver Framework (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 來設定計時器。 如果在此呼叫中,驅動程式會指定相對到期時間,計時器最多可以超過或晚于指定到期時間的大約一毫秒。 不過,如果針對高解析度計時器指定相對到期時間,計時器最多可以超過指定到期時間的大約一毫秒,但永遠不會提早到期。