タイマー精度

通常、システム タイマー ルーチンを使用すると、呼び出し元はタイマーの絶対的または相対的な有効期限を指定できます。 たとえば、KeWaitForSingleObjectKeSetTimer、または KeDelayExecutionThread を参照してください。 オペレーティング システムが有効期限を測定できる精度は、システム クロックの粒度によって制限されます。

システム時刻はシステム クロックのすべてのティックで更新され、最新のティックに対してのみ正確です。 呼び出し元が絶対的な有効期限を指定した場合、タイマーの有効期限は、指定した時刻より後に発生する最初のシステム クロックのティックの処理中に検出されます。 したがって、タイマーは、指定された絶対的な有効期限よりも後の 1 つのシステム クロック期間だけ期限切れになる可能性があります。 タイマー間隔 (相対的な有効期限) が代わりに指定されている場合、この間隔の開始時刻と終了時刻がシステム クロックのティック間の正確な位置に応じて、指定した時刻より前または後の期間まで有効期限が発生する可能性があります。 絶対的な時間と相対的な時間のどちらを指定しても、システム クロックの割り込み処理が他のデバイスの割り込み処理によって遅延した場合でも、タイマーの有効期限が検出されない場合があります。

呼び出し元が相対的な有効期限を指定すると、タイマー ルーチンは、現在のシステム クロック時間を指定された相対的な有効期限に追加して、タイマーに使用する絶対的な有効期限を計算します。 システム時刻はシステム クロックの最新のティックに対してのみ正確であるため、計算される有効期限は、呼び出し元が予想する有効期限よりも前のシステム クロック期間までとすることができます。 指定された相対的な有効期限がシステム クロック期間に近いか、またはそれより短い場合、タイマーは遅延なしですぐに期限切れになる可能性があります。

より短い有効期限をより正確にサポートする方法として、システム クロックのティック間の時間を短縮することが考えられますが、これにより消費電力が増加する可能性があります。 さらに、プラットフォーム内の他のデバイスの割り込み処理がシステム クロック割り込みの処理を遅らせないことを保証できない限り、システム クロック期間を短縮しても、システム クロックの細分性が確実に向上しない可能性があります。

Windows 8 以降では、KeDelayExecutionThread は、呼び出し元が指定した相対的な有効期限から絶対的な有効期限を計算するために、より正確な手法を使用できます。 まず、現在のシステム時間のより正確な推定を取得するために、ルーチンはシステム パフォーマンス カウンターを使用して、最後のシステム クロックのティックからの経過時間を測定します。 次にルーチンは、相対的な有効期限にこのシステム時間のより正確な推定を追加して、絶対的な有効期限を計算します。 この手法によって計算される絶対的な有効期限は、マイクロ秒単位で正確です。 その結果、タイマーは、指定された相対的な有効期限が経過する前に期限切れになりません。 タイマーは、指定された時刻より後のシステム クロック期間まで期限切れになる可能性があり、他のデバイスの割り込み処理によってシステム クロック割り込みの処理が遅延した場合でも、後で期限切れになる可能性があります。

タイマーの有効期限が切れる前にシステム時刻が変更された場合、相対的なタイマーは影響を受けませんが、システムは各絶対的なタイマーを調整します。 相対的なタイマーは、システムの絶対的な時間に関係なく、指定された時間単位数が経過すると常に期限切れになります。 絶対的なタイマーは特定のシステム時刻に期限切れになるため、システム時間の変更によって絶対的なタイマーの待機時間が変化します。