中断系统
复习
- 第三十八章:了解了 CPU 的基本工作原理
- 第四十章:掌握了总线系统的基础知识
- 第四十一章:了解了输入输出系统
TL;DR
- 中断让 CPU 不必傻等外设,外设准备好了主动“打断“CPU
- 处理中断需要:保存现场 → 执行中断服务程序 → 恢复现场 → 返回
- 中断有优先级,高优先级可以打断低优先级
- 中断是操作系统进行进程调度、响应外设的基础
正文
傻等的代价
第四十一章提到,CPU 和外设打交道有一种“程序查询“方式:CPU 不停地问“好了没?好了没?“
这太亏了。外设(比如硬盘)慢得很,CPU 问一次、等半天,宝贵的算力全浪费在等待上。
那能不能反过来——外设准备好了,主动来通知 CPU?当然可以。这就是中断(Interrupt)。
什么是中断
“中断“就是字面意思:打断 CPU 正在做的事,让它先去处理一件更紧急的事,处理完再回来接着做。
生活里到处是中断:你正在写代码(主程序),快递小哥按门铃(中断请求),你下楼取快递(中断服务),回来后接着写代码(返回主程序)。关键是你得记住刚才写到哪一行——这就是“保存现场“。
处理一次中断
一次完整的中断处理,大致分这几步:
- 中断请求:外设拉一根中断信号线,通知 CPU
- 响应:CPU 执行完当前这条指令,暂停主程序
- 保存现场:把 PC、状态寄存器等当前状态存起来
- 执行中断服务程序:跳到外设对应的处理程序,把活干完
- 恢复现场:把之前存的 PC、状态恢复回去
- 返回:继续执行被打断的主程序
第 4 步“跳到哪个处理程序“,靠一张中断向量表:每种中断对应一个入口地址,CPU 拿到中断号一查表就知道该往哪跳。这和第二十九章的地址译码是一个思路。
优先级与嵌套
如果同时来了好几个中断怎么办?这就用到优先级:CPU 先处理优先级高的。
更棘手的是,处理中断时可能又来一个更紧急的中断。如果允许它打断当前的中断处理程序,就叫中断嵌套。像医院的急诊分级:正在处理普通病人,突然来了个危重病人,得先抢救危重的。
也有的中断“屏蔽不得“,比如系统崩溃类的,必须马上响应,这类叫不可屏蔽中断(NMI)。
中断从哪来
按来源分,中断大致有两类:
- 硬件中断:外设或硬件事件触发,比如键盘按下、网卡收到数据、时钟到点
- 软件中断:程序自己触发,比如请求操作系统服务的系统调用、除零异常
其中时钟中断特别重要。它每隔固定时间就响一次,操作系统借此“抢回“控制权,给不同程序分配运行时间——这就是进程调度的心跳。没有它,一个死循环程序就能把电脑卡死。
思考题
如果 CPU 在处理一个中断时又来了一个新中断,应该怎么处理?把新中断保存起来晚点处理,还是立刻切换过去?两种做法各有什么代价?
小结
知识点
- 中断的作用:让 CPU 不再傻等
- 中断处理的完整流程
- 保存现场与恢复现场
- 中断向量表
- 中断优先级与嵌套
- 硬件中断与软件中断
参考资料
- Wikipedia(zh):中断:中断的基本概念
- Wikipedia(zh):中断向量表:中断向量表的原理
- Wikipedia(zh):实时操作系统:实时系统中的中断处理
思考题答案(仅供参考)
取决于新中断的优先级。如果它比当前处理的中断更紧急,就应该立刻切换过去(中断嵌套),代价是现场要一层层保存,稍微复杂;如果优先级不高于当前,就先把请求挂起(记录在等待队列里),等当前中断处理完再响应,这样简单可靠,但紧急事件可能要等一会儿。实时系统尤其要在“及时响应“和“实现简单“之间权衡。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪