【问题标题】:How are hardware interruptions handled in non-preemtive scheduling?非抢占式调度如何处理硬件中断?
【发布时间】:2020-09-16 01:34:42
【问题描述】:

假设我有一个当前正在运行的进程 A。然后我按Ctrl+C,这个中断怎么处理?

A是先执行完再处理中断吗?

A 是否进入就绪队列?

【问题讨论】:

  • 你的意思是 Crtl+Z/C 吗?
  • 是的,对不起!我的意思是 Ctrl+C。
  • 非抢占式调度?是否有任何操作系统仍然坚持这样的设计?

标签: linux asynchronous process linux-kernel operating-system


【解决方案1】:

您混淆了中断、信号和任务调度。这些都是非常不同的概念。

我按Ctrl+C,这个中断是怎么处理的?

CTRL+C 与中断无关。这是一个被终端仿真器截获的组合键,然后向当前运行的进程发送一个信号 (SIGINT)。信号传递是通过kill 系统调用完成的(与其名称相反,它不一定会终止进程)。

A是先执行完再处理中断吗?

当您的程序收到SIGINT 信号时会发生什么取决于具体情况。程序可以注册一个信号处理程序,并决定在收到特定信号时要做什么。换句话说,你所说的这种“中断”发生在进程正在运行时:当信号被传递时,内核将暂时“暂停”正常的进程代码,让进程运行它的信号处理程序,然后从它离开的地方恢复进程。

进程只能为可捕获的信号注册处理程序(SIGINT 是)。在 Linux 中唯一无法捕获的两个信号是 SIGKILLSIGSTOP。如果进程没有注册信号处理程序,内核定义的默认处理程序将完成其工作:对于SIGINT,默认处理程序只是终止进程。

See man 7 signal 了解更多信息。

A 是否进入就绪队列?

没有“就绪队列”之类的东西,我想你的意思是runqueue。如果进程被信号杀死,那么它将不复存在并从其运行队列中移除,因此不再有运行队列有 A。

如果进程没有终止,它仍然存在于系统中,内核将继续执行它以及其他在同一 CPU 上执行的进程。每个 CPU 有一个运行队列,调度程序使用它来确定何时运行哪些进程。进程也可以从一个运行队列移动到另一个运行队列(例如出于负载平衡目的),但这是另一个主题。

【讨论】:

    【解决方案2】:

    在 x86 中,分别使用 CLI(清除中断标志)和 STI(设置中断标志)命令禁用和启用中断。
    Non-maskable interrupts 不会受到它的影响。再次设置中断标志后,将立即处理其他中断。

    您在其中按下 Ctrl-C 的终端会向所有附加到它的进程发送一个 INT 信号(“interrupt”,SIGINT),默认情况下,这会导致进程终止。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2016-09-26
      • 2019-05-23
      • 1970-01-01
      相关资源
      最近更新 更多