Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

中断系统

复习

  1. 第三十八章:了解了 CPU 的基本工作原理
  2. 第四十章:掌握了总线系统的基础知识
  3. 第四十一章:了解了输入输出系统

TL;DR

  • 中断让 CPU 不必傻等外设,外设准备好了主动“打断“CPU
  • 处理中断需要:保存现场 → 执行中断服务程序 → 恢复现场 → 返回
  • 中断有优先级,高优先级可以打断低优先级
  • 中断是操作系统进行进程调度、响应外设的基础

正文

傻等的代价

  第四十一章提到,CPU 和外设打交道有一种“程序查询“方式:CPU 不停地问“好了没?好了没?“

  这太亏了。外设(比如硬盘)慢得很,CPU 问一次、等半天,宝贵的算力全浪费在等待上。

  那能不能反过来——外设准备好了,主动来通知 CPU?当然可以。这就是中断(Interrupt)

什么是中断

  “中断“就是字面意思:打断 CPU 正在做的事,让它先去处理一件更紧急的事,处理完再回来接着做。

  生活里到处是中断:你正在写代码(主程序),快递小哥按门铃(中断请求),你下楼取快递(中断服务),回来后接着写代码(返回主程序)。关键是你得记住刚才写到哪一行——这就是“保存现场“。

处理一次中断

  一次完整的中断处理,大致分这几步:

  1. 中断请求:外设拉一根中断信号线,通知 CPU
  2. 响应:CPU 执行完当前这条指令,暂停主程序
  3. 保存现场:把 PC、状态寄存器等当前状态存起来
  4. 执行中断服务程序:跳到外设对应的处理程序,把活干完
  5. 恢复现场:把之前存的 PC、状态恢复回去
  6. 返回:继续执行被打断的主程序

  第 4 步“跳到哪个处理程序“,靠一张中断向量表:每种中断对应一个入口地址,CPU 拿到中断号一查表就知道该往哪跳。这和第二十九章的地址译码是一个思路。

优先级与嵌套

  如果同时来了好几个中断怎么办?这就用到优先级:CPU 先处理优先级高的。

  更棘手的是,处理中断时可能又来一个更紧急的中断。如果允许它打断当前的中断处理程序,就叫中断嵌套。像医院的急诊分级:正在处理普通病人,突然来了个危重病人,得先抢救危重的。

  也有的中断“屏蔽不得“,比如系统崩溃类的,必须马上响应,这类叫不可屏蔽中断(NMI)

中断从哪来

  按来源分,中断大致有两类:

  • 硬件中断:外设或硬件事件触发,比如键盘按下、网卡收到数据、时钟到点
  • 软件中断:程序自己触发,比如请求操作系统服务的系统调用、除零异常

  其中时钟中断特别重要。它每隔固定时间就响一次,操作系统借此“抢回“控制权,给不同程序分配运行时间——这就是进程调度的心跳。没有它,一个死循环程序就能把电脑卡死。

思考题

  如果 CPU 在处理一个中断时又来了一个新中断,应该怎么处理?把新中断保存起来晚点处理,还是立刻切换过去?两种做法各有什么代价?

小结

知识点

  • 中断的作用:让 CPU 不再傻等
  • 中断处理的完整流程
  • 保存现场与恢复现场
  • 中断向量表
  • 中断优先级与嵌套
  • 硬件中断与软件中断

参考资料

  1. Wikipedia(zh):中断:中断的基本概念
  2. Wikipedia(zh):中断向量表:中断向量表的原理
  3. Wikipedia(zh):实时操作系统:实时系统中的中断处理

思考题答案(仅供参考)

  取决于新中断的优先级。如果它比当前处理的中断更紧急,就应该立刻切换过去(中断嵌套),代价是现场要一层层保存,稍微复杂;如果优先级不高于当前,就先把请求挂起(记录在等待队列里),等当前中断处理完再响应,这样简单可靠,但紧急事件可能要等一会儿。实时系统尤其要在“及时响应“和“实现简单“之间权衡。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪