timer High-Resolution
A partire da Windows 8.1, i driver possono usare le routine ExXxxTimer per gestire timer ad alta risoluzione. L'accuratezza di un timer ad alta risoluzione è limitata solo dalla risoluzione massima supportata dell'orologio di sistema. Al contrario, i timer limitati alla risoluzione predefinita dell'orologio di sistema sono significativamente meno accurati.
Tuttavia, i timer ad alta risoluzione richiedono interruzioni dell'orologio di sistema, almeno temporaneamente, si verificano a una velocità più elevata, che tende ad aumentare il consumo di energia. Pertanto, i driver devono usare timer ad alta risoluzione solo quando l'accuratezza del timer è essenziale e usare timer di risoluzione predefinita in tutti gli altri casi.
Per creare un timer ad alta risoluzione, un driver WDM chiama la routine ExAllocateTimer e imposta il flag EX_TIMER_HIGH_RESOLUTION nel parametro Attributes . Quando il driver chiama la routine ExSetTimer per impostare il timer ad alta risoluzione, il sistema operativo aumenta la risoluzione dell'orologio di sistema, se necessario, in modo che i tempi in cui il timer scada più precisamente corrispondono alle ore di scadenza nominale specificate nei parametri DueTime e Period .
Un driver Kernel-Mode Driver Framework (KMDF) può chiamare il metodo WdfTimerCreate per creare un timer ad alta risoluzione. In questa chiamata, il driver passa un puntatore a una struttura WDF_TIMER_CONFIG come parametro. Per creare un timer ad alta risoluzione, il driver imposta il membro UseHighResolutionTimer di questa struttura su TRUE. Questo membro fa parte della struttura a partire da Windows 8.1 e KMDF versione 1.13.
Controllo dell'accuratezza del timer
Ad esempio, per Windows in esecuzione in un processore x86, l'intervallo predefinito tra i tick di clock di sistema è in genere di circa 15 millisecondi e l'intervallo minimo tra i tick di clock di sistema è di circa 1 millisecondo. Pertanto, l'ora di scadenza di un timer di risoluzione predefinita (che ExAllocateTimer crea se il flag di EX_TIMER_HIGH_RESOLUTION non è impostato) può essere controllato solo entro circa 15 millisecondi, ma l'ora di scadenza di un timer ad alta risoluzione può essere controllata in un millisecondo.
Se un driver specifica una scadenza relativa per un timer di risoluzione predefinita, il timer può scadere fino a circa 15 millisecondi prima o successiva alla scadenza specificata. Se un driver specifica una scadenza relativa per un timer ad alta risoluzione, il timer può scadere fino a circa un millisecondo dopo l'ora di scadenza specificata, ma non scade mai in anticipo. Per altre informazioni sulla relazione tra la risoluzione dell'orologio di sistema e l'accuratezza del timer, vedere Accuratezza timer.
Se non sono impostati timer ad alta risoluzione, il sistema operativo esegue in genere l'orologio di sistema alla velocità predefinita. Tuttavia, se sono impostati uno o più timer ad alta risoluzione, il sistema operativo potrebbe dover eseguire l'orologio di sistema alla velocità massima per almeno una parte del tempo prima della scadenza di questi timer.
Per evitare un consumo di energia inutilmente crescente, il sistema operativo esegue l'orologio di sistema alla velocità massima solo quando necessario per soddisfare i requisiti di temporizzazione dei timer ad alta risoluzione. Ad esempio, se un timer ad alta risoluzione è periodico e il relativo periodo si estende su diversi tick di clock di sistema predefiniti, il sistema operativo potrebbe eseguire l'orologio di sistema alla velocità massima solo nella parte del periodo timer che precede immediatamente ogni scadenza. Per il resto del periodo del timer, l'orologio di sistema viene eseguito alla velocità predefinita.
Per evitare un consumo eccessivo di energia, i driver devono evitare di impostare il periodo di un timer ad alta risoluzione a esecuzione prolungata su un valore minore dell'intervallo predefinito tra i tick del clock di sistema. In caso contrario, il sistema operativo viene costretto a eseguire continuamente l'orologio di sistema alla velocità massima.
A partire da Windows 8, un driver può chiamare la routine ExQueryTimerResolution per ottenere l'intervallo di risoluzioni timer supportate dall'orologio di sistema.
Confronto con ExSetTimerResolution
A partire da Windows 2000, un driver può chiamare la routine ExSetTimerResolution per modificare l'intervallo di tempo tra interruzioni successive dell'orologio di sistema. Ad esempio, un driver può chiamare questa routine per modificare l'orologio di sistema dalla frequenza predefinita alla velocità massima per migliorare l'accuratezza del timer. Tuttavia, l'uso di ExSetTimerResolution presenta diversi svantaggi rispetto all'uso di timer ad alta risoluzione creati da ExAllocateTimer.
Prima di tutto, dopo aver chiamato ExSetTimerResolution per aumentare temporaneamente la frequenza di clock di sistema, un driver deve chiamare ExSetTimerResolution una seconda volta per ripristinare la frequenza predefinita dell'orologio di sistema. In caso contrario, il timer dell'orologio di sistema genera continuamente interruzioni alla velocità massima, che potrebbe causare un consumo eccessivo di energia.
In secondo luogo, un driver che usa la routine ExSetTimerResolution non può ottimizzare l'uso temporaneo di frequenze di clock di sistema più elevate, in quanto il sistema operativo funziona per timer ad alta risoluzione. Di conseguenza, l'orologio di sistema impiega più tempo in esecuzione alla velocità massima di quanto sia strettamente necessario.
In terzo luogo, se più driver usano simultaneamente ExSetTimerResolution per migliorare l'accuratezza del timer, l'orologio di sistema potrebbe essere eseguito alla velocità massima per lunghi periodi. Al contrario, il sistema operativo coordina globalmente l'operazione di più timer ad alta risoluzione in modo che l'orologio di sistema venga eseguito alla velocità massima solo quando necessario per soddisfare i requisiti di temporizzazione di questi timer.
Infine, l'uso di ExSetTimerResolution è intrinsecamente meno accurato rispetto all'uso di un timer ad alta risoluzione. Dopo che un driver chiama ExSetTimerResolution per aumentare la frequenza massima dell'orologio di sistema, che in genere è circa un tick per millisecondo, il driver potrebbe chiamare una routine come KeSetTimerEx per impostare il timer. Se, in questa chiamata, il driver specifica una scadenza relativa, il timer può scadere fino a circa un millisecondo precedente o successivo all'ora di scadenza specificata. Tuttavia, se viene specificata una scadenza relativa per un timer ad alta risoluzione, il timer può scadere fino a circa un millisecondo dopo l'ora di scadenza specificata, ma non scade mai in anticipo.