| 要点 |
|---|
| 操作系统掌控一切。 |
| 多核系统能够缓解许多在单处理器系统中影响关键时序的障碍。 |
有时,操作系统会从其他程序中夺走处理时间。即使另一个程序正在读取微秒级精度的时钟,其精度也取决于计算机处理器实际能够自由读取时钟的准确度。例如,假设某个软件应用程序试图连续读取一个硬件晶振时钟,该时钟精确地每毫秒更新一次。如果该应用程序连续读取时钟10秒(10,000毫秒),那么你会预期该应用程序观察到从时钟读取的值恰好变化10,000次,且连续读取之间报告的时间差为0或1毫秒。然而,如果这样的测试应用程序在现代操作系统上运行,该应用程序通常会观察到,连续读取时钟之间的差值偶尔显著大于1毫秒。假设硬件晶振时钟本身是独立的且持续运行,这些结果只能解释为应用程序在执行过程中暂停了时钟读取。当操作系统暂停正在读取时钟的软件应用程序时,晶振时钟本身继续运行,而这些个别的时钟滴答被暂停的软件应用程序“遗漏”。我们将软件遗漏这些个别时钟滴答读取的次数百分比称为“遗漏滴答率(miss tick rate)”。两次连续读取时钟之间经过的最大时间量称为“最大遗漏滴答时长(maximum miss tick duration)”。
现代多任务操作系统(例如 Windows、Mac OS、Unix)不允许任何进程独占且持续执行,因为操作系统必须占用周期来执行关键功能(例如虚拟内存管理)。在常见桌面操作系统上运行的任何程序都无法在每一毫秒都提供准确的测量。换句话说,你无法获得0%的遗漏滴答率。例如,Windows 会不加区分地将程序的某些部分从内存中移除,以测试程序是否真的需要它们,从而减少应用程序的工作内存集。这一操作及其他类似操作会产生随机的时序延迟1。
让我们考虑另一个例子:一个旋转棋盘格程序。我们在 E-Prime 中实现了这个实验,但没有正确使用 E-Prime 的时序功能。下图1展示了两组此类运行的测量时间。200毫秒处的粗线表示预期时间。Session 1(实线)和 Session 2(虚线)的中位显示时间为236毫秒,不规则峰值高达374毫秒。此外,显示似乎耗时约240毫秒,最长显示耗时超过370毫秒。除了平均时序误差外,当多次运行该程序时,这些长暂停发生在不同的时间。

什么可以解释这些结果?任务规格很明确:每个显示呈现200毫秒,但显然这并没有发生。相反,结果说明了三个明显的问题。首先,中位时长比预期长约36毫秒。其次,存在严重的峰值,表明实验中出现长时间的无意暂停。第三,峰值发生在随机时间。
第一个问题,即中位时长比指定持续时间长,主要受刺激准备所需时间的影响,这将在下一节中详细说明。
图1时序数据中的第二和第三个故障与时序持续时间中的峰值有关。为什么有些延迟非常长,为什么它们以随机间隔发生,即使在完全相同的条件下运行也会变化?这些峰值是由于 Windows 操作系统接管机器并暂停程序以执行各种管理和/或“清理”活动造成的。操作系统将接管并暂停程序,且没有任何提示(除了程序暂时无响应)。程序暂停一段时间,从几毫秒到数百毫秒不等,而操作系统执行诸如管理虚拟内存等操作(即,计算机内存的部分被存储或从磁盘重新加载,以提供更大的有效地址空间)。
这些操作几乎可以在任何时候发生2。该操作看起来是随机的,因为操作系统何时采取行动取决于自操作系统启动以来,甚至可能是自安装以来发生的所有其他事件。例如,如果你读取一个大型文字处理文档,你所拥有的大部分“真实”内存都会被用完。现在你开始运行实验程序,程序开始读取图像文件。也许内存中有空间容纳前十四张图像,它们加载得很快(100毫秒),因为操作系统仍有内存空间来存储它们。然而,在第十五张图像时,操作系统在内存中没有新的空间来存储该图像。操作系统随后决定将文字处理文档的某些部分保存到磁盘以腾出空间。因为这是操作系统的管理例程决定腾出更多空间,所以这比程序具有更高的优先级,结果程序被暂停。
操作系统获取空间并扫描系统以执行各种内务管理操作的过程可能需要数十到数百毫秒。在此期间,程序被暂停。程序会再次正常读取图像一段时间,然后可能再次暂停。在图1所示的例子中,Session 2 的 Image 54 处出现峰值。
非常重要的一点是,操作系统掌控着你的计算机,而不是你。你不是向操作系统发出命令;你只是发出请求。你可以请求操作系统执行某些操作,但有时它会延迟你的任务以执行它认为关键的功能。操作系统通常每秒暂停正在执行的程序数十次,而不会记录幕后的时序变化。
关于多核和多处理器系统的说明
我们的测试表明,当在具有多个核心的处理器上运行时,由操作系统处理其他程序引起的许多时序问题显著减少。例如,附录A报告了当我们在两种不同的多核 CPU 系统上测试 E-Prime 时,遗漏时钟读取率为0%,但在单处理器机器上运行相同测试时,遗漏滴答率约为10%。尽管如此,与操作系统相关的时序错误无法完全消除,TIMING:操作系统解决方案 [22856] 中描述的 E-Prime 解决方案仍应应用于多处理器系统。
参见:
- TIMING:在 Windows 11 笔记本电脑上运行可能对时序产生负面影响 [42409]
- ERROR:在 Windows 10 或 Windows 11 上运行多显示器实验时冻结或收到显示太忙错误(错误 11102)[35180]
- ERROR:在 Windows 10(1903 和 1909)上运行实验时冻结或收到显示太忙错误(错误 11102)[30679]
1 Windows NT 虚拟内存管理器文档指出:工作集管理器(操作系统的一部分)通过从进程中窃取有效内存页来定期测试配额……此过程对系统中的所有进程不加区分地执行。Kath, R. (1992, December 12) The Virtual-Memory Manager in Windows NT, Microsoft Developer Network Technology Group, 12.
2 来自你的程序或任何其他程序的请求都可能触发操作系统操作。随着虚拟内存映射到磁盘,你的程序和你读取的任何文件甚至可能不在内存中。当你需要程序的部分内容时,它们会被加载进来(例如,你呈现来自不同条件的刺激)。在实验的第一个区块中,你可能会看到更多延迟,因为操作系统在需要时加载程序的部分内容,并继续清理之前运行的程序。
![]()