为什么现代抢占式多任务操作系统在 CPU 负载过大时会挂起?

为什么现代抢占式多任务操作系统在 CPU 负载过大时会挂起?

这是一个开放式的问题,有很多可能的答案,但也许我忽略了一件大事。如果没有,也许这个问题应该是社区维基。


我使用其他操作系统的次数不多,因此无法判断,但可以肯定的是,当应用程序占用大量 CPU 时,所有版本的 Windows 操作系统都会变得运行缓慢。早期版本使用协作式多任务处理时,这种情况是可以理解的。

然而,在抢占式多任务处理中,操作系统是否应该将自身及其 GUI 置于更高的优先级,以便在用户应用程序处于要求CPU 完全利用?毕竟,操作系统不会放弃任何时间片。在大多数情况下,我并不关心需要几分钟 CPU 时间的应用程序延迟几微秒,以便 OS GUI 能够响应输入。

有时将高 CPU 进程设置为较低优先级会有所帮助,可能是因为这样可以让与我交互的其他低 CPU 应用程序响应更快,从而带来更灵敏的整体体验。或者应用程序的优先级真的会影响它与操作系统进程的交互方式吗?

当我有足够的物理内存可用且硬盘使用量不大时,我多次看到这种情况发生。看来 CPU 使用率是操作系统出现问题时的主要一致因素。

反例:通常当一个系统几乎完全挂起后,鼠标仍然有响应。因此,操作系统确实保护了这部分自身免受​​某些问题的影响。具体如何保护又是另一个问题,我只是举个例子。

答案1

真正导致“现代多任务操作系统”真正挂起的唯一因素是:

  1. 硬件故障
  2. CPU 卡在设备驱动程序中(由于 1 或错误的编程)
  3. 设备驱动程序或其他内核代码中的致命异常(由于 1 或错误的编程)

多任务操作系统中的操作系统总是会在时间片结束时切断任务。但是,如果程序被设计为响应用户输入,但在时间片内没有响应,那么问题就出在程序上

更可能是 shell 没有响应。在 Windows 中,这是explorer.exe。您可以尝试以下操作:

  • 备用 Windows shell(Litestep 等)
  • 通过 终止所有 explorer.exe taskmgr.exe,然后启动cmd.exe并通过命令行执行操作。或者启动一个用于启动其他程序的较小程序。

explorer.exe是那些高度组件化的 Windows 程序之一,很多东西都可以挂载到其中。那么看看没有它的情况会怎样。

答案2

尝试 Linux。如果您实际编译了内核,则可以指定时间片。此外,您实际上可以看到抢占的效果。如果您正在构建一个(可能)无需担心 UI 的服务器(但它仍然是抢占式多任务操作系统),则 1000us 时间片更好。另一方面,100us 将导致系统响应极其灵敏。大多数发行版的桌面操作系统都有 100us,这意味着即使我的 CPU 在所有核心上的使用率达到 100%,我的 UI 仍然响应迅速(您可以实际尝试一下)。

答案3

就 Windows 而言,Windows 7 在处理这类问题时比 XP 做得好得多,因此我不同意您所说的“所有版本的 Windows”。但即使是 XP,当您使用客户端版本的操作系统时,Windows 也会为前台应用程序提供一些额外的优先级(默认情况下)。但无论哪个操作系统版本,如果多个进程都卡在等待同一个共享资源(可能是 I/O),那么它们都会以无响应的方式运行。

另一种看待这个问题的方式是,如果 explorer.exe 忙于等待共享资源(包括 CPU 时间),则桌面/窗口管理器本身将表现得无响应。对于任何直接或间接等待 explorer.exe 释放的应用程序也是如此。

答案4

具体来说,Windows 运行缓慢。我发现最常见的原因之一是多个进程使用了​​足够的虚拟内存,从而开始强制进行大量交换。可能“看起来”没有大量磁盘活动,但通常确实存在。

这很容易证明,并且可以通过简单地选择一些小进程(如记事本)并“干净”和“耐心”地结束它们来摆脱这种堵塞。这开始减少堵塞高速公路的影响。然后你关闭一个占用大量内存的进程,一切都会恢复到可用状态。观察这段时间的磁盘活动通常表明几乎没有发生什么。

为什么我建议先关闭较小的应用程序?通过先删除较小的应用程序,您可以释放虚拟内存,同时尽量减少磁盘活动,并快速疏通机器。如果您尝试关闭大型应用程序,例如 Firefox 或 Chrome,它们的关闭时间都会延长。这是因为大多数最后的应用程序都有后台进程,这些进程不会消失很长时间,因为后台进程也会卡在交换文件的页面中。更糟糕的是,它们的优先级也较低,它们需要更长的时间才能完成任务,并且应用程序请求的全部虚拟内存量必须等到所有后台进程和线程都完成后才能释放。

我从经验中注意到的另一件事是,在快速干净地关闭方面,浏览器是最差的之一。甚至办公应用程序关闭得更干净、更快。

相关内容