中断与异常
中断机制的诞生
早期计算机:各程序只能串行执行,系统资源利用率低
为解决上述问题,发明了操作系统,引入中断机制,实现多道程序并发执行。发生中断意味着需要操作系统的介入
中断的概念和作用
- 中断发生时,CPU立即进入核心态
- 中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理
- 对于不同的中断信号,会进行不同的处理
中断可以使CPU从用户态切换为核心态,使操作系统获得计算机的控制权
用户态$\to$核心态:通过中断实现,且是唯一途径
核心态$\to$用户态:通过执行一个特权指令,将程序状态字(PSW)的标志位设置为用户态
中断的分类
graph LR
A(中断)-->B["内中断(也称异常、例外、陷入)"]
A-->C["外中断(中断)"]
B-->D["自愿中断——指令中断"]
B-->E["强迫中断"]
E-->F["硬件故障(eg:缺页)"]
E-->G["软件中断(eg:整数除0)"]
C-->H["外设请求(eg:I/O操作完成后发出的中断信号)"]
C-->I["人工干预(eg:用户强行终止一个进程)"]
判断中断信号是来自CPU内部还是外部来判断是内/外中断
另一种分类方式
外中断的处理过程
- 执行完每个指令后,CPU都要检查当前是否有外部中断信号
- 若检测到外部中断信号,则需要保护被中断进程的CPU环境
- 根据中断信号类型转入相应的中断处理程序
- 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行
系统调用
什么是系统调用,有啥用?
系统在的各种共享资源都由操作系统都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作,都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作
系统调用相关处理涉及到对系统资源的管理、对进程的控制,需要执行一些特权指令才能完成,因此系统调用的相关处理需要在核心态下进行
分类
- 设备管理:完成设备的请求、释放、启动等功能
- 文件管理:完成文件的读写、创建、删除等功能
- 进程控制:完成进程的创建、撤销、阻塞、唤醒等功能
- 进程通信:完成进程之间的消息传递、信号传递等功能
- 内存管理:完成内存的分配、回收等功能
系统调用与库函数的区别
系统调用背后的过程
高级语言--编译-->汇编语言
传递系统调用参数-->执行陷入指令(用户态)-->执行系统调用相应服务程序(核心态)-->返回用户程序
注意:
- 陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,从而CPU进入核心态
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
- 陷入指令是唯一一个只能在用户态执行,而不可在核心态执行的指令