共用方式為


No-Wake計時器

從Windows 8.1開始,驅動程式可以使用無喚醒計時器來避免從低電量狀態喚醒處理器。 藉由讓處理器保持低電量狀態,無喚醒計時器可減少耗電量,並延長平板電腦或其他行動電腦可在電池計量上執行的時間。

只有在處理器處於作用中、執行中狀態時,計時器才會過期。 如果計時器在處理器處於低電源狀態時達到其到期時間,而且計時器必須立即到期,計時器必須喚醒處理器。 不過,當無喚醒計時器到達其到期時間,且處理器處於低電源狀態時,此計時器會等候到期,直到處理器因計時器以外的某些原因而喚醒為止。 作為選項,驅動程式可以指定無喚醒計時器的最大延遲容錯,如此一來,如果處理器沒有喚醒 (其他原因,) 計時器到期時間後的最大延遲容錯範圍內,計時器就會喚醒處理器。

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

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

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

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

可聯合計時器的比較

KeSetCoalescableTimer常式是在 Windows 7 中引進。 此常式可讓驅動程式指定計時器到期時間允許的容錯量。 通常,作業系統可以使用這項資訊,將兩個或多個計時器中斷聯合成單一中斷。 如果多個計時器的到期時間夠接近其容錯視窗重迭,重迭區域中的單一計時器中斷可以滿足所有這些計時器的計時需求。

計時器聯合的主要優點是,它會延長處理器可以在計時器到期之間保持低電量狀態的時間。 因此,驅動程式會針對類似用途使用計時器聯合和無喚醒計時器。

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