Časovače s vysokým rozlišením

Počínaje Windows 8.1 můžou ovladače používat rutiny časovače ExXxx ke správě časovačů s vysokým rozlišením. Přesnost časovače s vysokým rozlišením je omezená pouze maximálním podporovaným rozlišením systémových hodin. Naproti tomu časovače, které jsou omezené na výchozí systémové rozlišení hodin, jsou výrazně méně přesné.

Časovače s vysokým rozlišením však vyžadují, aby přerušení systémových hodin nastávala alespoň dočasně častěji, což má tendenci zvýšit spotřebu energie. Ovladače by proto měly používat časovače s vysokým rozlišením pouze v případě, že přesnost časovače je nezbytná, a ve všech ostatních případech používat časovače výchozího rozlišení.

Chcete-li vytvořit časovač s vysokým rozlišením, ovladač WDM volá rutinu ExAllocateTimer a nastaví příznak EX_TIMER_HIGH_RESOLUTION v parametru Attributes . Když ovladač zavolá rutinu ExSetTimer k nastavení časovače vysokého rozlišení, operační systém podle potřeby zvýší rozlišení systémových hodin, aby časy vypršení platnosti časovače přesněji odpovídaly nominálním časům vypršení platnosti zadaným v parametrech DueTime a Period .

Ovladač Kernel-Mode Driver Framework (KMDF) může volat metodu WdfTimerCreate k vytvoření časovače s vysokým rozlišením. Při tomto volání ovladač předá ukazatel na strukturu WDF_TIMER_CONFIG jako parametr. Chcete-li vytvořit časovač vysokého rozlišení, ovladač nastaví UseHighResolutionTimer člen této struktury na HODNOTU TRUE. Tento člen je součástí struktury začínající systémem Windows 8.1 a KMDF verze 1.13.

Řízení přesnosti časovače

Například pro Windows běžící na procesoru x86 je výchozí interval mezi systémovými hodinami obvykle přibližně 15 milisekund a minimální interval mezi systémovými hodinami je přibližně 1 milisekund. Proto je čas vypršení platnosti časovače výchozího rozlišení (který ExAllocateTimer vytvoří, pokud není nastaven příznak EX_TIMER_HIGH_RESOLUTION) možné řídit pouze do 15 milisekund, ale čas vypršení platnosti časovače s vysokým rozlišením lze řídit v milisekundách.

Pokud ovladač určuje relativní dobu vypršení platnosti časovače výchozího rozlišení, může časovač vypršet až o 15 milisekund starších nebo novějších než zadanou dobu vypršení platnosti. Pokud ovladač určuje relativní dobu vypršení platnosti časovače s vysokým rozlišením, může časovač vypršet až o milisekundu po zadané době vypršení platnosti, ale nikdy nevyprší brzy. Další informace o vztahu mezi systémovým rozlišením hodin a přesností časovače naleznete v tématu Přesnost časovače.

Pokud nejsou nastavené žádné časovače s vysokým rozlišením, operační systém obvykle spouští systémové hodiny ve své výchozí frekvenci. Pokud je však nastaven jeden nebo více časovačů s vysokým rozlišením, operační systém může potřebovat spustit systémové hodiny s maximální rychlostí alespoň na část času před vypršením platnosti těchto časovačů.

Aby se zbytečně nezvyšovala spotřeba energie, operační systém spouští systémové hodiny s maximální rychlostí pouze v případě, že je to nezbytné pro splnění požadavků na časování časovačů s vysokým rozlišením. Pokud je například časovač s vysokým rozlišením pravidelný a jeho období zahrnuje několik výchozích systémových hodin, operační systém může spustit systémové hodiny s maximální rychlostí pouze v části období časovače, která bezprostředně předchází každému vypršení platnosti. Po zbytek období časovače běží systémové hodiny s výchozí rychlostí.

Aby se zabránilo nadměrné spotřebě energie, ovladače by měly vyhnout nastavení doby dlouhodobého časovače vysokého rozlišení na hodnotu, která je menší než výchozí interval mezi systémovými tiky hodin. V opačném případě je operační systém nucen nepřetržitě spouštět systémové hodiny s maximální rychlostí.

Počínaje Systémem Windows 8 může ovladač volat rutinu ExQueryTimerResolution , aby získal rozsah rozlišení časovače, které jsou podporovány systémovými hodinami.

Porovnání s ExSetTimerResolution

Ovladač může volat rutinu ExSetTimerResolution k změně časového intervalu mezi po sobě jdoucími systémovými hodinovými přerušeními. Ovladač může například volat tuto rutinu, aby změnil systémové hodiny z výchozí rychlosti na maximální rychlost, aby se zlepšila přesnost časovače. Použití ExSetTimerResolution má však v porovnání s použitím časovačů s vysokým rozlišením vytvořených exAllocateTimer několik nevýhod.

Za prvé, po volání ExSetTimerResolution k dočasnému zvýšení frekvence systémového času musí ovladač zavolat ExSetTimerResolution podruhé, aby obnovil frekvenci systémového času na výchozí hodnotu. Jinak systémový časovač hodin nepřetržitě generuje přerušení maximální rychlostí, což může způsobit nadměrnou spotřebu energie.

Za druhé, ovladač, který používá rutinu ExSetTimerResolution nemůže optimalizovat dočasné použití vyšší systémové frekvence tak efektivně, jak to operační systém dělá pro časovače s vysokým rozlišením. Systémové hodiny tak tráví více času během běhu na maximální rychlost, než je opravdu nutné.

Za třetí, pokud více ovladačů současně používá ExSetTimerResolution ke zlepšení přesnosti časovače, systémové hodiny mohou běžet v maximální rychlosti po dlouhou dobu. Naproti tomu operační systém globálně koordinuje provoz několika časovačů s vysokým rozlišením, aby systémové hodiny běžely maximální rychlostí pouze v případě, že je to nezbytné ke splnění požadavků na časování těchto časovačů.

A konečně použití ExSetTimerResolution je ze své podstaty méně přesné než použití časovače s vysokým rozlišením. Když ovladač zavolá ExSetTimerResolution, aby zvýšil systémové hodiny na maximální rychlost, což je obvykle asi jedno tiknutí za milisekundu, ovladač může zavolat rutinu, takovou jako je KeSetTimerEx, aby nastavil časovač. Pokud ovladač v tomto volání určuje relativní dobu vypršení platnosti, může časovač vypršet až o milisekundu dříve nebo později než zadanou dobu vypršení platnosti. Pokud je však pro časovač s vysokým rozlišením zadaný relativní čas vypršení platnosti, časovač může vypršet až o milisekundu později než zadanou dobu vypršení platnosti, ale nikdy nevyprší brzy.