各位同学 大家好 在这个小节中 我们会学习中断和异常相关的知识点
那首先我们会介绍中断的作用 这其实在上小节当中也有提到过 只不过由于这个内容十分重要 所以
还是愿意做一个复读机
另外 我们会介绍一下中断有哪些类型 大致上可以分为内中断和外中断两种 内中断又可以称为异常
最后我们会简单的介绍一下中断这种机制 它实现的一个具体的原理 那 首先来看一下中断的作用
在上小节中 我们已经学习到了 cpu上面其实会运行两种类型的程序 一种是操作系统的内核程序
一种是普通的应用程序 而内核程序 它是整个系统的管理者 它是一个管理者的角色
那我们的计算机在刚启动的时候 其实在上边跑的肯定是内核程序
只不过在时机合适的时候 内核程序会把
cpu的使用权主动的让给
应用程序 那这个部分是第二章进程管理当中我们会具体学习的内容 这儿暂且先不展开
总之 一个应用程序在上cpu运行之后 它就会一直运行下去 除非发生了中断
而一旦发生中断 就会让cpu立即停止此时正在执行的应用程序转而执行相应的内核程序
所以中断是让这个管理者 也就是操作系统内核重新夺回cpu使用权的一个唯一的途径
而中断会使cpu由用户态变为内核态
所以我们可以思考一下 假如说没有中断机制的话
那么一旦一个应用程序上cpu运行了 那么这个应用程序就可以一直的运行下去
那如果一个cpu一直在运行同一个应用程序的话 我们又怎么可能实现多到程序并发这个事情呢
所以 没有中断技术肯定就没办法实现得到程序并发 甚至可以说没有中断技术就没有操作系统
总之 操作系统内核 它是一个管理者
当他想要把cpu使用权让给应用程序的时候 那么他会自愿的用一个特权指令完成这个事情
但是当他想要把cpu的使用权重新给夺回来的时候 那么他也可以通过中断的这种方式来实现
那结合上一小节当中我们讲的例子 相信这个已经不难理解了
那接下我们要看的是中断有哪些种类型 一种叫内中断 一种叫外中断 内中断的产生和当前执行的指令是有关系的
中断信号来源于cpu内部 而外中断恰恰相反 它和当前执行的指令无关 中断信号来源于cpu的外部
那首先我们来看几个内中断的例子
也就是说 这种中断的产生和当前执行的指令有关
就比如说我们上一小节当中提到的这个例子
一个应用程序 它运行在用户台 然后cpu会依次处理它的这些指令
但是假如说有一个猥琐的黑客在这个应用程序当中尝试植入一条特权指令的话
那么 当cpu拿到这条特权指令的时候 他发现此时正在处于用户台 此时在运行的是应用程序
于是 这个非法的事件会触发一个中断信号 cpu会拒绝执行这一条特权指令
接下来 cpu会自动的转变为内核态 并且会开始执行处理这个中断信号相关的内核程序
于是 在发生了这样非法的事情之后 这个系统的管理者又重新夺回了cpu的控制权
所以这就是一个很典型的内中断的例子 cpu在执行当前的一条指令的时候 由这条指令引发了一个中断
有的时候 即使cpu执行的是非特权指令 也有可能会引发内中断
比如说cpu在执行一个除法指令的时候 他发现除数是零
那在这种情况下肯定也不能让这个程序继续执行下去 所以这种情况也会引发一个内中断
总之 如果当前执行的这个指令本身是非法的
或者说指令的一些参数是非法的 那么这种情况下就会产生一个内中断的信号
接下来 再来看另一个内中断的例子 一个应用程序运行在用户台
但是 有的时候 应用程序他是想要请求操作系统内核为他提供一些服务的
那在这种情况下 应用程序就会执行一条特殊的指令 叫做陷入指令
那这个指令会引发一个内部中断信号
接下来 cpu又会转向这个中断信号相应的处理程序进行这个中断信号的处理
所以可以看到 当一个应用程序执行了陷入指令的时候
就意味着这个应用程序主动的把cpu使用权还给操作系统内核 想让操作系统内核为他提供某些服务
那我们之前提到的所谓的系统调用其实就是用这个陷入指令来完成的
需要强调的一点是陷入指令 它是一个比较特殊的指令 但是它并不是特权指令
因为我们可以想一下这个应用程序 它是运行在用户态的
在用户态下可以执行这个陷入指令的话 那这个陷入指令肯定也不是特权指令了
总之 刚才提到的这个中断信号其实也和当前执行的这条指令是有关系的 这个中断信号是来自于cpu的内部
那接下来我们要看几个外中断的例子 外中断和当前执行的指令无关 这个中断信号来自于cpu的外部
来看第一个例子 叫做时钟中断
这种中断信号是由计算机当中的一个硬件 叫做时钟部件来发出的
这个时间部件会每隔一段时间给cpu发一个中断信号
通过这个时钟中断信号就可以实现多道程序并发运行了 那我们来看一下这个故事是怎么样的
假设此时系统当中想要并发的运行两个应用程序
首先 应用程序一它运行在用户台 然后cpu会执行它的这些指令
然后当他执行了两条应用程序一的指令的时候
这个时钟部件发现此时已经过了50毫秒了 那么他会给cpu发送一个中断信号
注意 这个中断信号和当前执行的指令是没有关系的 它来自于cpu的外部
然后根据我们之前学习到的知识 我们知道
当cpu检测到一个中断信号的时候 他会先暂停此时正在运行的应用程序
然后转而执行一个相应的内核程序来处理这个中断信号 所以接下来cpu会对这个时钟中断信号进行处理
并且转为内核态 那在内核态下 cpu开始执行这个内核程序来处理刚才收到的中断信号
然后这个内核程序执行的过程当中 发现
啊 应用程序一刚才已经用了50毫秒的这个时间了
所以接下来 为了公平起见 我想让第二个应用程序上cpu运行
于是 接下来 这个内核程序会把cpu的使用权给第二个应用程序
接下来又切换回用户态 然后第二个应用程序开始上cpu运行
而当第二个应用程序执行了一系列的指令之后 又过了50毫秒
此时 这个时钟部件又会给cpu发送一个来自于外部的终端信号
那同样的cpu还是会回去执行和这个中断信号相关的那个处理程序
所以接下来他又会开始执行这个内核程序 那接下来 这个操作系统内核发现程序二已经用了50毫秒了
所以接下来 公平起见 我又想让程序一上去 接着运行
于是他会把cpu的使用权让给应用程序一然后应用程序一就可以接着往下执行他之后的那一系列的指令了
所以刚才的这个故事中 我们就很清晰的看到了
两个应用程序是如何在中断机制的支持下实现并发运行的 一直不断的相互切换
所以可以看到中断在现代的这个计算机当中到底有多大的作用
那除了这个时钟部件发出的中断信号之外 有时候还会有来自于i/o设备 也就是
input output 也就是输入输出设备发来的这种中断信号
比如说 某一个应用程序可能会请求打印机的打印服务 那打印机在打印输出完成了之后 会向cpu发送中断信号
用来通知cpu 我的任务已经完成了
接下来 cpu会用这个中断信号相对应的内核程序来对这个中断信号进行处理
总之呢 我们这儿提到的这两种中断
中断的信号都来自于cpu的外部 和当前执行的指令是没有关系的
cpu在每一个指令执行结束的时候 都会例行的检查一下是否有外部中断的信号 需要我来处理
好的 那么刚才我们列举了一些内中断和外中断的例子
相信通过这些例子 大家可以更直观的感受到中断这种机制 它的一个强大的作用
那我们要分辨一个中断是内中断还是外中断 只需要判断这个中断信号的产生和当前执行的指令是否有关就可以了
那刚才我们讲解的过程中 使用的是内中断和外中断这两个数据
因为内外这两个形容词 可以让大家很形象的理解到他们俩之间的一个本质的区别
不过其实在很多教材还有很多学校的考试当中 内中断一般会称为异常 外中断一般就直接称为中断
所以考试当中遇到的中断 一般来说是这个狭义的中断 他特指外中断
而我们这个小节当中之前一直在说的中断 其实指的是这种广义的中断
所以大家要理解他们的区别 可以用内外这两种方式来
理解 但是在做题的过程当中 更需要注意的是中断和异常这两个术语
那在接下来的讲解中 我们会经常使用到异常这个术语 大家需要知道 他其实指的就是内中断
那么 异常又可以进一步的划分为这样的三种 第一种叫做陷入trap
这个其实就是刚才我们所提到的 由陷入指令引发的那种异常
其实 这种异常是程序故意引发的 当一个程序想要请求操作系统的服务的时候 他就会故意的执行这一条指令
那其实这也是系统调用实现的一个原理 而系统调用的内容 我们会在下一小节再继续展开
第二种异常称为故障 故障是一种由错误条件引起的并且可能被内核程序修复的问题
内核程序修复故障之后 会把cpu的使用权还给应用程序 让他继续执行下去
比如说 我们在第三章当中会学习到的缺页故障
那这个地方大家暂时理解不了没有关系 等学完了第三章再回来细细品味 第三种异常叫做终止
终止是由致命的错误引起的
这种错误一般是内核程序无法修复的
所以 一般来说 当发生了这种类型的异常之后 内核程序就不会再把cpu的使用权还给
引发终止的那个应用应用程序一般来说会直接的把这个应用程序直接给干掉 让它终止掉
比如说 刚才我们提到了两个例子 整数除以零
这种错误 那其实就是程序bug 也不是操作系统能够修复的 那是程序本身的问题
或者非法的使用特权指令 那这样的程序也应该直接把它干掉 不应该再把cpu的使用权再还给他 所以这是第三种终止
那异常 或者说内中断的这三种分类方式大家需要注意一下 曾经考过
那么 那么以上就是中断的一个分类 那么接下来我们要简单的介绍一下中断机制背后的基本原理
刚才我们举了各种各样的中断的例子
有的中断是整数除以零有的中断是始终部件引起的 而有的中断又是应用程序自己引发的
那很显然 这么多的中断的类型
不可能用同一个程序来处理 所以cpu会根据中断信号的不同
来找到和这个中断信号相对应的中断处理程序
那具体的做法是 cpu在检测到中断信号之后 会根据这个中断信号的类型来查询中断向量表
然后通过这个中断向量表 找到各种类型的中断所对应的中断处理程序
很显然 我们之前讲了那么多例子 大家应该也能够想到
中断处理程序 它其实就是一种内核程序 肯定是需要运行在内核态的
那么其实这就是中断机制的一个基本的实现原理 但是具体的硬件上应该怎么实现 这是计算机组成原理那门课
要教大家的 如果不考那门课的同学其实理解到这儿就差不多了
好的 那么这个小节当中 我们介绍了中断和异常
中断的作用十分重要 它是让cpu从用户态变回内核态的一种唯一的方式
它是让操作系统强行的夺回cpu控制权的一种方式
在引入了中断机制之后 才能让操作系统正常的工作 才能实现多道程序并发运行这个美好的事情
那中断的分类这个知识点 大家可以在根据课后的习题进行巩固
最后 我们简要的提了一下中断机制的基本实现原理 总之
分为这样的两个步骤 cpu首先会检查中断信号
那对于内中断信号来说 是cpu在执行指令的时候就会进行检查的 他会检查是否有异常的发生
而外中断信号的检查
是在每个指令周期的末尾 也就是cpu每执行完一条指令之后 他都会例行的来检查是否有外部中断信号需要处理
而当cpu检测到一个中断信号之后 又会根据这个中断信号来查询中断向量表
然后找到这个类型的中断信号所对应的中断处理程序来进行处理
好的 那么以上就是这个小节的全部内容（听·见计划字幕制作者：吴昊旻最帅）