Temporizadores High-Resolution

Começando com Windows 8.1, os drivers podem usar as rotinas do Temporizador ExXxx para gerenciar temporizadores de alta resolução. A precisão de um temporizador de alta resolução é limitada apenas pela resolução máxima com suporte do relógio do sistema. Por outro lado, os temporizadores limitados à resolução padrão do relógio do sistema são significativamente menos precisos.

No entanto, os temporizadores de alta resolução exigem interrupções do relógio do sistema para, pelo menos, temporariamente, ocorrer em uma taxa mais alta, o que tende a aumentar o consumo de energia. Portanto, os drivers devem usar temporizadores de alta resolução somente quando a precisão do temporizador for essencial e usar temporizadores de resolução padrão em todos os outros casos.

Para criar um temporizador de alta resolução, um driver WDM chama a rotina ExAllocateTimer e define o sinalizador EX_TIMER_HIGH_RESOLUTION no parâmetro Attributes . Quando o driver chama a rotina ExSetTimer para definir o temporizador de alta resolução, o sistema operacional aumenta a resolução do relógio do sistema, conforme necessário, para que os horários em que o temporizador expire com mais precisão correspondam aos tempos de expiração nominais especificados nos parâmetros DueTime e Period .

Um driver KMDF (Kernel-Mode Driver Framework) pode chamar o método WdfTimerCreate para criar um temporizador de alta resolução. Nessa chamada, o driver passa um ponteiro para uma estrutura WDF_TIMER_CONFIG como um parâmetro. Para criar um temporizador de alta resolução, o driver define o membro UseHighResolutionTimer dessa estrutura como TRUE. Esse membro faz parte da estrutura começando com Windows 8.1 e KMDF versão 1.13.

Controlando a precisão do temporizador

Por exemplo, para o Windows em execução em um processador x86, o intervalo padrão entre tiques de relógio do sistema normalmente é de cerca de 15 milissegundos e o intervalo mínimo entre tiques de relógio do sistema é de cerca de 1 milissegundo. Assim, o tempo de expiração de um temporizador de resolução padrão (que ExAllocateTimer cria se o sinalizador EX_TIMER_HIGH_RESOLUTION não estiver definido) pode ser controlado apenas para dentro de cerca de 15 milissegundos, mas o tempo de expiração de um temporizador de alta resolução pode ser controlado para dentro de um milissegundo.

Se um driver especificar um tempo de expiração relativo para um temporizador de resolução padrão, o temporizador poderá expirar até cerca de 15 milissegundos anterior ou posterior ao tempo de expiração especificado. Se um driver especificar um tempo de expiração relativo para um temporizador de alta resolução, o temporizador poderá expirar tão tarde quanto cerca de um milissegundo após o tempo de expiração especificado, mas nunca expirará antecipadamente. Para obter mais informações sobre a relação entre a resolução do relógio do sistema e a precisão do temporizador, consulte Precisão do temporizador.

Se nenhum temporizador de alta resolução estiver definido, o sistema operacional normalmente executará o relógio do sistema em sua taxa padrão. No entanto, se um ou mais temporizadores de alta resolução estiverem definidos, o sistema operacional poderá precisar executar o relógio do sistema em sua taxa máxima por pelo menos uma parte do tempo antes que esses temporizadores expirem.

Para evitar aumentar desnecessariamente o consumo de energia, o sistema operacional executa o relógio do sistema em sua taxa máxima somente quando necessário para atender aos requisitos de temporizador de alta resolução. Por exemplo, se um temporizador de alta resolução for periódico e seu período abranger vários tiques de relógio padrão do sistema, o sistema operacional poderá executar o relógio do sistema em sua taxa máxima apenas na parte do período de temporizador que precede imediatamente cada expiração. Para o restante do período de temporizador, o relógio do sistema é executado em sua taxa padrão.

Para evitar o consumo excessivo de energia, os drivers devem evitar definir o período de um temporizador de alta resolução de longa execução para um valor menor que o intervalo padrão entre tiques de relógio do sistema. Caso contrário, o sistema operacional será forçado a executar continuamente o relógio do sistema em sua taxa máxima.

Começando com Windows 8, um driver pode chamar a rotina ExQueryTimerResolution para obter o intervalo de resoluções de temporizador compatíveis com o relógio do sistema.

Comparação com ExSetTimerResolution

A partir do Windows 2000, um driver pode chamar a rotina ExSetTimerResolution para alterar o intervalo de tempo entre interrupções sucessivas do relógio do sistema. Por exemplo, um driver pode chamar essa rotina para alterar o relógio do sistema de sua taxa padrão para sua taxa máxima para melhorar a precisão do temporizador. No entanto, o uso de ExSetTimerResolution tem várias desvantagens em comparação com o uso de temporizadores de alta resolução criados por ExAllocateTimer.

Primeiro, depois de chamar ExSetTimerResolution para aumentar temporariamente a taxa do relógio do sistema, um driver deve chamar ExSetTimerResolution uma segunda vez para restaurar o relógio do sistema para sua taxa padrão. Caso contrário, o temporizador do relógio do sistema gera continuamente interrupções na taxa máxima, o que pode causar consumo excessivo de energia.

Em segundo lugar, um driver que usa a rotina ExSetTimerResolution não pode otimizar seu uso temporário de taxas de relógio do sistema mais altas com a eficiência que o sistema operacional faz para temporizadores de alta resolução. Portanto, o relógio do sistema gasta mais tempo em execução na taxa máxima do que é estritamente necessário.

Em terceiro lugar, se vários drivers usarem simultaneamente ExSetTimerResolution para melhorar a precisão do temporizador, o relógio do sistema poderá ser executado em sua taxa máxima por longos períodos. Por outro lado, o sistema operacional coordena globalmente a operação de vários temporizadores de alta resolução para que o relógio do sistema seja executado na taxa máxima somente quando necessário para atender aos requisitos de temporizador desses temporizadores.

Por fim, usar ExSetTimerResolution é inerentemente menos preciso do que usar um temporizador de alta resolução. Depois que um driver chama ExSetTimerResolution para aumentar o relógio do sistema para sua taxa máxima, que normalmente é cerca de um tique por milissegundo, o driver pode chamar uma rotina como KeSetTimerEx para definir o temporizador. Se, nessa chamada, o driver especificar um tempo de expiração relativo, o temporizador poderá expirar até cerca de um milissegundo anterior ou posterior ao tempo de expiração especificado. No entanto, se um tempo de expiração relativo for especificado para um temporizador de alta resolução, o temporizador poderá expirar até cerca de um milissegundo posterior ao tempo de expiração especificado, mas nunca expirará antecipadamente.