中断(广义的)(异常)
-
有了中断机制,才能实现程序并发执行(才能进程切换)
-
发生中断就意味着需要操作系统介入,进行管理。管理需要特权指令,所以需要进入内核态。(要进入内核态要经过一些状态保存)
-
收到中断信号后,CPU会暂停执行下一条将要执行的指令,转而去执行中断信号的处理程序(在内核态处理)
-
收到中断信号(1、计时部件发出的中断信号;2、进程自己发出的系统调用这种内中断信号(比如输出,就会切换进程,该进程就等待IO结束);3、IO完成,IO设备发出中断信号 )后,就要切换为内核态,对中断进行处理
-
中断发生后,当前运行的进程暂停执行,CPU进入内核态,操作系统获得计算机的控制权。
-
对于不同的中断信号,会进行不同的处理(对于不同的中断处理程序,内核程序,在内核态下运行,执行一些特权指令)
-
中断可以使CPU从用户态切换到内核态,且只有中断可以使CPU从用户态切换到内核态
-
从内核态到用户态是执行特权指令,把程序状态字的标志位改一下就行
(原子性语句在执行前会关闭接收中断信号,在执行完后才打开,这样就能保证原子执行,不会被打断。在原子语句执行完后,才会处理中断信号。)
(在 ICS 里,是把这个叫做异常。ICS里异常中的中断指的是狭义的中断,指的是硬件的中断,也就是下述的外中断。这里的中断指的是广义的中断,其实就相当于异常)
中断的分类
-
内中断:信号来源是CPU内部,与当前执行的指令有关
- 自愿中断(指令中断)(系统调用,该指令本身想转到内核态)(trap)
- 强迫中断
- 硬件故障(缺页)(fault)
- 软件中断(出错了,比如除0)(abort)
-
外中断:信号来源是CPU外部,与当前执行的指令无关
- 外设请求(IO操作完成发出中断信号)
- 人工干预(用户强行终止)
外中断的处理过程:
- 执行完每个指令后,CPU都要检查当前是否有外部中断信号,没有的话就执行下一条指令。
- 检测到有外部中断信号,因为当前进程需要被暂停运行,则需要保护被中断进程的CPU环境(例如程序计数器、通用寄存器等),就是得存下来
- 进入内核态,根据中断信号的类型转入相应的中断处理程序。
为什么要有用户态和内核态?
- 由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络,CPU划分出两个权限等级 – 用户态和内核态。
系统调用
系统调用是操作系统提供给应用程序使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序通过系统调用请求操作系统的服务。系统中各种共享资源都由操作系统统一管理,保证系统的稳定性和安全性。系统调用中用到特权指令,需要在内核态下进行。
- 发出系统调用请求是在用户态,发出请求后CPU进入内核态,对系统调用的相应处理是在内核态,即真正的系统调用的执行是在内核态(所以陷入指令是唯一一个只能在用户态下执行的指令)
- 不同的系统调用有不同的相应的系统调用号,就能知道要用什么系统调用
与库函数的区别:库函数是编程语言里的,相当于是对某些功能的封装。有些库函数里会封装系统调用,有的不会。