中断、异常与信号

参考:大话异常、中断与信号
任何一个通用 CPU 都可以在执行完一条指令后检测从 CPU 外部发送过来或从内部产生的一种特殊信息,并且可以立即转而对该信息进行处理。

中断

中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。

  • 可屏蔽中断:键盘输入、鼠标点击、定时器等
  • 不可屏蔽中断:内存错误、总线错误、电源故障等

中断处理流程:

  1. 设备产生中断,中断控制器产生对应的类型码
  2. CPU根据类型码从中断向量表找到处理程序入口
  3. 保存当前程序现场,并切换到处理程序
  4. 执行处理程序,完成后恢复现场
  5. 切换回用户进程

异常

是一种由指令产生的中断(软中断),通常是由程序在运行时遇到不符合规范的代码或结果产生的。

  • 编译时异常:类/方法/属性未找到
  • 运行时异常:空指针、数组越界、除0操作等

异常处理流程:

  1. 异常发生,控制单元产生对应的类型码
  2. CPU根据类型码从中断向量表找到处理程序入口
  3. 保存当前程序现场,并切换到处理程序
  4. 执行处理程序并向进程发送一个SIGXXX信号,完成后恢复现场
  5. 如果进程自定义了SIGXXX信号的处理程序,则跳转到对应的执行程序。否则执行内核预定义的行为

信号

信号是软件层面对中断的模拟,用来通知进程发生了异步事件。

  • 举例:在运行一个 shell 程序的时候,按下 Ctrl+C 就可以强制退出。
    1. 按键后键盘产生硬件中断,CPU暂时执行当前代码,转换到内核态处理中断
    2. 键盘驱动程序检测到Ctrl+C按键,并抛出一个相应的异常
    3. 异常处理程序将SIGINT信号发送给用户进程
    4. 异常处理完成后需要先处理PCB中的SIGINT信号(自定义处理或者默认处理)
    5. 返回用户进程