Akurasi Timer

Rutinitas timer sistem biasanya memungkinkan pemanggil untuk menentukan waktu kedaluwarsa absolut atau relatif untuk timer. Misalnya, lihat KeWaitForSingleObject, KeSetTimer, atau KeDelayExecutionThread. Akurasi saat sistem operasi dapat mengukur waktu kedaluwarsa dibatasi oleh granularitas jam sistem.

Waktu sistem diperbarui pada setiap tick jam sistem, dan hanya akurat untuk tick terbaru. Jika penelepon menentukan waktu kedaluwarsa absolut, kedaluwarsa timer terdeteksi selama pemrosesan tick jam sistem pertama yang terjadi setelah waktu yang ditentukan. Dengan demikian, timer dapat kedaluwarsa sebanyak satu periode jam sistem lebih lambat dari waktu kedaluwarsa absolut yang ditentukan. Jika interval timer, atau waktu kedaluwarsa relatif, ditentukan sebagai gantinya, kedaluwarsa dapat terjadi hingga periode yang lebih awal dari atau periode yang lebih lambat dari waktu yang ditentukan, tergantung pada di mana waktu mulai dan akhir interval ini berada di antara tanda centang jam sistem. Terlepas dari apakah waktu absolut atau relatif ditentukan, kedaluwarsa timer mungkin tidak terdeteksi sampai bahkan nanti jika pemrosesan interupsi untuk jam sistem tertunda oleh pemrosesan interupsi untuk perangkat lain.

Ketika penelepon menentukan waktu kedaluwarsa relatif, rutinitas timer menambahkan waktu jam sistem saat ini ke waktu kedaluwarsa relatif yang ditentukan untuk menghitung waktu kedaluwarsa absolut yang akan digunakan untuk timer. Karena waktu sistem akurat hanya untuk tick terbaru jam sistem, waktu kedaluwarsa yang dihitung dapat mencapai periode jam sistem yang lebih awal dari waktu kedaluwarsa yang diharapkan oleh pemanggil. Jika waktu kedaluwarsa relatif yang ditentukan mendekati atau lebih kecil dari periode jam sistem, timer mungkin segera kedaluwarsa, tanpa penundaan.

Cara yang mungkin untuk lebih akurat mendukung waktu kedaluwarsa yang lebih singkat adalah dengan mengurangi waktu antara jam sistem, tetapi melakukannya kemungkinan akan meningkatkan konsumsi daya. Selain itu, mengurangi periode jam sistem mungkin tidak dapat mencapai granularitas jam sistem yang lebih halus kecuali pemrosesan interupsi untuk perangkat lain dalam platform dapat dijamin tidak menunda pemrosesan interupsi jam sistem.

Dimulai dengan Windows 8, KeDelayExecutionThread menggunakan teknik yang lebih tepat untuk menghitung waktu kedaluwarsa absolut dari waktu kedaluwarsa relatif yang ditentukan pemanggil. Pertama, untuk mendapatkan perkiraan yang lebih tepat dari waktu sistem saat ini, rutinitas menggunakan penghitung kinerja sistem untuk mengukur waktu yang berlalu sejak jam sistem terakhir. Selanjutnya, rutinitas menambahkan perkiraan waktu sistem yang lebih tepat ini ke waktu kedaluwarsa relatif untuk menghitung waktu kedaluwarsa absolut. Waktu kedaluwarsa absolut yang dihitung dengan teknik ini akurat untuk dalam mikrosekon. Akibatnya, timer tidak akan kedaluwarsa sebelum waktu kedaluwarsa relatif yang ditentukan berlalu. Timer masih dapat kedaluwarsa hingga periode jam sistem lebih lambat dari waktu yang ditentukan, dan mungkin kedaluwarsa bahkan nanti jika pemrosesan interupsi jam sistem tertunda oleh pemrosesan interupsi untuk perangkat lain.

Jika waktu sistem berubah sebelum timer kedaluwarsa, timer relatif tidak terpengaruh tetapi sistem menyesuaikan setiap timer absolut. Timer relatif selalu kedaluwarsa setelah jumlah unit waktu yang ditentukan berlalu, terlepas dari waktu sistem absolut. Timer absolut kedaluwarsa pada waktu sistem tertentu, sehingga perubahan waktu sistem mengubah durasi tunggu timer absolut.