Sdílet prostřednictvím


Přesnost časovače

Rutina časovače systému obvykle umožňuje volajícímu určit absolutní nebo relativní čas vypršení platnosti časovače. Například viz KeWaitForSingleObject, KeSetTimer nebo KeDelayExecutionThread. Přesnost, s jakou může operační systém měřit časy vypršení platnosti, je omezená členitostí systémových hodin.

Systémový čas se aktualizuje při každém taktu systémových hodin a je přesný pouze na poslední takt. Pokud volající specifikuje absolutní čas vypršení, vypršení časovače se zjistí během zpracování prvního systémového časového tiknutí, ke kterému dojde po zadaném čase. Časovač tedy může vypršet až jedno systémové časové období později než zadanou absolutní dobu vypršení platnosti. Pokud je místo toho zadán interval časovače nebo relativní čas vypršení platnosti, může k vypršení dojít až o obdobnou dobu dříve nebo později než ve stanoveném čase v závislosti na tom, kde přesně počátky a konce tohoto intervalu spadají mezi systémové tiky hodin. Bez ohledu na to, zda je zadán absolutní nebo relativní čas, může být vypršení platnosti časovače zjištěno až později, pokud je přerušení zpracování systémových hodin zpožděno zpracováním přerušení pro jiná zařízení.

Když volající určuje relativní čas vypršení platnosti, rutina časovače přidá aktuální systémový čas času do zadané relativní doby vypršení platnosti, aby se vypočítala absolutní doba vypršení platnosti, která se má použít pro časovač. Vzhledem k tomu, že systémový čas je přesný pouze na nejnovější tiknutí systémových hodin, vypočítaná doba vypršení platnosti může být až o jeden cyklus systémového času dříve než doba vypršení očekávaná volajícím. Pokud se zadaný relativní čas vypršení platnosti blíží nebo je menší než systémové časové období, časovač může vypršet okamžitě bez zpoždění.

Možným způsobem, jak přesněji podporovat kratší dobu vypršení platnosti, je zkrátit dobu mezi systémovými hodinami, ale tím je pravděpodobné, že zvýší spotřebu energie. Kromě toho zkrácení periody systémového hodinového signálu nemusí spolehlivě dosáhnout jemnější granularity systémového hodinového signálu, pokud nelze zaručit, že zpracování přerušení pro ostatní zařízení na platformě by nezpůsobilo zpoždění zpracování přerušení systémového hodinového signálu.

Počínaje Windows 8 používá KeDelayExecutionThread přesnější techniku k výpočtu absolutní doby vypršení platnosti z relativní doby vypršení platnosti zadané volajícím. Nejprve k získání přesnějšího odhadu aktuálního systémového času používá rutina čítač výkonu systému k měření času uplynulého od posledního systémového času. Dále rutina přidá tento přesnější odhad systémového času k relativnímu času vypršení platnosti, aby se vypočítala absolutní doba vypršení platnosti. Absolutní doba vypršení platnosti vypočítaná touto technikou je přesná v rámci mikrosekundy. V důsledku toho časovač nevyprší před uplynutím zadaného relativního času vypršení platnosti. Časovač může vypršet až do systémového časového období později než zadaný čas a může vypršet i později, pokud zpracování přerušení systémového času je zpožděno zpracováním přerušení pro jiná zařízení.

Pokud se systémový čas změní před vypršením platnosti časovače, relativní časovač nebude ovlivněn, ale systém upraví každý absolutní časovač. Relativní časovač vždy vyprší po zadaném počtu uplynulých časových jednotek bez ohledu na absolutní systémový čas. Absolutní časovač vyprší v určitém systémovém čase, takže změna systémového času změní dobu čekání absolutního časovače.