Compartilhar via


Temporizadores No-Wake

A partir do Windows 8.1, os drivers podem usar temporizadores de não ativação para evitar despertar desnecessariamente 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 espera para expirar até que o processador seja ativado por algum motivo diferente do temporizador. Como opção, um driver pode especificar uma tolerância máxima de atraso para um temporizador de não-despertar, de modo que, se o processador não despertar (por algum outro motivo) dentro da tolerância máxima de atraso após o tempo de expiração do temporizador, o temporizador faça o processador despertar.

Um driver pode usar um timer de não-despertar para iniciar operações não críticas que precisam ser realizadas apenas quando o processador está em estado ativo. Por exemplo, um driver pode usar um temporizador sem ativação para liberar periodicamente informações de status acumuladas de um buffer de memória para um arquivo. Essas informações de 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 despertar, um driver WDM chama a rotina ExAllocateTimer. Nesta chamada, o driver define o bit de sinalizador EX_TIMER_NO_WAKE no parâmetro Attributes.

Para definir um temporizador de inatividade para expirar em um horário específico, o driver chama a rotina ExSetTimer. Nesta chamada, o driver pode especificar quanto tempo o temporizador sem ativação deve aguardar após atingir o tempo de expiração antes que o temporizador acione o processador. O driver grava esse tempo tolerável de atraso para o 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. Nesta chamada, o driver passa, como parâmetro, um ponteiro para uma estrutura WDF_TIMER_CONFIG. 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 a partir do Windows 8.1 e KMDF versão 1.13 ou UMDF 2.0.

Comparação com temporizadores coalescíveis

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. Com frequência, 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 para que suas janelas de tolerância se sobreponham, 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 coalização de temporizador é que ele estende o tempo em que o processador pode permanecer em um estado de baixa potência entre expirações do temporizador. Assim, os drivers utilizam coalescência de temporizadores e temporizadores sem despertar para fins semelhantes.

No entanto, temporizadores coalescíveis se comportam de forma diferente dos temporizadores sem ativação. Em particular, o atraso tolerável especificado para um temporizador sem ativação aplica-se somente quando o processador está em um estado de baixa potência, enquanto a tolerância especificada para a expiração de um temporizador coalescável 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.