Partilhar via


Temporizadores No-Wake

Começando com Windows 8.1, os drivers podem usar temporizadores sem ativação para evitar desnecessariamente acordar um processador de um estado de baixa potência. Mantendo o processador em um estado de baixa potência, um temporizador sem ativação reduz o consumo de energia e estende o tempo que um tablet ou outro computador móvel pode executar com uma carga de bateria.

Um temporizador só pode expirar quando o processador estiver em um estado ativo e em execução. Se um temporizador atingir seu tempo de expiração quando o processador estiver em um estado de baixa potência e o temporizador precisar expirar imediatamente, o temporizador deverá ativar o processador. No entanto, quando um temporizador sem ativação atinge seu tempo de expiração e o processador está em um estado de baixa potência, esse temporizador aguarda expirar até que o processador ative por algum motivo diferente do temporizador. Como opção, um driver pode especificar uma tolerância máxima de atraso para um temporizador sem ativação para que, se o processador não ativar (por algum outro motivo) dentro da tolerância máxima de atraso após o tempo de expiração do temporizador, o temporizador ative o processador.

Um driver pode usar um temporizador sem ativação para iniciar operações não críticas que precisam ser executadas somente quando o processador está em um estado ativo. Por exemplo, um driver pode usar um temporizador sem ativação para liberar periodicamente informações acumuladas status de um buffer de memória para um arquivo. Essas informações status descrevem o trabalho de processamento que o driver executa somente quando o processador está ativo. Quando o processador está em um estado de baixa potência, nenhuma informação de status é gerada e não há necessidade de ativar o processador.

Para criar um temporizador sem ativação, um driver WDM chama a rotina ExAllocateTimer . Nessa chamada, o driver define o bit de sinalizador EX_TIMER_NO_WAKE no parâmetro Attributes .

Para definir um temporizador sem ativação para expirar em algum momento devido, o driver chama a rotina ExSetTimer . Nessa chamada, o driver pode especificar quanto tempo o temporizador sem ativação deve aguardar depois de atingir o tempo de expiração antes que o temporizador desperte o processador. O driver grava esse tempo de atraso tolerável no membro NoWakeTolerance na estrutura EXT_SET_PARAMETERS que o driver passa como um parâmetro de entrada para a rotina exSetTimer . Se o driver definir o membro NoWakeTolerance como o valor especial EX_TIMER_UNLIMITED_TOLERANCE, o temporizador nunca ativará o processador e, portanto, não poderá expirar até que o processador seja ativado por algum outro motivo.

Um driver KMDF (Kernel-Mode Driver Framework) ou um driver do UMDF (User-Mode Driver Framework) pode chamar o método WdfTimerCreate para criar um temporizador sem ativação. Nessa chamada, o driver passa um ponteiro para uma estrutura WDF_TIMER_CONFIG como um parâmetro. Para criar um temporizador sem ativação que nunca ativa o processador, o driver define o membro TolerableDelay dessa estrutura como a constante TolerableDelayUnlimited . Essa constante tem suporte começando com Windows 8.1 e KMDF versão 1.13 ou UMDF 2.0.

Comparação com temporizadores que podem ser agrupados

A rotina KeSetCoalescableTimer foi introduzida no Windows 7. Essa rotina permite que um driver especifique quanta tolerância permitir no tempo de expiração de um temporizador. Frequentemente, o sistema operacional pode usar essas informações para unir duas ou mais interrupções de temporizador em uma única interrupção. Se os tempos de expiração de vários temporizadores estiverem próximos o suficiente uns dos outros que suas janelas de tolerância se sobrepõem, uma única interrupção de temporizador na região de sobreposição poderá atender aos requisitos de temporizador de todos esses temporizadores.

O principal benefício da união do temporizador é que ele estende o tempo em que o processador pode permanecer em um estado de baixa potência entre expirações de temporizador. Assim, os motoristas usam temporizador de união e temporizadores sem ativação para fins semelhantes.

No entanto, os temporizadores que podem ser unidos se comportam de forma diferente dos temporizadores sem velório. Em particular, o atraso tolerável especificado para um temporizador sem ativação se aplica somente quando o processador está em um estado de baixa potência, enquanto a tolerância especificada para a expiração de um temporizador que não pode ser combinado se aplica independentemente de o processador estiver em um estado de baixa potência. Para um temporizador coalescável, um driver pode aumentar a quantidade de tolerância no tempo de expiração para reduzir a probabilidade de o temporizador ativar o processador, mas aumentar a tolerância tem o efeito colateral de diminuir a precisão do temporizador quando o processador está ativo. Por outro lado, o atraso tolerável especificado para um temporizador sem ativação não afeta a precisão do temporizador quando o processador está ativo. Para muitos drivers, os temporizadores sem ativação podem ser uma maneira melhor de reduzir o consumo de energia.