Windows 计时器分辨率与应用程序优先级与处理器调度

Windows Timer Resolution vs Application Priority vs Processor scheduling

请再次说明 MS Windows 系统这三件事之间的技术差异。首先是 Timer Resolution,您可以通过 ntdll.dll 非导出函数 NtSetTimerResolutionNtQueryTimerResolution 设置和获取,或者使用 Sysinternals 的 clockres.exe 工具。

前段时间 Chrome 浏览器为了在整个网络上表现更好而使用的可耻技巧之一。 (他们目前只为 Flash 插件留下了高分辨率技巧)。 https://bugs.chromium.org/p/chromium/issues/detail?id=153139 https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

事实上 Visual Studio 和 SQL 服务器在某些情况下也可以做到这一点。我个人觉得它能更好、更清晰地执行整个系统,而不是像很多人警告的那样变慢。

定时器分辨率和应用程序有什么区别 I/O 和内存优先级 (realtime/high/above normal/normal/low/background/etc.) 你可以通过任务管理器设置,除了定时器分辨率设置整个系统,而不是单个应用程序?

它们与 Processor scheduling 选项有什么区别,您可以从 CMD > SystemPropertiesPerformance.exe -> 高级选项卡进行调整。默认情况下,用户的 OS 版本(如 XP/Vista/7/8/8.1/10)设置程序的性能,服务器的版本(2k3/2k8/2k12/2k16)负责后台服务。此选项如何与上述两个选项交互?

timeBeginPeriod() 是执行此操作的记录 api。据记载,它会影响 Sleep() 的准确性。 Dave Cutler 可能不喜欢实现它,但允许 Win 3.1 代码移植是必要的。那时的多媒体 api 是必要的,以保持带有小缓冲区的贫血硬件不间断地运行。

很粗糙,但是内核中没有其他好的方法。处理器核心的正常状态是在 HLT 指令上停止。消耗(几乎)没有功率,恢复它的唯一方法是硬件中断。这就是它的作用,它提高了时钟中断率。通常每秒滴答 64 次,您可以使用 timeBeginPeriod 将其增加到 1000 次,使用原生 api.

增加到 2000 次

是的,对功耗来说非常糟糕。时钟中断处理程序还激活线程调度程序,这是一段相当简单的代码。 Sleep() 调用现在可以(几乎)以时钟中断速率唤醒的原因。顺便说一句,在 Win8.1 中进行了修补,我唯一注意到的变化是它不再那么灵敏了,1 毫秒的速率可能导致多达 2 毫秒的延迟。

Chrome 确实因为 ab/using 而臭名昭著。我一直认为它为一家在移动操作系统和电池供电设备方面做大生意的公司提供了竞争优势。创建此网站的人 noticed something was wrong。对浏览器来说更负责任的事情是将速率提高到 10 毫秒,这是获得准确的 GIF 动画所必需的。多媒体播放不需要了

这对调度优​​先级没有任何影响。我没有检查的一个细节是线程量程是否相应变化(一个线程在被逐出之前可能拥有一个核心的滴答数,对于工作站为 3)。我怀疑是的。