硬中断:
1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。
2. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。
软中断:
软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。
通常,把取出指令并执行所用的时间称为一个指令周期。不同指令的功能不同,因此所包含的执行步骤不一样。不考虑指令译码这个步骤,不管是简单指令还是复杂指令,其包含的执行步骤总是可以分解成以下4种基本操作,也即每条指令的功能总是由以下4种基本操作功能组合而成。
(1)读取某存储单元内容装入给定寄存器。
(2)把一个数据从某个寄存器存入给定的存储单元中。
(3)把一个数据从某个寄存器送到另一个寄存器或者ALU输入端。
(4)进行某种算术运算或逻辑运算,将结果送入某个寄存器。
因此,若比较每个步骤的执行时间,则只要比较上述4种操作的时间即可,显然第(3)种操作的执行时间最短,速度最快。
一种是“中断请求”,一种是“中断处理结束”。
如果理解成前者,选项B的含义就是“CPU在等待中断请求的过程中,不可以处理其他任务”,这显然是错误的。CPU在执行程序的过程中,总是在执行完一条指令、取下条指令之前,去主动检测“中断请求信号”,若发现有中断请求,则执行一条“中断隐指令”,以响应中断请求。
如果理解成后者,选项B的含义就是“CPU在等待中断处理结束的过程中,不可以处理其他任务”,这也是错误的。
CPU响应中断请求后,就会跳转到一个中断服务程序去执行,以进行中断处理。不同的中断类型具有不同的中断服务程序,进行不同的中断处理。有些中断处理非常简单,例如“打印机缺纸”,其中断服务程序只要在屏幕上显示一个消息即可;有些中断处理则比较复杂,例如,对于采用中断方式进行打印输出的情况,中断服务程序中需要启动外设进行I/O,通常在发出启动外设的命令后进行中断返回,以回到原先被中止的另一个进程代码去执行。
首先是对“程序代码的运行时间”和“同一段代码”如何理解的问题。
操作系统在对处理器进行调度时,一段时间内往往会让多个程序(更准确地说是进程)轮流使用处理器,因此在某个用户程序执行过程中,可能同时还会有其他用户程序和操作系统程序在执行,所以,用户感觉到的某个程序的执行时间并不是其真正的执行时间。通常把用户感觉到的执行时间分成以下两部分:CPU时间和其他时间。CPU时间指CPU用于程序执行的时间,它又包括以下两部分:
(1)用户CPU时间,指真正用于运行用户程序代码的时间;
(2)系统CPU时间,指为了执行用户程序而需要CPU运行操作系统程序的时间。
其他时间指等待I/O操作完成的时间或CPU用于执行其他用户程序的时间。
计算机系统的性能评价主要考虑的是CPU性能。系统性能和CPU性能不等价,两者有一些区别。系统性能是指系统的响应时间,它与CPU外的其他部分也有关系;而CPU性能是指用户CPU时间,它只包含CPU运行用户程序代码的时间。
因此,对“程序代码的运行时间”可以理解为程序代码中每条指令执行时间总和,也可以理解为程序代码运行过程中用户感觉到的执行总时间(包括操作系统代码和穿插在其中的其他程序代码运行时间)。如果理解为后者,那么很可能因为每次运行环境的不同,使得用户感觉到的执行总时间可能不一样。因此,选项C是错误的。
如果理解为前者,那么,还要看选项中的“同一段代码”指的是什么含义,才能确定选项C是否正确。如果“同一段代码”中代码指的可执行文件中一段静态的指令序列(例如一段循环执行的指令序列),那么可能会因为每次执行这段代码时变量的值的不同(例如循环终止条件变量的值不同),导致程序在执行时所执行的指令条数不同(循环执行次数不同),因而使得每次运行该段代码过程中指令执行的总时间不同。所以,选项C是错误的
显然,只有将“程序代码的运行时间”理解为程序代码中每条指令执行时间总和,并且,将“同一段代码”理解成每次运行程序代码过程中在CPU上所执行的指令序列完全相同,那么,选项C才是正确的。显然,对选项C的描述作这种解读有点牵强。
选项 D 中 的“软中断”应该特指Intel架构中的“int n”指令,执行该指令后,CPU会根据中断类型号n,到中断向量表(实地址模式)或中断描述符表(保护模式)中,取出相应的中断服务程序执行,执行结束后再回到“int n”指令后面一条指令执行。因此,“int n”指令的执行相当于引起了一次对现行程序的“中断”事件,这里“int n”指令显然是事先安排在软件中的,属于软件触发的事件。因而选项D的描述是正确的。
不同的计算机体系结构和教科书对“异常”和“中断”定义的内涵不同。例如,PowerPC体系结构用异常表示各种意外事件,而用中断表示程序正常执行的控制流被改变;Intel 早期的8086/8088架构不区分异常和中断,把两者统称为中断,由CPU内部产生的异常称为内中断,通过中断请求线INTR和NMI从CPU外部发出的中断请求为外中断,但Intel后来的处理器架构中又将内中断称为“异常”,而把外中断特指为“中断”。
如果将选项 D 的描述中所提的“中断”理解为特指的外中断的话,选项 D 就是错误的,因为“ int n ”指令的执行不会通过中断请求线向 CPU 发中断请求,这种软中断不属于外中断,而是一种内部的“异常”。