Timer High-Resolution

Dimulai dengan Windows 8.1, driver dapat menggunakan rutinitas ExXxxTimer untuk mengelola timer resolusi tinggi. Akurasi timer resolusi tinggi hanya dibatasi oleh resolusi maksimum jam sistem yang didukung. Sebaliknya, timer yang terbatas pada resolusi jam sistem default secara signifikan kurang akurat.

Namun, timer resolusi tinggi memerlukan interupsi jam sistem—setidaknya, sementara—terjadi pada tingkat yang lebih tinggi, yang cenderung meningkatkan konsumsi daya. Dengan demikian, driver harus menggunakan timer resolusi tinggi hanya ketika akurasi timer sangat penting, dan menggunakan timer resolusi default dalam semua kasus lainnya.

Untuk membuat timer resolusi tinggi, driver WDM memanggil rutinitas ExAllocateTimer dan mengatur bendera EX_TIMER_HIGH_RESOLUTION di parameter Atribut . Ketika driver memanggil rutinitas ExSetTimer untuk mengatur timer resolusi tinggi, sistem operasi meningkatkan resolusi jam sistem, seperlunya, sehingga waktu kedaluwarsa lebih tepat sesuai dengan waktu kedaluwarsa nominal yang ditentukan dalam parameter DueTime dan Period .

Driver Kernel-Mode Driver Framework (KMDF) dapat memanggil metode WdfTimerCreate untuk membuat timer resolusi tinggi. Dalam panggilan ini, driver meneruskan pointer ke struktur WDF_TIMER_CONFIG sebagai parameter. Untuk membuat timer resolusi tinggi, driver mengatur anggota UseHighResolutionTimer dari struktur ini ke TRUE. Anggota ini adalah bagian dari struktur yang dimulai dengan Windows 8.1 dan KMDF versi 1.13.

Mengontrol akurasi timer

Misalnya, untuk Windows yang berjalan pada prosesor x86, interval default antara jam sistem biasanya sekitar 15 milidetik, dan interval minimum antara jam sistem berdetik sekitar 1 milidetik. Dengan demikian, waktu kedaluwarsa timer resolusi default (yang dibuat ExAllocateTimer jika bendera EX_TIMER_HIGH_RESOLUTION tidak diatur) hanya dapat dikontrol dalam waktu sekitar 15 milidetik, tetapi waktu kedaluwarsa timer resolusi tinggi dapat dikontrol dalam milidetik.

Jika driver menentukan waktu kedaluwarsa relatif untuk timer resolusi default, timer dapat kedaluwarsa hingga sekitar 15 milidetik lebih awal atau lebih baru dari waktu kedaluwarsa yang ditentukan. Jika driver menentukan waktu kedaluwarsa relatif untuk timer resolusi tinggi, timer dapat kedaluwarsa hingga sekitar milidetik setelah waktu kedaluwarsa yang ditentukan tetapi tidak pernah kedaluwarsa lebih awal. Untuk informasi selengkapnya tentang hubungan antara resolusi jam sistem dan akurasi timer, lihat Akurasi Timer.

Jika tidak ada timer resolusi tinggi yang diatur, sistem operasi biasanya menjalankan jam sistem pada tingkat defaultnya. Namun, jika satu atau beberapa timer resolusi tinggi diatur, sistem operasi mungkin perlu menjalankan jam sistem pada tingkat maksimumnya untuk setidaknya sebagian waktu sebelum timer ini kedaluwarsa.

Untuk menghindari peningkatan konsumsi daya yang tidak perlu, sistem operasi menjalankan jam sistem pada tingkat maksimumnya hanya jika diperlukan untuk memenuhi persyaratan waktu timer resolusi tinggi. Misalnya, jika timer resolusi tinggi berkala, dan periodenya mencakup beberapa tick jam sistem default, sistem operasi mungkin menjalankan jam sistem pada tingkat maksimumnya hanya di bagian periode timer yang segera mendahului setiap kedaluwarsa. Untuk sisa periode timer, jam sistem berjalan pada tingkat defaultnya.

Untuk mencegah konsumsi daya yang berlebihan, driver harus menghindari pengaturan periode timer resolusi tinggi yang berjalan lama ke nilai yang kurang dari interval default antara jam sistem. Jika tidak, sistem operasi dipaksa untuk terus menjalankan jam sistem pada tingkat maksimumnya.

Dimulai dengan Windows 8, driver dapat memanggil rutinitas ExQueryTimerResolution untuk mendapatkan rentang resolusi timer yang didukung oleh jam sistem.

Perbandingan dengan ExSetTimerResolution

Dimulai dengan Windows 2000, driver dapat memanggil rutinitas ExSetTimerResolution untuk mengubah interval waktu antara interupsi jam sistem berturut-turut. Misalnya, driver dapat memanggil rutinitas ini untuk mengubah jam sistem dari tarif defaultnya ke tingkat maksimumnya untuk meningkatkan akurasi timer. Namun, menggunakan ExSetTimerResolution memiliki beberapa kelemahan dibandingkan dengan menggunakan timer resolusi tinggi yang dibuat oleh ExAllocateTimer.

Pertama, setelah memanggil ExSetTimerResolution untuk meningkatkan laju jam sistem untuk sementara waktu, driver harus memanggil ExSetTimerResolution untuk kedua kalinya untuk memulihkan jam sistem ke tingkat defaultnya. Jika tidak, timer jam sistem terus menghasilkan gangguan pada tingkat maksimum, yang dapat menyebabkan konsumsi daya yang berlebihan.

Kedua, driver yang menggunakan rutinitas ExSetTimerResolution tidak dapat mengoptimalkan penggunaan sementara laju jam sistem yang lebih tinggi secara efektif seperti yang dilakukan sistem operasi untuk timer resolusi tinggi. Dengan demikian, jam sistem menghabiskan lebih banyak waktu berjalan pada tingkat maksimum daripada yang benar-benar diperlukan.

Ketiga, jika beberapa driver secara bersamaan menggunakan ExSetTimerResolution untuk meningkatkan akurasi timer, jam sistem mungkin berjalan pada tingkat maksimumnya untuk waktu yang lama. Sebaliknya, sistem operasi secara global mengoordinasikan pengoperasian beberapa timer resolusi tinggi sehingga jam sistem berjalan pada tingkat maksimum hanya jika perlu untuk memenuhi persyaratan waktu timer ini.

Terakhir, menggunakan ExSetTimerResolution secara inheren kurang akurat daripada menggunakan timer resolusi tinggi. Setelah driver memanggil ExSetTimerResolution untuk meningkatkan jam sistem ke tingkat maksimumnya, yang biasanya tentang tanda centang per milidetik, driver mungkin memanggil rutinitas seperti KeSetTimerEx untuk mengatur timer. Jika, dalam panggilan ini, driver menentukan waktu kedaluwarsa relatif, timer dapat kedaluwarsa hingga sekitar milidetik lebih awal dari atau lebih lambat dari waktu kedaluwarsa yang ditentukan. Namun, jika waktu kedaluwarsa relatif ditentukan untuk timer resolusi tinggi, timer dapat kedaluwarsa hingga sekitar milidetik lebih lambat dari waktu kedaluwarsa yang ditentukan tetapi tidak pernah kedaluwarsa lebih awal.