Accuratezza timer

Una routine timer di sistema consente in genere al chiamante di specificare un'ora di scadenza assoluta o relativa per un timer. Ad esempio, vedere KeWaitForSingleObject, KeSetTimer o KeDelayExecutionThread. L'accuratezza con cui il sistema operativo può misurare i tempi di scadenza è limitata dalla granularità dell'orologio di sistema.

L'ora di sistema viene aggiornata su ogni segno di spunta dell'orologio di sistema ed è accurata solo per il segno di spunta più recente. Se il chiamante specifica un'ora di scadenza assoluta, la scadenza del timer viene rilevata durante l'elaborazione del primo controllo dell'orologio di sistema che si verifica dopo l'ora specificata. Pertanto, il timer può scadere fino a un periodo di orologio di sistema più avanti rispetto all'ora di scadenza assoluta specificata. Se invece viene specificato un intervallo timer o una scadenza relativa, la scadenza può verificarsi fino a un periodo precedente o un periodo più avanti rispetto all'ora specificata, a seconda della posizione in cui esattamente l'inizio e l'ora di fine di questo intervallo rientrano tra i tick dell'orologio di sistema. Indipendentemente dal fatto che venga specificato un tempo assoluto o relativo, la scadenza del timer potrebbe non essere rilevata fino a un secondo momento se l'elaborazione dell'interruzione per l'orologio di sistema viene ritardata dall'elaborazione di interruzioni per altri dispositivi.

Quando il chiamante specifica una scadenza relativa, la routine timer aggiunge l'ora dell'orologio di sistema corrente all'ora di scadenza relativa specificata per calcolare l'ora di scadenza assoluta da usare per il timer. Poiché l'ora di sistema è accurata solo per il segno di spunta più recente dell'orologio di sistema, l'ora di scadenza calcolata può essere fino a un periodo di orologio di sistema precedente all'ora di scadenza prevista dal chiamante. Se un'ora di scadenza relativa specificata è vicina o inferiore al periodo di orologio di sistema, il timer potrebbe scadere immediatamente, senza ritardo.

Un modo possibile per supportare in modo più accurato i tempi di scadenza più brevi consiste nel ridurre il tempo tra i tick dell'orologio di sistema, ma è probabile che questo aumenti il consumo di energia. Inoltre, la riduzione del periodo di orologio di sistema potrebbe non ottenere in modo affidabile una granularità dell'orologio di sistema più fine, a meno che non sia possibile interrompere l'elaborazione degli altri dispositivi nella piattaforma non ritardare l'elaborazione degli interruzioni dell'orologio di sistema.

A partire da Windows 8, KeDelayExecutionThread usa una tecnica più precisa per calcolare l'ora di scadenza assoluta da un chiamante specificato per la scadenza relativa. Prima di tutto, per ottenere una stima più precisa dell'ora di sistema corrente, la routine usa il contatore delle prestazioni del sistema per misurare il tempo trascorso dall'ultimo segno di orologio del sistema. Successivamente, la routine aggiunge questa stima più precisa dell'ora di sistema all'ora di scadenza relativa per calcolare l'ora di scadenza assoluta. L'ora di scadenza assoluta calcolata da questa tecnica è accurata all'interno di un microsecondo. Di conseguenza, il timer non scade prima dell'intervallo di scadenza relativo specificato. Il timer può comunque scadere fino a un periodo di orologio di sistema più tardi dell'ora specificata e potrebbe scadere anche in un secondo momento se l'elaborazione dell'interruzione dell'orologio di sistema viene ritardata dall'elaborazione per altri dispositivi.

Se l'ora di sistema cambia prima della scadenza di un timer, un timer relativo non è interessato, ma il sistema regola ogni timer assoluto. Un timer relativo scade sempre dopo il numero specificato di unità temporali trascorse, indipendentemente dal tempo di sistema assoluto. Un timer assoluto scade in un momento di sistema specifico, quindi una modifica nell'ora di sistema modifica la durata di attesa di un timer assoluto.