关于中断、异常、信号之间的区别
参考:
https://zhuanlan.zhihu.com/p/336775510
https://www.cnblogs.com/charlesblc/p/6277810.html
异常与中断
(异常其实是一种不可屏蔽中断,它可以由软件引起,也可以由硬件引起,关于可屏蔽/不可屏蔽中断、中断优先级:《操作系统概念》P394)
异常又称为同步信号、同步中断、软件中断,是由当前正在占用CPU的线程引发的一种信号,CPU无法屏蔽,必须先去执行处理程序
异常处理流程:
- 异常发生,控制单元产生一个对应的类型码
- CPU 根据这个类型码从中断向量表(idt, interrupt description table) 找到异常处理处理程序入口
- 保存当前程序现场,切换到对应异常处理程序
- 异常处理程序最后向进程发送一个信号 SIGXXX(这个异常一般就是由这个正在执行的进程导致的,它必须被停下来让CPU去处理异常,这也是异常被称为同步信号的原因),记录在进程的 PCB 里
- 如果进程自定义了该信号的处理程序,跳去执行它;否则执行内核预定义的行为
中断又被称为异步信号、异步中断、硬件中断
中断处理流程:
- 设备产生中断,PIC(可编程中断控制器)产生一个对应的类型码
- CPU 根据这个类型码从中断向量表(idt, interrupt description table) 找到异常处理处理程序入口
- 保存当前程序现场,切换到对应异常处理程序
- 中断处理程序进行保存现场,做相关处理,恢复现场(注意不会像异常那样给之前正在执行的用户进程发一个SIGXXX信号,因为它并不是之前进程引起的)
- 内核调度,返回用户进程
发生中断时会有一个中断号(例如系统调用其实是产生了中断号INT 0x80,这个中断号调的中断处理程序是内核,然后内核再根据寄存器%eax中存储的参数就可以知道需要调用哪个系统调用)
所有中断号都保存在一个叫中断向量的数组中(操作系统概念 P6),对于设备产生的中断而言,中断号一般是这个设备的唯一设备号
信号
硬件中断也可以生成信号,例如键盘中断生成SIGINT。因此,中断和信号紧密相连。
信号是进程间通信方式之一,例如子进程结束后向父进程发出SIGCHLD信号,父进程就可以回收子进程资源,防止其变成僵尸进程。
根据我自己的理解临时画了个草图,可能不正确:
(一般说的中断通常是外围硬件设备发起的(硬中断),他们有各自的中断处理函数,这些函数地址保存在中断向量中。
而信号一般都有一个SIGXXX的标志,它一般由进程主动发起,用于与别的进程通信。
但是外围设备发起中断时很多时候也会发出一个信号来通知当前正在占用CPU的进程,如果这个中断不是很紧急而CPU当前又在执行重要指令,那么系统可以选择先屏蔽这个中断,晚点再处理。
异常可以说是一种软件引起的中断(软中断),也可以说是一种信号(异常信号/同步信号),异常是一种不可屏蔽中断,他一般由当前正在占用CPU的进程产生的某种错误引发(比如访问了非法内存),
CPU必须先停下来处理,所以异常是一种不可屏蔽的软中断,也被称为同步信号(晕))