首页 > 解决方案 > 非抢占式调度如何处理硬件中断?

问题描述

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

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

A 是否进入就绪队列?

标签: linuxasynchronousprocesslinux-kerneloperating-system

解决方案


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

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

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

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

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

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

有关man 7 signal更多信息,请参阅。

A 是否进入就绪队列?

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

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


推荐阅读