我们先来看看早期的计算机的工作流程:
如上图,在早期的计算机假设有三个程序需要执行,执行顺序是:先执行程序1,等待程序1结束之后,再开始执行程序2,以此类推,所以它们是串行执行的,这种方式效率就比较低,为了能够使计算机能够同时执行多个程序,从而引入了中断机制。
什么是中断?
为了解决程序只能串行执行的问题,人们发明了操作系统,操作系统相当于计算机的管理者,并且引入了中断机制,实现了多道程序并发执行。
也就是说,在多个程序同时执行的时候,如果发生了中断就意味着需要操作系统来介入,展开管理工作。
官方的定义:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
从官方的定义来看,中断其实就是为了支持多道程序并发执行 。
中断的概念和作用
我们再来详细看下中断的各个步骤所需要做的事:
1、当中断发生时,CPU 会立即进入核心态
。
2、当中断发生后,当前运行的进程会被暂停执行,并且由操作系统内核对中断进行处理。
3、对于不同的中断信息,会进行不同的处理。
发生了中断,就意味着需要计算机操作系统介入,展开管理工作。由于操作系统的管理工作(比如进程切换、分配I/O设备等)需要使用到特权指令,因此 CPU 要从用户态转为内核态。
中断可以使 CPU 从用户态切换为核心态,使操作系统获得计算机的控制权,有了中断,才能实现多道程序并发执行。
我们再来回顾一下前面两个章节的内容,如下图:
在之前的章节有说过,CPU 为了区分什么时候执行特权指令,从而定义了两种状态,一个是内核态,一个是用户态。 那它们之间如何进行切换呢?
用户态 切换 核心态,由于用户态无法执行特权指令,所以只能通过中断机制,来让操作系统切换为核心态,并且中断是唯一的途径。
核心态 切换 用户态,由于核心态即可以执行特权指令又可以执行非特权指令,所以只需要通过特权指令就可以切换为用户态。
中断的分类
如上图所示,中断可以分为:内中断、外中断
内中断:信号的来源是 CPU 的内部,与当前执行的指令有关,并且内中断又可以分为自愿中断、强迫中断。
外中断:信号的来源是 CPU 的外部,与当前执行的指令无关。
在关于中断的分类还可以安装下图来进行区分:
外中断处理的过程
我们再来看看外中断的处理过程:
如上图,本来用户程序需要执行指令1~5:
1、执行完每一个指令之后,CPU 都要检查当前是否有外部中断信号。
2、如果检查到外部中断信息,则需要保护被中断进程的 CPU 环境 (类似于 Java 多线程上下文切换,保护现场)。
3、根据中断信息类型转入相应的中断处理程序。
4、处理完中断之后,恢复原进程的 CPU 环境并且退出中断,返回原进程继续往下执行。