我正在寻找一个粗略的值来比较 Windows 和 Linux 之间的上下文切换(假设相同的硬件和类似的负载)。我发现 Windows 的时间片长度范围似乎比 Linux 要小(10-120 毫秒 vs. 10-200 毫秒),但这些信息并不具有权威性。
答案1
我不知道从您尝试执行的操作中可以收集到什么有用的信息,但您可以通过标准 Win32 API 更改 Windows 计算机上的时钟分辨率。系统上需要更高响应时间的不同应用程序(例如多媒体应用程序)始终会这样做。时钟分辨率可能在 0.5ms 到 15.6ms 甚至更高之间。因此,请让您的两台机器具有相同的时钟分辨率。
Windows 7 默认配置为让线程运行 2 个时钟间隔,然后再做出另一个调度决策。(即,我是否切换上下文?)Server 2008 R2 默认将线程调度决策之间的间隔设置为 12 个时钟间隔(也称为线程量子)。这个想法是,线程量子越长,服务器操作系统就越有可能启动和完成客户端请求而不会被中断。(即,上下文切换更少。)但在 Windows 的服务器版本上,您不会获得“敏捷”的桌面体验。(一般来说,没人关心这一点。)
以下是使用我的 Win7 PC 的示例。Google Chrome 实际上要求将系统范围的时钟分辨率降低至 1ms。您可以使用 Sysinternals 中的 clockres.exe 查看当前和基本时钟分辨率,并使用 powercfg.exe 查看哪些应用程序一直在更改您的时钟分辨率。
我的 CPU 每秒完成 3,501,000,000 个周期(3.5GHz),并且计时器每 0.001 秒触发一次。3501000000 * 0.001 = 每个时钟间隔 3501000 个 CPU 周期。
1 量子单位 = 1/3(三分之一)时钟间隔,因此 1 量子单位 = 1167000 CPU 周期。
假设在 3.501GHz 的速率下,每个 CPU 周期为 286 皮秒,那么每个量子单位为 333.8 微秒。由于我的 PC 配置了 2 个时钟间隔的线程量子,每个时钟间隔为 3 个量子单位,这意味着我的 PC 大约每 2 毫秒就会做出一次线程调度决策。
我们甚至不必讨论可变长度的线程量程或抢占式调度程序(线程在被另一个优先级更高的线程抢占之前无法完成其量程)。
因此,您想要比较在运行完全不同代码集的两个不同操作系统上进行上下文切换的实验对我来说仍然没有意义,但也许这会有所帮助,至少在 Windows 方面。