中断和异常及处理过程、系统调用 - 图1

中断:

发生中断意味着操作系统的接入,开展管理工作。cpu收到中断信号,切换到内核态,cpu把权限交给操作系统,操作系统内核对中断信号进行处理(如进程1的时间片用完了,触发中断,操作系统进程管理模块切换为进程2执行,把cpu交给进程2,切换回用户态)。

  1. 中断发生,cpu立刻进入内核态
  2. 中断发生,暂停线程的执行,并由操作系统对中断进行处理
  3. 对于不同的中断信号会有不同的处理

中断是cpu用户态切换到内核态唯一的途径。
内核态切换到用户态 通过执行一个特权指令,将程序状态字(PSW)标志设置为用户态即可

还有一种触发中断的情况,就是系统调用。下面详细讲

  1. 当进程1发出系统调用的时候,就会触发一个内中断(又称异常)。这时候cpu切换回内核态,对中断信号进行处理。
  2. 进程1 要进行打印操作,这时候操作系统会让进程1进入等待状态等待打印机IO操作。这时操作系统会换下一个进程2运行,把cpu交给进程2,切换回用户态开始工作。
  3. 当IO完成之后,设备向cpu发出外中断信号,此时cpu切换回内核态,对中断信号进行处理。
  4. 操作系统是IO完成了,就会唤醒进程1,把cpu交给进程1,切换回用户态,让程序继续执行。

中断分类

image.png

内中断
陷入(trap):有意而为之的异常,如系统调用
故障(fault):错误条件引起的,可能被故障处理程序修复,如缺页中断
终止(abort):不可恢复的致命错误,整数除以0

中断处理过程

  1. 执行完每一条指令之后,cpu都要去检查当前是否有中断发生
  2. 如果检测到外部中断信号,则需要保护被中断的进程的cpu环境(如程序的状态字PSW、程序的计数器PC、各种通用寄存器)
  3. 根据中断信号类型转入相应的中断处理程序
  4. 恢复原来过程的CPU环境并退出 中断,返回原过程继续往下执行

什么是系统调用

指OS提供给用户程序使用的接口,用户程序通过系统调用请求获得操作系统的服务,系统调用会使cpu从内核态切换到用户态。
用户接口分为命令接口和程序接口
命令接口:允许用户直接的去使用
程序接口:亦称为系统调用,允许用户通过程序间接使用,由一组系统调用组成

中断和异常及处理过程、系统调用 - 图3

系统调用和库函数的区别

  • 系统调用时操作系统向上层提供的接口
  • 库函数是对系统调用的封装,我们编写程序的时候,大多是使用语言提供的库函数简介的进行系统调用。语言库函数会被编译成汇编语言等低级语言,由低级语言传递系统调用的参数,执行陷入指令,发生内中断

    系统调用背后的过程

  1. 传递系统调用的参数(int指令参数x会指明系统调用号。此处的int不是整数的意思,其实是interrupt的缩写,称为陷入指令)
  2. 执行陷入指令(在用户态下执行的),执行陷入指令之后会立即触发一个内中断,cpu进入内核态
  3. 执行系统调用相关的服务程序(内核态下执行)
  4. 返回给用户程序,切换回用户态

注意:

  • 发系统调用请求时在用户态下,而系统调用相关的处理过程是在内核态下进行的。
  • 陷入指令是唯一一个只能在用户态下执行而不能在内核态下执行的指令