linux - 非抢占式调度如何处理硬件中断?
问题描述
假设我有一个当前正在运行的进程 A。然后我按Ctrl+C,这个中断怎么处理?
A是先执行完再处理中断吗?
A 是否进入就绪队列?
解决方案
您混淆了中断、信号和任务调度。这些都是非常不同的概念。
我按Ctrl+C,这个中断怎么处理?
CTRL+C与中断无关。这是一个组合键,会被您的终端仿真器截获,然后向SIGINT
当前运行的进程发送一个信号 ( )。信号传递是通过kill
系统调用完成的(与它的名字相反,它不一定会杀死进程)。
A是先执行完再处理中断吗?
当您的程序收到SIGINT
信号时会发生什么取决于具体情况。程序可以注册一个信号处理程序,并决定在收到特定信号时要做什么。换句话说,你所说的这种“中断”发生在进程运行时:当信号被传递时,内核将暂时“暂停”正常的进程代码,让进程运行它的信号处理程序,然后恢复从它离开的地方开始处理。
进程只能为可捕获的信号注册处理程序 ( SIGINT
is)。在 Linux 中唯一无法捕获的两个信号是SIGKILL
和SIGSTOP
。如果进程没有注册信号处理程序,内核定义的默认处理程序将完成它的工作:对于SIGINT
,默认处理程序只是终止进程。
有关man 7 signal
更多信息,请参阅。
A 是否进入就绪队列?
没有“就绪队列”之类的东西,我想你的意思是runqueue。如果进程被信号杀死,那么它将不复存在并从其运行队列中删除,因此不再有运行队列有 A。
如果进程没有终止,它仍然存在于系统中,内核将继续执行它以及其他在同一 CPU 上执行的进程。每个 CPU 有一个运行队列,调度程序使用它来确定何时运行哪些进程。进程也可以从一个运行队列移动到另一个运行队列(例如出于负载平衡目的),但这是一个不同的主题。
推荐阅读
- javascript - 奇怪的 Chrome JavaScript 表达式行为
- android - 单击导航抽屉上的项目时如何解决问题 TabLayouts?
- java - 我的回收站视图显示从设备 Android 中删除的项目
- javascript - 变量未从第一次尝试分配
- apple-numbers - 查找字符串中第一个数字的索引
- google-cloud-platform - 谷歌监控另一个错误?以及如何报告这些?
- php - 我在一个地方得到了未定义的财产?
- ios - 如何将我的 Firebase Firestore 项目从测试模式转变为 iOS 项目的生产模式?
- unity3d - Unity 2019.4 内置管道,Bloom 后处理不起作用
- python - 在 Django 中打印由 Python 函数创建的列表