Udostępnij przez


czasomierze No-Wake

Począwszy od systemu Windows 8.1, sterowniki mogą używać czasomierzy bez wznawiania, aby uniknąć niepotrzebnego przebudzenia procesora ze stanu niskiego zasilania. Utrzymując procesor w trybie niskiego zużycia energii, zegar bez wybudzania zmniejsza zużycie energii i wydłuża czas działania tabletu lub innego komputera przenośnego na naładowaniu baterii.

Czasomierz może wygasnąć tylko wtedy, gdy procesor jest w stanie aktywnym, uruchomionym. Jeśli czasomierz osiągnie czas wygaśnięcia, gdy procesor jest w stanie niskiego poboru mocy, a czasomierz musi wygasnąć natychmiast, musi on obudzić procesor. Jednak gdy czasomierz bez aktywacji osiągnie czas wygaśnięcia, a procesor jest w stanie niskiego zasilania, czasomierz czeka na wygaśnięcie do czasu, gdy procesor obudzi się z jakiegoś powodu innego niż czasomierz. Opcjonalnie, sterownik może określić maksymalną tolerancję opóźnienia dla czasomierza niewznawiającego, tak aby jeśli procesor się nie obudzi (z jakiegoś innego powodu) w czasie maksymalnej tolerancji opóźnienia po upływie czasu wygaśnięcia czasomierza, czasomierz budzi procesor.

Sterownik może używać czasomierza bez wybudzania do inicjowania niekrytycznych operacji, które powinny być wykonywane tylko wtedy, gdy procesor jest w stanie aktywnym. Na przykład, sterownik może używać zegara bezczynności, aby okresowo przenosić zgromadzone informacje o stanie z buforu pamięci do pliku. Te informacje o stanie opisują pracę przetwarzania wykonywaną przez sterownik tylko wtedy, gdy procesor jest aktywny. Gdy procesor jest w stanie niskiego zasilania, nie są generowane żadne informacje o stanie i nie ma potrzeby wznawiania procesora.

Aby utworzyć czasomierz uniemożliwiający wybudzenie, sterownik WDM wywołuje procedurę ExAllocateTimer. W tym wywołaniu sterownik ustawia bit flagi EX_TIMER_NO_WAKE w parametrze Atrybuty .

Aby ustawić czasomierz trybu czuwania, który wygaśnie o określonym czasie, sterownik wywołuje procedurę ExSetTimer. W tym wywołaniu sterownik może określić, jak długo czasomierz bez wywołania powinien czekać, aż osiągnie czas wygaśnięcia, zanim czasomierz zbudzi procesor. Sterownik zapisuje ten tolerowany czas opóźnienia do elementu członkowskiego NoWakeTolerance w strukturze EXT_SET_PARAMETERS , którą sterownik przekazuje jako parametr wejściowy do procedury ExSetTimer . Jeśli sterownik ustawia składnik NoWakeTolerance na wartość specjalną EX_TIMER_UNLIMITED_TOLERANCE, czasomierz nigdy nie wybudza procesora i dlatego nie może wygasnąć, dopóki procesor nie zostanie wybudzony z innego powodu.

Sterownik Kernel-Mode Driver Framework (KMDF) lub sterownik User-Mode Driver Framework (UMDF) może wywołać metodę WdfTimerCreate w celu utworzenia timera bez wybudzania. W tym wywołaniu sterownik przekazuje wskaźnik do struktury WDF_TIMER_CONFIG jako parametru. Aby utworzyć czasomierz bez budzenia, który nigdy nie aktywuje procesora, sterownik ustawia członka TolerableDelay tej struktury na stałą TolerableDelayUnlimited. Ta stała jest wspierana począwszy od systemu Windows 8.1 oraz KMDF w wersji 1.13 lub UMDF 2.0.

Porównanie z czasomierzami, które można połączyć

Rutyna KeSetCoalescableTimer została wprowadzona w systemie Windows 7. Ta procedura umożliwia sterownikowi określenie, ile tolerancji należy uwzględnić dla czasu wygaśnięcia czasomierza. Często system operacyjny może używać tych informacji do połączenia dwóch lub większej liczby przerwań czasomierza w jedno przerwanie. Jeśli czasy wygaśnięcia wielu czasomierzy są wystarczająco blisko położone, że ich okna tolerancji się nakładają, jedno przerwanie zegara w regionie nakładania się może spełniać wymagania dotyczące czasu wszystkich tych czasomierzy.

Główną zaletą koalescencji timerów jest to, że wydłuża czas, przez jaki procesor może pozostać w stanie niskiego poboru mocy między wygaśnięciami timerów. W związku z tym sterowniki używają koalescencji timerów i timerów bez wybudzania w podobnych celach.

Jednak łączeniowalne czasomierze zachowują się inaczej niż czasomierze bez budzenia. W szczególności dopuszczalne opóźnienie określone dla licznika no-wake ma zastosowanie tylko wtedy, gdy procesor jest w stanie niskiego zasilania, podczas gdy tolerancja określona dla wygaśnięcia licznika z możliwością koalescencji ma zastosowanie niezależnie od tego, czy procesor jest w stanie niskiego zasilania. W przypadku czasomierza możliwego do scalenia sterownik może zwiększyć tolerancję okresu wygaśnięcia, aby zmniejszyć prawdopodobieństwo, że czasomierz wybudzi procesor, ale zwiększenie tolerancji prowadzi do zmniejszenia dokładności czasomierza, gdy procesor jest aktywny. Natomiast tolerowane opóźnienie określone dla czasomierza bez wybudzania nie wpływa na dokładność czasomierza, gdy procesor jest aktywny. Dla wielu sterowników, timery blokady wybudzania mogą być lepszym sposobem na zmniejszenie zużycia energii.