无论是桌面PC操作系统还是嵌入式都是多任务的操作系统,而很遗憾,处理器往往是单个的,即便在硬件成本逐渐下降,而硬件配置直线上升的今天,PC机的核心可能已经达到4核心,8核心,而手机移动设备更不可思议的达到16核心,32核心,处理器的数量依然不可能做到每个任务一个CPU,所以CPU必须作为一种全局的资源让所有任务共享。说到共享,如何共享呢?什么时候给任务A用,什么时候给任务B用......这就是进程调度,具体的安排就由调度算法决定了。进程如何去调度?现代操作系统一般都是采用基于时间片的优先级调度算法,把CPU的时间划分为很细粒度的时间片,一个任务每次只能占用这么多的时间,时间到了就必须交出使用权,换由其他的任务使用。这种要看操作系统的定时器机制了。那么时间片到之后,系统做了什么呢?这就要用到我们的中断了,时间片到了由定时器触发一个软中断,然后进入相应的处理历程。当然这一点不足以表明中断的重要性,计算机操作系统自然离不开外部设备:鼠标、键盘、网卡、磁盘等等。就拿网卡来讲,计算机并不知道什么时候数据包会来到,能保证的就是数据来了能正常接收就行了。但是我又不可能一直等着接收数据包,要是这样其他任务就死完了。所以合理的办法是,你数据包来到之后,通知我,然后我再对你处理,怎么通知呢?答:中断!
定义:
(广义的)指CPU对突发的外部事件的反应过程或机制。CPU收到外部信号(中断信号)后,停止当前工作,转去处理该外部事件,处理完毕后回到原来工作的中断处(断点)继续原来的工作。中断信号来自外围硬件(相对于CPU和内存)的异步信号或来自软件的同步信号。
引入中断的目的
- 实现并发活动
1. CPU和外设并发工作:当外设工作完毕,产生信号通知CPU,让CPU处理外部事件;
2. 两个进程并发运行:通过时钟的切换,进程并发使用CPU,时钟产生一个中断信号通知CPU将使用权切换到另一进程
- 实现实时处理
实时系统中处理机随时响应并进行处理各种监测和控制装置随机向处理机发出的中断请求
- 故障自动处理
处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据
中断的一些概念
中断源:
引起中断的事件或原因,或发出中断申请的来源。
中断类型:
- 外中断(Interruption):指来自CPU执行指令以外的事件的发生,如设备发出的I/O结束中断,表示设备输入/输出处理已经完成,希望处理机能够向设备发下一个输入 / 输出请求,同时让完成输入/输出后的程序继续运行。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。这一类中断通常是与当前程序运行无关的事件,即它们与当前处理机运行的程序无关。 外中断又可分为不可屏蔽中断、可屏蔽中断。对于不可屏蔽中断,CPU必须无条件响应,而对于可屏蔽中断,CPU可以响应,也可以不响应,CPU一般设置两根中断请求线:可屏蔽中断请求INTR(Interrupt Require)和不可屏蔽中断请求NMI(NonMaskable Interrupt)。对于可屏蔽中断,除了受本身的屏蔽位控制外,还都要受一个总的控制,即CPU标志寄存器中的中断允许标志位IF(Interrupt Flag)的控制,IF位为1,可以得到CPU响应,否则,得不到响应。
- 内中断:也称为异常(exception),是由CPU内部事件所引起的中断,例如进程在运算中发生了上溢或者下溢,有如程序出错,如非法指令,地址越界等。通常把这类中断称为内中断或者陷入。若系统发现有陷入事件,CPU也将暂停正在执行的程序,转去执行该陷入事件的处理程序。
断点:
程序中断的地方,将要执行的下一指令的地址。
现场(上下文)Context
用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
中断信号由外部设备发起,准确来说是由外部设备的控制器发起,因为外部设备本身并不能发起信号。硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。
现场的保护:进入中断服务程序之前,栈
现场的恢复:进入中断服务程序之后,栈
中断的响应过程
中断响应的实质
中断响应的实质是交换CPU的模式和交换指令执行地址和处理器状态,以达到如下目的:
1、保留及恢复程序断点及有关信息。
2、自动转入相应的中断处理程序执行。
参考: 华中科技大学软件学院苏曙光老师的操作系统原理课程