**中断(interrupt)**是发给处理器的信号,表示有事情需要关注。处理器暂停当前程序,运行一小段例程来处理该事件,然后从暂停的位置继续。题目会给出按键、打印机故障或停电之类的情境,要你解释会发生什么。
具体发生了什么?一步一步看
- 来源发出信号:硬件(键盘、打印机、计时器)或软件(需要服务的程序)。
- 处理器在每个取指-译码-执行循环中,完成当前指令后检查是否有中断。
- 如果有中断在等待,且它的优先级(priority)足够高,处理器就保存状态:程序计数器和寄存器的内容。
- 它运行与该信号对应的中断服务例程(ISR)。
- 它恢复已保存的状态,从下一条指令继续运行原来的程序。
如果两个中断同时到达,优先级较高的先处理。停电信号的优先级高于按键。
带中断检查的循环可以用伪代码写成:
REPEAT
FETCH instruction at program counter
EXECUTE instruction
IF interrupt signal received AND its priority is high enough THEN
SAVE program counter and registers
RUN interrupt service routine
RESTORE program counter and registers
ENDIF
UNTIL program ends
例题详解:计算时有人按键
一个程序有四条指令:
I1: A ← 2
I2: B ← A * 3
I3: C ← B + 1
I4: D ← C * 2
用户在 I2 执行时按下一个键。追踪处理器的行为。
| 步骤 | 动作 | A | B | C | D |
|---|---|---|---|---|---|
| 1 | 执行 I1 | 2 | |||
| 2 | 执行 I2:B = 2 × 3 | 2 | 6 | ||
| 3 | 中断检查:有按键在等待,于是保存状态(下一条指令是 I3,A = 2,B = 6) | 2 | 6 | ||
| 4 | 运行 ISR:把按键存入键盘缓冲区 | 2 | 6 | ||
| 5 | 恢复状态,从 I3 继续 | 2 | 6 | ||
| 6 | 执行 I3:C = 6 + 1 | 2 | 6 | 7 | |
| 7 | 执行 I4:D = 7 × 2 | 2 | 6 | 7 | 14 |
最终 D = 14,与没有中断时相同。
这正是保存和恢复步骤的用意:被中断的程序不会受损。检验:2 × 3 = 6,6 + 1 = 7,7 × 2 = 14。你可以在受限伪代码追踪训练器里追踪类似的循环。
要留意的错误
错误答案:“处理器停止运行程序,直到用户不再按键为止。”
这把中断当成永久停止,也没有提到保存的状态。另一种说法是处理器一直询问键盘有没有按键。那是轮询(polling),而中断的意义在于由设备主动向处理器发信号。
完整的答案要写出信号,说明当前指令先完成,说明状态被保存,写出例程名称,并说明程序随后继续。
自我检测
1. 打印文件时打印机缺纸了。解释这里如何使用中断。
显示答案
打印机向处理器发出中断信号。处理器完成当前指令并保存状态。它运行一段例程,通知用户打印机需要纸张。然后恢复状态,继续运行其他程序。
2. 一个按键和一个停电警告同时到达。先处理哪一个?为什么?
显示答案
停电警告,因为它的优先级更高。处理器可能需要在断电前保存工作。按键可以等待。
3. 说出处理器在运行中断服务例程之前必须保存的一样东西,并说明原因。
显示答案
程序计数器(或寄存器内容)。没有它,处理器返回时就不知道该运行哪条指令,也不知道被中断的程序正在使用什么值。
接下来学什么
接着从应对事件转到计算机上的维护工具,见辨认实用程序的功能。之后的软件与系统练习会把中断和其他各课混合在一起。
把步骤写得有条理,是我们的老师可以在线上一对一计算机科学补习中直接指导的技能。