- 为什么需要中断
- 外部中断
- 内部中断
- 中断向量表
操作系统-中断
为什么需要中断中断其实就是在CPU正在做某件事的时候,收到了通知告诉CPU你要放下手头现在做的事,去处理另一件事(当然这个是立即处理还是过一会处理以及如何处理取决于中断的类型)。
中断可以提高操作系统运行的效率,有了中断系统才能并发运行。
并发是指单位时间内处理的工作量,比如每秒并发数是100,意思是指1s内CPU处理的请求总量是100个。
并行是指同时真正的一起运行,比如并行量100,是指任意瞬间同时有100个请求发送。因此对于单核CPU来说只谈并发,多核CPU才配谈并行。
假设你是一个资深vloger,此时你正在对视频进行合成渲染,在等待合成的过程中你同时在整理下一期视频的文案拍摄场景,这在你看来一切理所应当,其实都是中断都在替你负重前行。
假设没有中断,视频在合成的时候你啥事也干不了,你只能去泡壶茶躺平等他结束然后开始你的下一步工作,这会极大的降低你的效率。
操作系统本质上就是个死循环,但是这个死循环只是为了保证操作系统周而复始的运行下去,而运行的目的就是为了等待某件事情的发生,当事件(中断)发生时去做响应的工作,操作系统是中断驱动的。
外部中断外部中断是指来自CPU外部的中断,外部的中断源必须是硬件,因此外部中断又称为硬件中断。
CPU如何收到来自外部的中断呢?
外部中断是通过两根信号线通知CPU的,这两根信号线是INTR和NMI,通过INTR总线进来的是可屏蔽中断,NMI总线进来的是不可屏蔽中断。
可屏蔽中断和不可屏蔽中断的区别是什么?
可屏蔽中断是通过INTR信号线进入CPU,外部硬件设备产生的中断CPU可以理会,可以不理会,因为此类中断不会让操作系统宕机。
不可中断是指通过NMI信号线进入CPU,表示系统中出现了致命的错误,此类错误会导致操作系统宕机,因此不可以屏蔽,必须进行响应的处理。
可屏蔽中断处理程序为什么要分为上下部分?
当CPU同意理会外部设备中断时,不一定会完整的执行中断处理程序,而是把中断处理程序分为上下两部分。
操作系统是基于中断驱动,因此我们希望中断处理程序执行的越快越好,因此把立即执行的部分划分到上半部分,这部分是要限时执行的,这部分程序通常只完成中断应答和硬件复位等关键动作。
不紧急的部分被划分到下半部分,在下半部分在执行的时候,如果有新的中断发生,此时这个旧中断的下半部分会被换下CPU,先执行新中断处理程序的上半部,然后在等待线程调度机制将其调度到CPU上完成下半部分的执行。
内部中断内部中断可以说是来自CPU执行过程中产生的中断,分为软中断和异常。
什么是软中断?
软中断就是由软件主动发起的中断,并不是某种内部错误。
如何主动发起中断?
- int 8位立即数
- int3:调试端点指令
- into:中断溢出指令
- bound:检查数组索引越界指令
- ud2:未定义指令,主要用来测试,无实际用途
什么是异常?
CPU在执行指令期间发生错误导致的中断成为异常。比如分母为0。
异常的种类有哪些?
异常根据严重程度分为以下三种:
- Fault:故障,当发生此类异常时,CPU将机器状态恢复到异常之前的状态,之后调用中断处理程序时,CPU将返回地址依然指向导致fault异常的那条指令,给他一次改过自新的机会让其重新执行。
- Trap:陷阱,程序在运行时掉进了CPU设置的陷阱从而停止运行,通常用于调试中,比如int3指令便可引发该异常,CPU将中断处理程序的返回地址指向导致异常指令的下一个指令地址
- Abort:终止,一旦出现,错误无法修复,操作系统为了自保,会将此程序从进程表中去掉。
异常中断表如下,其中第一列是中断向量号,范围是0~255,中断向量的作用类似选择子,都用来在描述符表中索引一个描述符,只不过选择子用在全局描述符表和局部描述符表中,而中断向量用在中断描述表中。
,