【问题标题】:Why doesn't an infite loop lock an OS?为什么无限循环不锁定操作系统?
【发布时间】:2021-06-13 11:30:25
【问题描述】:

假设你有一个进程运行一些看起来像这样的代码

while (true) {
  //do nothing
}

为什么这不会阻止操作系统?

我知道操作系统有一个进程调度器(例如 Linux 上的 CFS),但这实际上是如何工作的?

如果代码正在执行一个无限循环,进程调度器什么时候有时间执行自己的代码?

难道不需要外部运行来中断正在运行的代码以返回给操作系统吗?如果是这样,像 Linux 这样的操作系统是如何管理的?

CPU 是否具有管理此类用例的内置功能?

【问题讨论】:

  • 来自外围设备(KB、鼠标、磁盘、NIC、USB 等)的硬件中断可能会导致执行切换到驱动程序,这可能会更改正在运行的线程集。来自另一个内核上运行的另一个线程的系统调用也是如此(内核间驱动程序可以中断“无限循环”)。
  • 另外注意,如果就绪线程数不大于内核数,则不需要输入OS调度器代码。在中断/系统调用改变某些东西之前它什么都不做,所以它什么也不做。

标签: multithreading operating-system cpu


【解决方案1】:

首先要了解的是,操作系统始终处于控制之中,并且完全有能力随时中断任何进程。 CPU 还提供硬件支持来实现这一点。

大多数当代操作系统(包括 Linux)调度程序都可以中断正在执行的进程。它通常通过使用定时器中断来完成。它本质上是一个可编程时钟,您可以在其中定义每个时钟滴答时发生的事情。

在Linux中,调度程序的进程抢占可以通过以下步骤定义

  1. CPU 本地定时器中断被调用,中断处理程序开始执行
  2. 现在中断处理程序由 CPU 控制(因此您的无限循环代码处于暂停状态
  3. 中断处理程序检查当前进程是否应该继续执行(检查优先级、时间量等)
  4. 如果进程不能被允许执行,那么它会被抢占并分配一个新进程的 CPU

因此,正如您所见,任何进程都不会 100% 控制系统,操作系统总是有办法停止或终止它。

【讨论】:

  • '它通常通过使用定时器中断'......来自外围设备的所有其他中断呢?如果内核数多于就绪/正在运行的线程怎么办?我对“定时器中断”的回答不满意:(
  • 很抱歉让您不开心,但 Linus Torvalds 是个粗鲁的人,他总是选择以伤害他人感情的方式做事
  • Linus 和 linux 非常乐意让所有 I/O 完成中断导致调度运行,从而可以更改正在运行的线程集而无需任何计时器交互。 Windows 也一样。
【解决方案2】:

从一些研究来看,计算机似乎有一个称为可编程间隔计时器 (PIT) 的硬件计时器,操作系统可以使用它来设置未来的时间,以便在未来几毫秒或几纳秒内造成“中断” .

【讨论】:

  • “可编程中断定时器”是设计用于运行 Microsoft Windows 的计算机系统中的标准术语。每个能够运行抢占式多任务操作系统的计算机系统都必须有一些硬件手段来定期中断正在运行的程序并调用 OS 调度程序,但并不是每个计算机系统都使用这个确切的名称来描述硬件.尤其是在微控制器中,您会发现“定时器/计数器”、“心跳定时器”等名称。
  • @SolomonSlow 不正确。完全可以单独运行具有 I/O 完成的抢占式调度程序,而无需定时器中断。定时器便于系统调用超时,以及在就绪线程多于内核时共享执行,但不是必需的。
【解决方案3】:

在循环的每次迭代期间,程序通常会产生其 CPU 时间,以便内核可能有一个很好的机会来安排一些时间让其他进程执行。然而,这并不是绝对必要的,因为 CPU 完全有能力根据接收到任何硬件中断来暂停程序——即使是处于无限循环中间的程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2023-03-14
    • 2010-11-18
    相关资源
    最近更新 更多