共用方式為


No-Wake 定時器

從 Windows 8.1 開始,驅動程式可以使用無喚醒計時器來避免不必要地將處理器從低電源狀態喚醒。 透過將處理器保持在低功率狀態,無喚醒計時器可降低功耗並延長平板電腦或其他行動電腦在電池充電下運行的時間。

只有當處理器處於作用中執行狀態時,計時器才能到期。 如果當處理器處於低電源狀態時,計時器達到其到期時間,且計時器需要立即到期,則計時器必須喚醒處理器。 不過,當無喚醒計時器達到其到期時間,且處理器處於低電源狀態時,此計時器會等待到期,直到處理器因計時器以外的某些原因喚醒為止。 作為選項,驅動程式可以指定無喚醒計時器的最大延遲容許,以便如果處理器在計時器到期時間後由於某些其他原因未喚醒,並超過最大延遲容許時,計時器將喚醒處理器。

驅動程式可以使用無喚醒計時器來起始只有在處理器處於作用中狀態時才需要執行的非重要作業。 例如,驅動程式可能會使用無喚醒計時器,定期將累積的狀態資訊從記憶體緩衝區排清至檔案。 此狀態資訊描述驅動程式只有在處理器作用中時才會執行的處理工作。 當處理器處於低功耗狀態時,不會產生任何狀態訊息,也不需要喚醒處理器。

若要建立無喚醒計時器,WDM 驅動程式會呼叫 ExAllocateTimer 常式。 在此呼叫中,驅動程式會在 Attributes 參數中設定 EX_TIMER_NO_WAKE 旗標位。

若要將無喚醒計時器設定為在某個到期時間到期,驅動程式會呼叫 ExSetTimer 常式。 在此呼叫中,驅動程式可以指定無喚醒計時器在達到其到期時間之後,在計時器喚醒處理器之前應該等候多長時間。 驅動程式會將此可容忍的延遲時間寫入驅動程式作為輸入參數傳遞至 ExSetTimer 常式的 EXT_SET_PARAMETERS 結構中的 NoWakeTolerance 成員。 如果驅動程式將 NoWakeTolerance 成員設定為特殊值 EX_TIMER_UNLIMITED_TOLERANCE,計時器永遠不會喚醒處理器,因此,在處理器因其他原因喚醒之前,無法過期。

Kernel-Mode 驅動程式架構 (KMDF) 驅動程式或 User-Mode 驅動程式架構 (UMDF) 驅動程式可以呼叫 WdfTimerCreate 方法來建立無喚醒計時器。 在此呼叫中,驅動程式會將 WDF_TIMER_CONFIG 結構的指標傳遞為參數。 若要建立永不喚醒處理器的無喚醒計時器,驅動程式會將此結構的 TolerableDelay 成員設定為 TolerableDelayUnlimited 常數。 從 Windows 8.1 和 KMDF 1.13 版或 UMDF 2.0 開始,支援此常數。

與可聚結計時器的比較

KeSetCoalescableTimer 常式是在 Windows 7 中引進的。 此常式可讓驅動程式指定計時器到期時間中允許的容錯量。 通常,作業系統可以使用此資訊,將兩個或多個計時器中斷合併為單一中斷。 如果多個計時器的到期時間彼此足夠接近,以至於它們的容差窗口重疊,則重疊區域中的單個計時器中斷可以滿足所有這些計時器的計時要求。

計時器合併的主要好處是它延長了處理器在計時器到期之間可以保持低功耗狀態的時間。 因此,驅動程式會針對類似目的使用計時器合併技術和無喚醒計時器。

不過,可合併計時器的行為與無喚醒計時器的行為不同。 特別是,指定給無喚醒計時器的可容忍延遲僅在處理器處於低功耗狀態時才適用,而可合併計時器到期的容忍度會套用,無論處理器是否處於低功耗狀態。 針對可聯合計時器,驅動程式可以增加到期時間中的容錯量,以減少計時器喚醒處理器的可能性,但增加容錯的副作用是,當處理器處於作用中時,計時器的精確度會降低。 相反地,指定給無喚醒計時器的可容忍延遲不會影響處理器作用中時計時器的精確度。 對於許多驅動程式來說,無喚醒計時器可能是降低耗電量的更好方法。