中断与异常
- 导读
- 一、中断机制
-
- [1.1 中断机制的重要性](#1.1 中断机制的重要性)
- 二、中断与异常的基本概念
-
- [2.1 中断与异常的个人理解](#2.1 中断与异常的个人理解)
- [2.2 内中断与外中断](#2.2 内中断与外中断)
- 三、中断与异常的分类
- 四、中断与异常的处理过程
- 结语
导读
大家好,很高兴又和大家见面啦!!!
在上一篇内容中我们介绍了处理器的运行模式。在计算机系统中,CPU通常会执行两种不同性质的程序:
- 内核程序------当CPU处于核心态时执行的程序,此时CPU能够执行特权指令
- 应用程序------当CPU处于用户态时执行的程序,此时CPU能够执行非特权指令
大多数操作系统的内核包括4个方面的内容:
- 时钟管理
- 中断机制
- 原语
- 系统控制的数据结构及处理
在这些内容中,中断机制的引入的初衷是提高多道程序运行环境中CPU的利用率,而且主要是针对外部设备的。后来逐步得到发展,形成了多种类型,称为操作系统各项操作的基础。
那么在操作系统中,中断机制究竟是如何工作的呢?在今天的内容中,我们将会探讨一下操作系统中的中断与异常;
一、中断机制
在操作系统中引入核心态与用户态这两种工作状态后,就需要考虑这两种状态之间如何切换。操作系统内核工作在核心态,而用户程序工作在用户态。系统不允许用户程序实现核心态的功能,而它们又必须使用这些功能。因此需要在核心态建立一些"门",以便实现从用户态进入核心态。
在实际操作系统中,CPU运行上层程序时唯一能进入这些"门"的途径就是通过中断或异常。
发生中断时,运行用户态的CPU会立即进入核心态,这是通过硬件实现。
程序状态寄存器
PSW
,专门用来记录CPU此时的工作状态,当寄存器存储的值为0时,表示CPU此时为核心态,当寄存器存储的值为1时,表示CPU此时为用户态。若要从用户态进入核心态,只需要将寄存器的值从1改为0即可
同理,从核心态进入用户态,只需将寄存器的值从0改为1即可
中断时操作系统中一个非常重要的概念,对一个运行在计算机上的实用操作系统来说,缺少了中断机制,将是不可想象的。
1.1 中断机制的重要性
在前面的内容中我们知道了操作系统的4个特征------并发、共享、虚拟、异步。并且在这4个特征中并发与共享是操作系统的最基本的特征。
而对于操作系统来说,程序能够并发运行的前提就是中断机制。
当一道程序开始运行时,它势必就会占用一定的计算机资源。设想一下,如果程序在运行的过程中无法中断,只能够等到程序运行结束才能继续运行下一个程序,那对于操作系统而言,还会存在多道程序并发运行的情况吗?
在前面我们也提到过,当操作系统不需要进行并发运行多道程序时,那也就不存在程序与程序之间的计算机资源的争抢问题,那么也就代表不存在共享计算机资源。没有并发与共享,那也就不存在虚拟与异步。
因此我们说中断机制是操作系统中一个非常重要的概念,有了中断机制,才有了操作系统的并发、共享、虚拟、异步这些基本特征。
由操作系统的发展历程我们也能够感受到,操作系统的发展过程实际上就是一个想方设法不断提高资源利用率的过程。而提高资源利用率就需要在程序并未使用某种资源时,把它对那种资源的占有权释放,而这一行为就需要通过中断机制来实现。
二、中断与异常的基本概念
中断(Interruption)也称外中断,是指来自CPU执行指令外部的时间,通常用于信息输入/输出,如设备发出的I/O结束中断,表示设备输入/输出处理已经完成。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。
异常(Exception)也称内中断,是指来自CPU执行指令内部的事件,如程序的非法操作码、地址越界、运算溢出、虚存系统的缺页及专门的陷入指令等引起的事件。异常不能被屏蔽,一旦出现就应立即处理。
2.1 中断与异常的个人理解
外中断,我们可以理解为是操作系统的主动中断机制。
- 比如,当我们要使用打印机打印一份文件时,当文件打印完后,打印机就已经完成了它的任务,不需要继续启动了,这时程序就会终止打印机的运行并释放该资源的占用;
- 再比如,当我们假设当前操作系统下预设的程序一次运行的时间为
50ms
,那么,当有多道程序在运行时,当程序1运行了50ms
后,程序1的运行就会被操作系统主动中断,操作系统会开始执行程序2;同理,对于程序3、程序4......都是同样的运行方式。因此,在一整个时间周期中,每一道程序都会通过操作系统主动中断的方式来按照固定的时间片来进行运行,
内中断,我们则可以理解为操作系统的被动中断机制。
这里的被动最直观的感受就是程序运行错误。在C语言中,我们在编写程序时遇到过各种各样的错误,并且无一例外,每一次遇到错误时,程序都无法正常运行,而是会直接终止。
比如我们熟悉的数组越界的问题,栈溢出的问题,空指针的解引用问题,算术溢出的问题,赋值左值为不可修改对象的问题......
当我们遇到这些问题时,如果程序不能及时停下来处理这些问题的话,那产生的结果将会是我们无法想象的。因此这些异常不能被屏蔽,并且只要出现,就必须立即进行处理。
2.2 内中断与外中断
可能有朋友在读完上一部分我对中断与异常的个人理解后开始有点犯迷糊了,现在脑海中可能会存在一个疑问:为什么主动中断机制是被称为外中断,既然是主动不应该是内中断吗?而被动中断机制又被称为内中断,那不应该是外中断吗?这真是奇奇怪怪的理解。
实际上这里的内外指的是中断信号的产生源头。
对于外中断来说,它的中断信号主要来自于CPU的外部,我们可以理解为是操作系统的预设信号,如时钟管理,当程序的运行完一个时间片后,中断信号会由时钟部件产生,然后发送给CPU,CPU在接受到外部的中断信号后,会主动的执行中断操作。因此,我将外中断理解为的是操作系统的主动中断机制,但是这里的外指的是来自CPU外部的中断信号;
对于内中断来说,它的中断信号主要来自于CPU的内部,比如当CPU在正常运行的过程中,出现了不正常的操作时,操作系统为了避免引发未知的错误,所以被迫通过中断机制来处理这一不正常的操作,因此内中断也被称之为异常。这也就是为什么我将内中断理解为操作系统的被动中断机制,完全就是因为CPU内部产生的中断信号,并不是操作系统需要的信号,操作系统的中断操作是被迫执行的。
三、中断与异常的分类
外中断可分为可屏蔽中断和不可屏蔽中断。
-
可屏蔽中断指的是通过
INTR
线发出的中断请求,通过改变屏蔽字可以实现多重中断,从而是得中断处理更加灵活。 -
不可屏蔽中断是指通过
NMI
线发出的中断请求,通常是紧急的硬件故障,如电源掉电等。此外,异常也是不能被屏蔽的。
异常可分为故障、自陷和终止。
- 故障(Fault)通常是有指令执行引起的异常,如非法操作码、缺页故障、除数为0、运算溢出等。
- 自陷(Trap)是一种事先安排的"异常"事件,用于在用户态下调用操作系统内核程序,如条件陷阱指令。
- 终止(Abort)是指出现了使得CPU无法继续执行的硬件故障,如控制器出错、存储器校验错等。
故障异常和自陷异常属于软件中断(程序性异常),终止异常和外部中断属于硬件中断。
四、中断与异常的处理过程
中断和异常的处理过程的大致描述如下:
当CPU在执行用户程序第i条指令时检测到一个异常事件,或在执行第i条指令后发现一个中断请求信号,则CPU打断当前的用户程序,然后转到相应的中断或异常处理程序去执行。若中断或异常处理程序能够解决相应的问题,则在终端或异常处理程序的最后,CPU通过执行中断或异常返回指令,回到被打断的用户程序的第i条指令或第i+1条指令继续执行;若中断或异常处理程序发现时不可恢复的致命错误,则终止用户程序。
通常情况下,对中断和异常的具体处理过程由操作系统(和驱动程序)完成。
结语
在今天的内容中我们介绍了操作系统中的中断与异常:
- 中断也称外中断,是操作系统的主动中断机制
- 异常也称内中断,是操作系统的被动中断机制
中断机制对于操作系统而言是十分重要的一个机制。正因为有了中断机制,才有了操作系统的并发、共享、虚拟与异步这些特征。
在外中断中,可以分为两种类型的中断:
- 可屏蔽中断------如时钟中断、I/O中断请求等
- 不可屏蔽中断------紧急的硬件故障,如电源掉电等
在内中断中,可以分为3中类型的中断:
- 故障(Fault)------由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给引用程序,让它继续执行下去,如缺页故障。
- 自陷(Trap)------由陷入指令引发,是应用程序故意引发的
- 终止(Abort)------由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该引用程序。如整数除0,非法使用特权指令等。
外中断的过程我们可以理解为,当CPU执行用户程序时,接收到了外部发送过来的中断信号,之后由操作系统主动执行中断操作的过程;
内中断的过程我们可以理解为,当CPU执行用户程序时,CPU内部因为某种原因,产生了中断信号,之后由操作系统被动执行中断操作的过程;
今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《系统调用》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!