Partilhar via


No-Wake temporizadores

A partir do Windows 8.1, os drivers podem usar temporizadores sem despertar para evitar acordar desnecessariamente um processador de um estado de baixo consumo de energia. Ao manter o processador num estado de baixo consumo de energia, um temporizador sem despertar reduz o consumo de energia e prolonga o tempo que um tablet ou outro computador móvel pode funcionar com uma carga de bateria.

Um temporizador pode expirar somente 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 baixo consumo de energia e o temporizador precisar expirar imediatamente, o temporizador deverá despertar o processador. No entanto, quando um temporizador de não-despertar atinge o seu tempo de expiração e o processador está em um estado de baixo consumo de energia, esse temporizador aguarda expirar até que o processador seja ativado por um motivo diferente do temporizador. Como opção, um driver pode especificar uma tolerância máxima de atraso para um temporizador sem despertar. Assim, se o processador não acordar por algum outro motivo dentro da tolerância máxima de atraso, após o tempo de expiração do temporizador, o temporizador desperta o processador.

Um driver pode usar um temporizador sem despertar 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 despertar para liberar periodicamente as 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 baixo consumo de energia, nenhuma informação de status é gerada e não há necessidade de despertar 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 Atributos .

Para definir um temporizador de inatividade para expirar em um momento específico, o driver chama a rotina ExSetTimer. Nesta chamada, o driver pode especificar quanto tempo o temporizador "sem ativação" deve esperar após atingir o seu tempo de expiração antes de o temporizador ativar o processador. O driver grava este tempo de atraso tolerável 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 para o valor especial EX_TIMER_UNLIMITED_TOLERANCE, o temporizador nunca despertará 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 UMDF (User-Mode Driver Framework) pode chamar o método WdfTimerCreate para criar um temporizador sem despertar. Nesta chamada, o driver passa um ponteiro para uma estrutura WDF_TIMER_CONFIG como parâmetro. Para criar um temporizador sem despertar que nunca desperta o processador, o driver define o membro TolerableDelay dessa estrutura como a constante TolerableDelayUnlimited . Esta constante é suportada 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. Frequentemente, o sistema operacional pode usar essas informações para aglutinar duas ou mais interrupções do temporizador em uma única interrupção. Se os tempos de expiração de vários temporizadores estiverem próximos o suficiente entre si para que suas janelas de tolerância se sobreponham, uma única interrupção do temporizador na região de sobreposição pode satisfazer os requisitos de temporização de todos esses temporizadores.

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

No entanto, os temporizadores coalescíveis comportam-se de forma diferente dos temporizadores sem ativação. Em particular, o atraso tolerável especificado para um temporizador sem despertar aplica-se apenas quando o processador está em um estado de baixo consumo de energia, enquanto a tolerância especificada para a expiração de um temporizador coalescable se aplica independentemente de o processador estar em um estado de baixo consumo de energia. Para um temporizador coalescable, um driver pode aumentar a quantidade de tolerância no tempo de expiração para reduzir a probabilidade de que o temporizador acorde 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 despertar não afeta a precisão do temporizador quando o processador está ativo. Para muitos motoristas, os temporizadores sem vigília podem ser uma maneira melhor de reduzir o consumo de energia.