中断与异常

中断机制的诞生

早期计算机:各程序只能串行执行,系统资源利用率低

为解决上述问题,发明了操作系统,引入中断机制,实现多道程序并发执行发生中断意味着需要操作系统的介入

中断的概念和作用

  • 中断发生时,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内部还是外部来判断是内/外中断

另一种分类方式

0CA93096ADEF81054586CA8CF660683B.png

外中断的处理过程

  1. 执行完每个指令后,CPU都要检查当前是否有外部中断信号
  2. 若检测到外部中断信号,则需要保护被中断进程的CPU环境
  3. 根据中断信号类型转入相应的中断处理程序
  4. 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行

系统调用

什么是系统调用,有啥用?

系统在的各种共享资源都由操作系统都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作,都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作

系统调用相关处理涉及到对系统资源的管理、对进程的控制,需要执行一些特权指令才能完成,因此系统调用的相关处理需要在核心态下进行

分类

  • 设备管理:完成设备的请求、释放、启动等功能
  • 文件管理:完成文件的读写、创建、删除等功能
  • 进程控制:完成进程的创建、撤销、阻塞、唤醒等功能
  • 进程通信:完成进程之间的消息传递、信号传递等功能
  • 内存管理:完成内存的分配、回收等功能

系统调用与库函数的区别

D796CA914C07B3575C66CAB07D912C13.png

系统调用背后的过程

高级语言--编译-->汇编语言

传递系统调用参数-->执行陷入指令(用户态)-->执行系统调用相应服务程序(核心态)-->返回用户程序

FF1811FADEFD7A4723CBDD90212C1273.png

注意:

  • 陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,从而CPU进入核心态
  • 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
  • 陷入指令是唯一一个只能在用户态执行,而不可在核心态执行的指令
最后修改:2022 年 02 月 27 日
如果觉得我的文章对你有用,请随意赞赏