Megosztás:


Időzítő pontossága

A rendszer időzítő rutinja általában lehetővé teszi a hívó számára, hogy abszolút vagy relatív lejárati időt adjon meg egy időzítőhöz. Lásd például a KeWaitForSingleObject, a KeSetTimer vagy a KeDelayExecutionThread című témakört. A pontosságot, amellyel az operációs rendszer mérni tudja a lejárati időt, a rendszeróra részletessége korlátozza.

A rendszeridő a rendszeróra minden egyes kattintásánál frissül, és csak a legutóbbi kattintásra pontos. Ha a hívó abszolút lejárati időt ad meg, a rendszer észleli az időzítő lejáratát az első rendszerórajel feldolgozása során, amely a megadott idő után következik be. Így az időzítő a megadott abszolút lejárati időnél akár egy rendszeróra ciklus elteltével is lejárhat. Ha ehelyett időzítőintervallumot vagy relatív lejárati időt ad meg, a lejárat a megadott időpontnál korábbi vagy annál későbbi időszakra is előfordulhat, attól függően, hogy pontosan hol esik az intervallum kezdő és záró időpontja a rendszerórajelek között. Függetlenül attól, hogy abszolút vagy relatív idő van-e megadva, előfordulhat, hogy az időzítő lejárata csak később észlelhető, ha a rendszeróra megszakításfeldolgozása késik más eszközök megszakításfeldolgozásával.

Amikor a hívó relatív lejárati időt ad meg, az időzítő rutinja hozzáadja az aktuális rendszerórát a megadott relatív lejárati időhöz, hogy kiszámítsa az időzítőhöz használandó abszolút lejárati időt. Mivel a rendszeridő csak a rendszeróra legújabb ketyegésére pontos, a kiszámított lejárati idő akár a hívó által várt lejárati időnél korábbi rendszeróra-időszak is lehet. Ha egy megadott relatív lejárati idő közel van a rendszerórához, vagy kisebb a rendszeróránál, az időzítő azonnal, késedelem nélkül lejárhat.

A rövidebb lejárati idő pontosabb támogatásának lehetséges módja a rendszer órajelei közötti idő csökkentése, de ez valószínűleg növeli az energiafogyasztás. Emellett előfordulhat, hogy a rendszeróra időtartamának csökkentése nem éri el megbízhatóan a rendszer órajelének finomabb pontosságát, kivéve, ha a platform többi eszközének megszakításfeldolgozása garantáltan nem késlelteti a rendszeróra-megszakítások feldolgozását.

A Windows 8-tól kezdve a KeDelayExecutionThread egy pontosabb technikával kiszámítja a hívó által megadott relatív lejárati idő abszolút lejárati idejét. Először is, az aktuális rendszeridő pontosabb becsléséhez a rutin a rendszerteljesítmény-számlálóval méri az utolsó rendszerórajel óta eltelt időt. Ezután a rutin hozzáadja a rendszeridő pontosabb becslését a relatív lejárati időhöz az abszolút lejárati idő kiszámításához. Az ezzel a technikával kiszámított abszolút lejárati idő pontos egy mikroszekundumon belül. Ennek eredményeképpen az időzítő nem jár le a megadott relatív lejárati idő lejárta előtt. Az időzítő elévülhet akár egy rendszeróra periódussal később is a megadott időpont után, és még később is, ha a rendszeróra megszakításának feldolgozását más eszközök megszakításkezelése késlelteti.

Ha a rendszeridő egy időzítő lejárta előtt változik, a relatív időzítő nem lesz hatással, de a rendszer minden egyes abszolút időzítőt módosít. A relatív időzítő mindig a megadott számú időegység letelte után jár le, függetlenül az abszolút rendszeridőtől. Az abszolút időzítő egy adott rendszeridőben lejár, így a rendszeridő változása megváltoztatja az abszolút időzítő várakozási időtartamát.