中断是指CPU接受到的来自硬件或软件的信号,提示CPU发生了某件事情并中止现行程序的执行。中断信号分为内中断信号和外中断信号两种。内中断信号又叫异常,与当前执行指令有关,来自CPU内部;外中断信号,与当前执行指令无关,来自CPU外部。
因为中断是一种由CPU接收的信号,那我们就不得不了解一下CPU。CPU有两种工作状态,一种是用户态(又叫目态),另一种是核心态(又叫管态)。单核CPU一次只能执行一个程序,运行在CPU核心态的程序我们把它成为内核程序,运行在CPU用户态的程序我们把它称为应用程序。
OK,了解完上述基础概念后,我们就能来认识一下系统调用了。维基百科上说,系统调用是指运行在用户态的程序向操作系统内核(操作系统的内核程序运行在核心态)请求需要更高权限运行的服务,也就是说系统调用是一种由用户态程序发出的请求。用户态的程序通过进程调用的方式,向操作系统提出服务请求,由操作系统代为完成。
这种请求是通过内中断信号告诉操作系统的,因此系统调用本质上就是一种内中断信号:用户程序传递系统调用参数,在用户态下执行访管指令(访管指令是唯一一个只能在用户态下进行,不能在核心态执行的指令),执行访管指令后,进程发出一个内中断信号。CPU收到内中断信号后,立刻从用户态切换为核心态(注意:中断是使CPU从用户态进入核心态的唯一途径),CPU的使用权限交给操作系统,操作系统内核程序负责对中断信号进行处理。中断信号告诉操作系统刚刚运行的程序想要更高权限的服务(与资源有关的服务,如当前父进程想创建一个子进程),操作系统处理系统调用的相关代码运行在核心态。
了解完系统调用,我们再了解一下进程调度与进程切换。在了解这两个概念之前,我们需要先知道什么是进程。进程最简单的理解就是一个程序的执行过程,则进程就会像CPU一样有若干种状态。在这里我们只简单说明进程其中的三种状态:就绪态(除CPU外的其他资源都有,只差一个CPU就能执行),运行态(此进程正在运行,其他资源与CPU都有),阻塞态(既没其他资源又没CPU)。三种进程状态的转换图如下:
就绪态的进程组成一个就绪队列,等待处理机调度。
进程调度是指按照某种算法从处于就绪态就绪队列的进程中选择一个为其分配处理机,进程切换是指换一个进程让处理机处理。是不是觉得这两个概念很相似,别急,下面详细说明:
狭义的进程调度指的是在选择进程的时候,当前选中的进程可能是刚执行完的进程,也可能是另一个进程。进程切换指的是换一个进程让处理机处理,那么选择进程的时候,当前选中的进程必然不是刚刚被中断的进程,而是就绪队列中的另一个进程。广义的进程调度包括选择一个进程与进程切换两个步骤。举个例子:进程调度类似大家开会选领导班子,进程切换是真正的上任,新旧交接的过程。先开会再上任。开会结果表示你是主席,不代表开完会你就是了,只是先决条件有了,流程还是要走的(真正上任)。下面一张图帮助大家更好理解进程调度与进程切换的关系:
进程切换的过程主要完成了:1.对原来运行数据的保存(对原来官员的政绩不能抹去) 2.对新进程数据的输入(对新官员能力的介绍)
进程切换意味着当前运行程序要离开CPU,离开CPU的原因有两种:主动离开,如等待I/O设备,进程从运行态进入阻塞态;被动离开,当前进程被分配的时间片已到,换另一个进程上处理机(进程切换),进程从运行态进入就绪态,注意:进程不管出于哪种原因离开CPU,都需要硬件(如I/O设备,计时部件)或软件(如当前运行的进程)发出中断信号告知CPU,CPU的使用权限被交给操作系统,由操作系统介入完成对中断信号的处理。这也就意味着进程切换必然导致CPU从用户态进入核心态。
那么,中断和进程切换有什么关系呢?
答:中断是进程切换的必要不充分条件,即发生进程切换一定发生了中断,但发生中断不一定发生了进程切换。
解释这个答案之前,我们需要先知道中断是如何影响进程切换的。假设CPU正在运行一个程序,如果没有中断,那么CPU只能一直运行这一个进程,如果来了一个中断信号,CPU就会派操作系统执行中断信号对应的中断程序(核心态),处理完后,CPU就执行另一个程序或原先被暂停的程序(用户态)。现代操作系统通过时钟部件为进程切换提供时机,时钟部件和CPU是独立的两个部件(目前CPU都内置计时器,但我们就认为时钟部件是个外部硬件),时钟部件通过计数器(计时器)定期向CPU发出外中断信号。在CPU执行指令时,计数器同时在计时,当计数器溢出,就向CPU申请中断,如果CPU响应中断,CPU就转到核心态对中断进行处理,执行完了再返回原程序或另一个程序。时钟中断需要满足两个条件:1.允许中断源(时钟部件等)申请中断 2.允许CPU响应(搭理)中断。举个例子,你在上课,相当于主程序,这时下课铃响了,你就不读书了,跑出去玩了(离开CPU)。你上课(执行程序)和打铃(时间部件)没关系,并不是你让打铃的,学校的时钟不停地走,到了时间自动打铃,同样不受你上课的影响。但是如果你把耳朵堵上(不允许CPU响应(搭理)中断),就是铃打碎了你也不知道要下课了,你就一直读书(执行)。要让你停止读书有两个条件:1.允许铃声响 2你听得到铃声。
OK,那为什么说发生了进程切换就一定发生了中断?假设在T1到T2的某个时刻发生了进程切换,则在T1-T2时刻一定发生了处理机调度程序(分配处理机的程序,发生在核心态),(中断在前,处理机调度程序在后,这与中断处理时无法进行处理机调度(因为中断恢复所需要的所有数据都保存在被中断进程的内核栈中,如果发生切换就找不到之前被中断的进程了,使得被中断的程序无法恢复)并不矛盾)说明在T1到T2时刻之间处理机曾由用户态转换到核心态。由于中断是使CPU从用户态进入核心态的唯一途径,所以T1到T2必然发生了中断。发生中断后,操作系统对中断程序处理完后,不一定会执行另一个进程,而是执行原先被暂停的进程。所以中断是进程切换的必要不充分条件。
同样,中断也是进程调度的必要不充分条件,即发生中断并不一定会导致进程调度。
中断是一种异步事件,当中断发生时,CPU 需要暂停当前执行的进程,转而处理中断请求。中断处理完成后,操作系统需要决定如何继续执行进程。在这个过程中,操作系统可能会进行进程调度,也可能不会:1. 如果操作系统处理完中断后,仍然认为原来的进程具有执行的优先权,那么操作系统会继续执行原来的进程。在这种情况下,虽然操作系统确实进行了决策(进行了进程调度),但因为选择的仍然是原来的进程,所以可以认为没有发生进程调度。
2. 如果操作系统处理完中断后,认为其他进程具有更高的优先权,那么操作系统会进行进程调度,选择一个新的进程来执行。
所以,发生中断并不一定会导致进程调度。这取决于操作系统在处理完中断后,如何评估各个进程的优先级和执行需求。