如何在非抢先调度中处理硬件中断?



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

A 是否先完成执行,然后处理中断?

A 会被放入就绪队列中吗?

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

我按 Ctrl+C,如何处理此中断?

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

A 是否先完成执行,然后处理中断?

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

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

有关详细信息,请参阅man 7 signal

A 会被放入就绪队列中吗?

没有"就绪队列"这样的东西,我想你的意思是运行队列。如果进程被信号杀死,那么它将不复存在,并将从其运行队列中删除,因此任何运行队列都不会再有 A。

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

在 x86 中,中断分别使用 CLI(清除中断标志(和 STI(设置中断标志(命令禁用和启用。
但是,不可屏蔽的中断不会受到它的影响。其他中断将在您再次设置中断标志后立即提供。

您按 Ctrl-C 的终端向连接到它的所有进程发送 INT 信号("中断",SIGINT(,默认情况下,这会导致进程终止。

最新更新