Windows内核提高KeSetTimer、KeWaitForSignelObject定时精度方法
2022-08-26
159
0
KeSetTimer定时精度是因为windows系统的时钟分辨率仅为15ms,由于播放软件只是一个应用程序,十分依赖它的运行环境—操作系统。因此不得不提及Windows操作系统的时间片和时钟分辨率。
软件经常使用的API函数GetTickCount () 返回自系统启动以来的ms数,由于系统分辨率的限制,那么返回的只能是15.625ms的整数倍,这就是操作系统的时钟分辨率的概念。操作系统的时钟分辨率直接对操作系统提供的线程相关API有影响,例如在播控软件代码里调用的函数event.Lock(TIMECLIP);其实质是调用了系统API函数WaitForSingleObject();虽然TIMECLIP是6即希望锁定线程6ms但是由于XP的时钟分辨率是15.625ms,所以上述语句实际是锁定线程15.625ms,通过在这条语句前后加测量可证实这一点。
通过使用微软的一个测试工具ClockRes(用来测试操作系统的时钟分辨率的工具)在多核机器上分别测试了WindowXP,Window2003Server,和Windows7,测试结果如下表:
C:\Users\Administrator>C:\Users\ADMINI~1\AppData\Local\Temp\Rar$DRa0.170\Clockres64.exe
Clockres v2.1 - Clock resolution display utility
Copyright (C) 2016 Mark Russinovich
Sysinternals
Maximum timer interval: 15.625 ms
Minimum timer interval: 0.500 ms
Current timer interval: 1.003 ms
- https://blog.51cto.com/u_12888197/2496303
http://www.javashuo.com/link?url=https://download.sysinternals.com/files/ClockRes.zip
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ddi/wdm/nf-wdm-exallocatetimer
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/high-resolution-timers
-https://zgserver.com/1-6.html