中断、异常与信号
参考:大话异常、中断与信号
任何一个通用 CPU 都可以在执行完一条指令后检测从 CPU 外部发送过来或从内部产生的一种特殊信息,并且可以立即转而对该信息进行处理。
中断
中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。
- 可屏蔽中断:键盘输入、鼠标点击、定时器等
- 不可屏蔽中断:内存错误、总线错误、电源故障等
中断处理流程:
- 设备产生中断,中断控制器产生对应的类型码
- CPU根据类型码从中断向量表找到处理程序入口
- 保存当前程序现场,并切换到处理程序
- 执行处理程序,完成后恢复现场
- 切换回用户进程
异常
是一种由指令产生的中断(软中断),通常是由程序在运行时遇到不符合规范的代码或结果产生的。
- 编译时异常:类/方法/属性未找到
- 运行时异常:空指针、数组越界、除0操作等
异常处理流程:
- 异常发生,控制单元产生对应的类型码
- CPU根据类型码从中断向量表找到处理程序入口
- 保存当前程序现场,并切换到处理程序
- 执行处理程序并向进程发送一个SIGXXX信号,完成后恢复现场
- 如果进程自定义了SIGXXX信号的处理程序,则跳转到对应的执行程序。否则执行内核预定义的行为
信号
信号是软件层面对中断的模拟,用来通知进程发生了异步事件。
- 举例:在运行一个 shell 程序的时候,按下 Ctrl+C 就可以强制退出。
- 按键后键盘产生硬件中断,CPU暂时执行当前代码,转换到内核态处理中断
- 键盘驱动程序检测到Ctrl+C按键,并抛出一个相应的异常
- 异常处理程序将SIGINT信号发送给用户进程
- 异常处理完成后需要先处理PCB中的SIGINT信号(自定义处理或者默认处理)
- 返回用户进程