中断(interrupt)
from wiki:
中断(Interrupt)是指处理器接收到来自【硬件】或【软件】的信号,提示发生了某个事件,告知CPU注意
为什么会有中断:
中断,本质上是【CPU】和【外设】的一种【异步】通信机制。这里又要提到同步/异步通信机制了。假设处理器与外部设备通信时,必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果(即同步的消息通信机制),就会造成大量处理器周期被浪费。更合理的是异步机制:CPU向设备发出指令后,继续执行接下来的其他指令,而外设完成指令执行时通过发送中断信号来主动通知CPU,CPU拿到结果后再继续切换回原来的上下文处理。中断实际上就是【CPU】和【外设】的一种【异步】通信机制,现在被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面
中断的实现:CPU对中断信号的轮询,或者说CPU在监听中断信号
当有设备事件发生,设备会设置CPU的中断引脚来触发一次中断。不同的事件对应不同的中断类型,如a中断拉高,告诉CPU该写了;b中断拉高,告诉CPU可以读了。在每个CPU时钟周期的末尾,CPU会去检测那个中断信号位是否有中断信号到达。如果有,则会根据中断优先级决定是否要暂停当前执行的指令,转而根据中断向量表去执行处理中断的指令。(就是CPU 层面对中断信号的轮询)
问题1:前面说过,CPU和外设通信时忙等待会浪费CPU周期,忙等待就是对设备状态的轮询。而中断本质上也是轮询,为什么中断不浪费CPU周期呢?
因为CPU每个时钟周期轮询一次中断信号,这个时钟周期的其他时间片CPU是可以执行其他指令的,而不是向忙等待一样每个时间点都在轮询其他啥也不干
问题2: 都是轮询,为什么忙等待是同步通信,而中断是异步通信呢?中断也需要轮询中断信号啊
这和问题1实际上是同质的。同步通信是【主动轮询】;异步通信是被动接受通知,也就是【监听通知】,而监听的实现还是轮询。虽然都是轮询,但轮询的方式不同。对于前者,CPU只做一件事,就是一直轮询好了吗好了吗;对于后者,CPU是周期性地轮询,整个节奏是:【干活-看下好了吗-干活-看下好了吗-干活-看下好了吗...】。这看起来就是异步模式了
常见应用
中断的典型应用包括系统时钟、磁盘输入输出操作、断电信号以及软件自陷等。
- 系统时钟通过一个计数器(多基于某种振动频率)定期向CPU发出中断,CPU通过专门的时钟中断处理程序来保持计时。Clock or timer interrupts are interrupts from your timers present on your board. These timers are configured during board initialization where you can define the interrupt period. Timer/clock interrupts are often used for scheduling. These interrupts invoke the scheduler and it may switch the currently executing thread/process to another by saving the current context and loading another one.
现代操作系统对系统时钟的另一个主要应用是为进程切换提供时机。一旦时钟中断发生,程序计数器会被自动压栈,而此时操作系统就有机会将程序状态及内存映像转存至别处,并调用进程调度程序来选择下一个进程,并将其进程状态,包括程序计数器,导入寄存器。这样下一个程序就可以运行。应注意进程调度程序的调度时机不止于时钟中断。 - 磁盘中断标识某个磁盘设备完成了数据的发送/接收。磁盘中断发生后,等待这个中断的进程可以(但未必,这取决于进程调度程序当时的判断)继续执行。
- 断电中断指示计算机能源即将丧失,计算机可以相应中断程序作有序的关机处理。
网友评论