15中断和异常
# 1.1_5_中断和异常
各位同学大家好,这个小节当中我们会学习中断和异常相关的知识点和概念。 首先我们会从中断机制诞生的历史背景开始讲起,聊一聊中断机制是怎么诞生的,它的诞生是为了解决什么样的问题,由此我们会引出中断的概念和作用。
之后我们会介绍中断有哪些分类,大致上可以分为内中断和外中断两种大类,其中内中段又可以称之为异常,也就是我们开篇提到的异常。
最后我们还会简单的介绍一下对计算机对外中断的一个处理过程,那么我们会按照从上到下的顺序依次讲解。
# 中断机制的诞生
首先我们看一下中断机制是怎么诞生的,其实在早期的计算机当中,各个程序只能串行的执行,一个程序它放入了计算机内存之后,接下来这个程序会开始运行,当它运行结束之后,需要等待lO设备输出操作结束,这个程序才可以从内存中移出。
接下来再移入第二道程序,同样的第二道程序移入内存之后开始执行,然后等待IO操作结束再移除程序。
第三道程序其实和刚才也一样。
所以其实这种方式它的缺点显而易见,就是各个程序他们只能串行的执行,在计算机的内存当中同一时刻最多只能有一道程序,这种方式会导致系统的资源利用率特别低,而资源利用率低这个问题咱们在之前计算操作系统的发展小结中,以已经详细的介绍过,这个地方就不再展开细聊了。
那么为了解决系统资源利用率低的问题,人们就发明了操作系统,操作系统它作为计算机的管理者,并且引入了中断机制,从而实现了多道程序并发执行这样一件事情,也就是进入了我们之前提到过的多道批处理阶段。
那么再聊下面的中断问题的时候,大家只需要谨记一个本质,只要发生了中断之后,就意味着需要操作系统介入工作,来开展各种各样的管理工作。那么在引入了这种中断机制之后,就可以把这些程序多到程序,同时放入到内存各个程序并发的执行,比如说刚开始第一道程序或者说进程1,它在用户态下运行,
运行了一段时间之后,CPU可能会收到计时部件,计时部件其实就是一个用于计时的一个硬件设备,然后这个计时部件可能会向CPU发送一个中断信号,来通知CPU现在时间已经过了一个时间片了,然后当CPU收到中断信号之后,就意味着需要操作系统来介入开展管理工作,因此CPU会立即切换到核心态,然后把CPU的使用权限交给操作系统,操作系统的内核就会开始对刚才的中断信号进行处理。操作系统的内核发现刚才的中断信号是告诉它时间片已到,那么操作系统就会决定进程一的时间片现在已经用完了,那么接下来要换进程2投入运行,这就是操作系统开展的一系列的管理工作。
在完成这一系列的管理工作之后,操作系统会把CPU的使用权交还给用户进程,接下来进程2就会在用户台下开始执行。
然后当进程2执行了一段时间之后,它有可能会发出像系统调用这种内中断信号,为了保证系统的安全性,向输入输出操作相应的那些指令是属于特权指令,不允许用户进程直接使用。因此用户进程这些普通的应用程序,它只能通过系统调用的方式,通过这种内中断信号的方式来主动的要求操作系统介入工作,让操作系统代他完成请求输出操作这样一个事情。因此接下来CPU同样会立即进入到核心态,然后操作系统的内核接管,刚才进程2提出的请求就是系统调用的请求之后,操作系统会按照进程2的请求要求打印机输出设备开始工作
然后进程二由于要等待 IO设备的工作完成,所以它会让进程2暂停运行,接下来换进程3运行。完成这一系列的管理工作之后,操作系统又会再次把 CPU的使用权还给用户进程,然后进程3开始工作,并且这个输出设备在操作系统的要求下会也会并行的工作,当他工作结束之后,会向CPU发出一个IO完成的中断信号。
当CPU接接收到中断信号之后,他又知道现在又应该由操作系统来介入开展后续的管理工作了,那么接下来不用说了,也会切换为核心态,操作系统的内核会对刚才的中断信号进行处理,结果他发现刚才的中断信号其实是通知他进程二的 l操作已经完成,那么他就会让进程2恢复运行,来完成后续的相应的工作,所以接下来他又会把 CPU的使用权还给用户进程,然后进程2又重新投入运行,开始后续的工作。
所以其实通过刚才的过程的讲解,我们会发现一些显著的特点,
当中断发生的时候,CPU会立即进入核心态。
第二,当中断发生用户进程会暂停运行,然后由操作系统的内核对中断进行处理。
第三,对于不同的中断信号,操作系统进行的这种处理方式是各不相同的。
那么当发生了中断之后,就意味着操作系统需要介入工作,开展各种各样的管理工作,这是我们刚开始提到的一个本质特点。由于操作系统的管理工作向进程切换分配lO设备,这些管理工作都需要使用到特权指令,所以说 CPU需要从用户态转换为核心态,因为只有在核心态下才可以执行这些特权指令,而中断就恰好可以使CPU从用户态转换为核心态,从而使操作系统获得计算机的控制权,然后开展一些后续的管理工作。
那么只有操作系统获得了控制权,开展这些像进程切换这样的工管理工作之后,才可以让进程之间实现真正的并发执行这样的一个事情。所以我们才说有了中断才可以实现多道程序并发执行。
那么上个小节我们遗留下了一个小问题,用户态和核心态之间的切换是怎么实现的?相信经过刚才的讲解,大家应该已经知道用户态到核心态的切换是通过中断来实现的,并且需要注意到的是中断是唯一的一种让CPU从用户态进入到核心态的一个唯一的途径。而核心态到用户态的转换,只需要通过一个特权指令来设置程序状态字,把它的标志位改成用户态就可以了。
还记得我们之前小结讲过的, CPU用来区分用区分核心态和用户态,其实只是在其实只是在这个程序状态字里用一个标志位0和1来进行标识的,而由于核心态下本来就可以执行这些特权指令,所以只需要执行一个设置程序状态字的特权指令,就可以把 CPU的状态从核心态切换回用户态了。
# 中断的分类
那么讲完了中断的基本概念之后,我们再来看一下中段有哪些分类。中段可以分为内中断和外中断两种大类,其中外中断也可以简单的称之为中断。那么大家需要注意这里说的是狭义的中断,而这个中断刚才我们提到的那些中断其实指的是广义的中断,具体是狭义还是广义,大家在做题的时候需要进行自己体会进行总结。
内中断也可以称为异常或者例外陷入。而内外中断,这两种中断本质上的区别在于中断信号的来源到底是CPU的内部,还是CPU的外部,内中断的发生和当前执行的指令是有关系的,而外中断和当前执行的指令事务没有关系的,比如说刚才我们提到的打印机在完成了输出工作之后向CPU发送的一个外部中断信号,这就属于外部中断。
那么内中断和外中断又可以进一步细分为这样一些类型,那么像指令中断,就是刚才我们提到的系统调用这个部分,后面会用单独再用一个小节的视频来进行讲解。
而硬件故障,比如说像我们后面几个章节会学到的缺页中断,现在先不用管,有个印象就可以了。
然后软件中断是大家可能现在比较容易理解的,假如当前执行的指令是一个除法指令,并且这个指令进行了一个整数除0这样的非法操作,这种情况下就会抛出一个异常或者说内中断。由于内中断的产生和当前正在执行的除法指令有关,所以说这个中断信号它的来源是来自于CPU内部,当前执行的指令有关,这个大家再体会一下。
而外中断,比如说像刚才我们提到的IO操作完成之后,IO设备会向CPU发送一个外部中断信号,而这个中断信号很显然和当前CPU中内部正在执行的这些指令,这个指令是没有关系的。所以我们才说外中断它的中断信号来源是来自于CPU外部,
考试当中常考的是会给大家一个事件,然后让一个中断事件,然后让大家判断中段它是属于内中断还是外中断,大家只需要紧紧抓住它的本质区别,就是信号来源是否来自于CPU内部,还是来自于CPU外部就可以了。而具体的这些分类其实只是深入了解一下,如果记不住的话也没关系,大家通过做题能有基本的印象就可以。
那么除了刚才咱们提到的王道书上的那种分类方式之外,内部中断也可以分为陷入,故障,中止这三种不同的类型,其中陷入就是像我们刚才提到的系统调用那种用户程序有意而为之的故意的故意造成的异常,这个叫陷入。
而故障是指由错误条件引起,并且有可能被故障处理程序修复的。比如说刚才我们提到的缺页中断,大家在学习完第三章之后就可以理解了
那么终止的话就是一些不可恢复的致命错误造成的结果。比如说刚才我们提到的整数除以0这种操作,即使操作系统介入这个错误也没办法修复的,这种叫做终止。
以上就是中断的两种分类方式。
# 中断的处理过程
那么除了之前的那些内容之外,我们再来简单看一下计算机对外部中断的处理过程。比如说CPU现在正在用户态下运行一个用户程序相关的指令,那么CPU会按顺序依次执行这些指令,在执行完每一个指令之后,CPU都会例行检查当前是否有外部中断信号需要处理。如果说没有外部中断信号的话,它就会继续执行下一条用户程序的指令,直到有一条指令结束完了之后,他检查之后,发现此时有一个外部中断信号需要处理,那么接下来就需要操作系统介入来处理外部中断信号。
因此用户程序需要暂停运行,而由于它需要暂停运行,所以需要做一件事情,就是要保护被中断的用户进程,它的CPU环境。比如说像程序状态字程序计数器,还有各种各样的通用寄存器,为什么需要保存保护这些CPU环境呢?其实类似于我们玩游戏玩到一半,中间突然也被一个什么事情打断了,需要把这个游戏暂停,那么我们是不是就需要把游戏的进度进行存档,之后再处理完别的事情之后再回头玩这个游戏,我们只需要再把我们存的游戏的存档给读入,就可以接着往下继续玩了保护工作具体需要做一些什么事情,这个是需要在计算机组成原理那门课里进行学习了,在这个地方大家只需要知道,它是要把这个程序运行的一些中间结果暂时保存下来,以便之后还可以恢复,继续往下执行就可以了。
那么在完成了保护工作之后,就会开始根据中断信号的类型,转入相应的中断处理程序进行处理。而这个中断处理程序其实是属于操作系统内核的,它运行在核心态,那么当中断处理程序要执行结束之后,又需要把刚才我们保留下来的保存下来的这些CPU环境给它恢复,并且退出中断处理程序,返回原来的程序继续往下执行,所以这就是外中段的一个大致的处理过程。
# 小结
好的,那么我们再来做一个简单的回顾,在小节当中我们主要介绍了中断和异常相关的知识点,首先我们从中断机制的诞生,历史背景开始讲起,我们知道中断的引入其实是为了实现多道程序并发执行而引入的一种技术,而中断发生之后,就意味着需要操作系统介入开展一系列的管理工作。
在这个小节当中比较容易作为考题进行考察的,是中断的概念和作用和中断的分类这两个知识点。其中我们最需要注意的是当中断发生之后,CPU会立即进入到核心态,然后中断还是CPU从用户态进入核心态的唯一途径,注意是唯一途径。
另外经常会有一些题目会给出一个中断事件,然后让我们来判断这种这个事件它是属于内中断还是外中断,大家要学会通过中中断信号到底是来自于CPU内部,还是来自于CPU外部,来判断这个中断到底是内中断还是外中断,
除了课本上给出的中断的分类之外,我们还对内中断的另一种分类方式进行了补充,在咱们课后习题中会有具体的讲解,会有遇到。最后我们介绍了外中断的处理过程,大致分为这样4个步骤。好的,那么以上就是小节的全部内容。