CHS_02.1.3.2+中断和异常

简介: CHS_02.1.3.2+中断和异常



在这个小节中 我们会学习中断和异常相关的知识点 那首先我们会介绍中断的作用 这其实在上小节当中也有提到过

只不过由于这个内容十分重要 所以还是愿意做一个复读机 另外 我们会介绍一下

中断有哪些类型

大致上可以分为内中断和外中断两种 内中断又可以称为异常 最后我们会简单的介绍一下中断这种机制 它实现的一个具体的原理

那首先来看下

中断的作用

在上小节中 我们已经学习到了 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的使用权让给应用程序一然后应用程序一就可以接着往下执行他之后的那一系列的指令了

所以刚才的这个故事中 我们就很清晰的看到了两个应用程序是如何在中断机制的支持下实现并发运行的

一直不断的相互切换 所以可以看到中断在现代的这个计算机当中到底有多大的作用

那除了这个时钟部件发出的中断信号之外 有时候还会有来自于设备 也就是input output 也就是输入输出设备发来的这种中断信号

比如说 某一个应用程序可能会请求打印机的打印服务 那打印机在打印输出完成了之后 会向cpu发送中断信号用来通知cpu我的任务已经完成了

接下来 cpu会用这个中断信号相对应的内核程序来对这个中断信号进行处理

总之呢 我们这儿提到的这两种中断 中断的信号都来自于cpu的外部 和当前执行的指令是没有关系的

cpu在每一个指令执行结束的时候 都会例行的检查一下是否有外部中断的信号需要我来处理

好的 那么刚才我们列举了一些内中断和外中断的例子 相信通过这些例子大家可以更直观的感受到中断这种机制它的一个强大的作用

中断的分类

那我们要分辨一个中断是内中断还是外中断 只需要判断这个中断信号的产生和当前执行的指令是否有关就可以了

那刚才我们讲解的过程中使用的是内中段和外中段这两个数据 因为内外这两个形容词可以让大家很形象的理解到他们俩之间的一个本质的区别

不过 其实在很多教材还有很多学校的考试当中 内中段一般会称为异常 外中段一般就直接称为中段

所以考试当中遇到的中断 一般来说是这个狭义的中断 它特指外中断 而我们这个小节当中之前一直在说的中断 其实指的是这种广义的中断

所以大家要理解他们的区别 可以用内 外这两种方式来理解 但是在做题的过程当中 更需要注意的是中断和异常这两个术语

那在接下来的讲解中 我们会经常使用到异常这个术语 大家需要知道 他其实指的就是内中断

那么 异常又可以进一步的划分为这样的三种 第一种叫做陷入trap

这个其实就是刚才我们所提到的 由陷入指令引发的那种异常

其实 这种异常是程序故意引发的 当一个程序想要请求操作系统的服务的时候 他就会故意的执行这一条指令

那其实这也是系统调用实现的一个原理 而系统调用的内容 我们会在下一小节在

继续展开 第二种异常称为故障故障 是一种由错误条件引起的

并且可能被内核程序修复的问题 内核程序修复故障之后 会把cpu的使用权还给应用程序 让他继续执行下去

比如说我们在第三章当中会学习到的缺液故障 那这个地方大家暂时理解不了 没有关系 等学完了第三章再回来细细品味

第三种异常叫做终止 终止是由致命的错误引起的

这种错误一般是内核程序无法修复的 所以一般来说 当发生了这种类型的异常之后

内核程序就不会再把cpu的使用权还给引发终止的那个应用应用程序

一般来说 会直接的把这个应用程序直接给干掉 让它终止掉 比如说 刚才我们提到两个例子

整数除以零这种错误 那其实就是程序bug 也不是操作系统能够修复的 那是程序本身的问题

或者非法的使用特权指令 那这样的程序也应该直接把它干掉 不应该再把cpu的使用权再还给他

所以这是第三种 终止那异常 或者说内中断的这三种分类方式 大家需要注意一下 曾经考过

那么 那么以上就是中断的一个分类 那么接下来我们要简单的介绍一下

中断机制背后的基本原理

刚才我们举了各种各样的中断的例子 有的中断是整数除以零有的中断是始终部件引起的

而有的中断又是应用程序自己引发的 那很显然这么多的中断的类型不可能用同一个程序来处理 所以cpu会根据中断信号的不同

来找到和这个中断信号相对应的中断处理程序 那具体的做法是 cpu在检测到中断信号之后 会根据这个中断信号的类型来查询中断限量表

然后通过这个中断向量表 找到各种类型的中断所对应的中断处理程序

很显然 我们之前讲了那么多例子 大家应该也能够想到中断处理程序 它其实就是一种内核程序 肯定是需要运行在内核态的

那么其实这就是中断机制的一个基本的实现原理 但是具体的硬件上应该怎么实现 这是计算机组成原理 那门课要教大家的

如果不考那门课的同学其实理解到这儿就差不多了 好的 那么这个小节当中 我们介绍了中断和异常

中断的作用十分重要 它是让cpu从用户态变回内核态的一种唯一的方式 它是让操作系统强行的夺回cpu控制权的一种方式

在引入了中断机制之后 才能让操作系统正常的工作 才能实现多道程序并发运行这个美好的事情

那中断的分类这个知识点大家可以在根据课后的习题进行巩固 最后我们简要的提了一下中断机制的基本实现原理

总之 分为这样的两个步骤 cpu首先会检查中断信号 那对于内中断信号来说 是cpu在执行指令的时候就会进行检查的

他会检查是否有异常的发生 而外中断信号的检查是在每个指令周期的末尾 也就是cpu每执行完一条指令之后 他都会例行的来检查是否有外部中断信号需要处理

而当cpu检测到一个中断信号之后 又会根据这个中断信号来查询中断向量表

然后找到这个类型的中断信号所对应的中断处理程序来进行处理

回顾

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关文章
|
6月前
start.S详解学习(六):异常中断处理
start.S详解学习(六):异常中断处理
67 0
打印全部异常堆栈、ExceptionUtils.getFullStackTrace这样最快
打印全部异常堆栈、ExceptionUtils.getFullStackTrace这样最快
338 0
|
调度
中断异常和系统调用
中断异常和系统调用
151 0
|
6月前
start.S详解学习(三):关闭中断
start.S详解学习(三):关闭中断
63 0
|
编译器
中断的解析
中断的解析
96 0
|
传感器 Windows
关于单片机编程里面调用sprintf死机的解决方法及原因分析
关于单片机编程里面调用sprintf死机的解决方法及原因分析
508 0
|
存储 程序员 调度
中断和异常
中断和异常
|
存储 芯片 开发者
E906的异常和中断|学习笔记
快速学习 E906的异常和中断
842 0
E906的异常和中断|学习笔记
C中得到4号错误(中断),怎么办
C中得到4号错误(中断),怎么办
87 0
|
监控 安全 Java
关闭线程的正确方法:“优雅”的中断
前文从任务到线程:Java结构化并发应用程序中介绍了如何安排任务启动线程。 线程在启动之后,正常的情况下会运行到任务完成,但是有的情况下会需要提前结束任务,如用户取消操作等。
1399 0