原PO链接:操作系统终端机制
中断机制
中断机制的诞生
在计算机发展初期(即在多道批处理系统之前),计算机只能运行一道程序,所以我们也不需要暂停(即中断)该程序的运行,导致的结果就是该程序运行到底。但是,由于计算机处理速度超快,只能运行一道程序未免太没效率了。所以我们现在要求一个计算机可以并发的运行多道程序,那怎么让这些程序之间切换运行呢?
为了解决上述问题,人们发明了操作系统作为计算机的管理者(多道批处理系统及之后),引入中断机制,实现多道程序的并发运行。中断机制可以让计算机暂时停止某程序的运行,然后转到另外一个程序,CPU会运行该程序的指令。
发生了中断就意味着需要操作系统的介入,开展管理工作。由于操作系统的管理工作(比如分配打印机设备等)需要使用特权指令,所以CPU状态要从用户态切换到核心态,使操作系统获得计算机的控制权。有了中断机制,计算机才能实现多道程序的并发运行。
常见的中断
- 时间片用完之后的中断
CPU收到计时部件发出的中断信号,切换到核心态对中断进行处理。这个中断是为了告诉正在运行的程序:“你的运行时间到了,让别的程序运行吧!”。
这个中断的目的是:实现计算机中多道程序的并发运行。 - 输出指令引起的中断
运行中的程序请求输出,CPU也会切换为核心态对中断进行处理。 假如该程序要求输出到打印机,CPU会向打印机发出信号,让打印机开始工作。而且该程序也会暂停运行,等待打印机工作完成。该程序暂停了,说明CPU空闲了,那总不能让CPU傻傻的在那里等吧。于是CPU会切换为用户态,转入另外一个程序,运行它的指令。
而等到打印机工作完成,打印机设备会向CPU发出中断信号,这个中断信号表示:“你给我的工作我已经完成了”,CPU收到中断信号后,会切换到核心态处理中断。
这个中断的目的是:提高计算机资源(CPU资源,打印机资源…)的利用率。
中断与CPU状态的切换
- 用户态 -> 核心态
中断是用户态到核心态切换的唯一途径。 - 核心态 -> 用户态
核心态到用户态的切换只需要通过CPU执行一个特权指令,将程序状态字(PSW)的标志位设置为用户态。
中断的分类
中断分为2类,内中断和外中断。我们可以通过中断信号的来源来判断。
- 内中断
内中断的信号来自与CPU内部。 (与当前执行的指令有关,比如输出指令或整数除0指令,CPU运行这条指令的时候会产生一个内中断信号) - 外中断
外中断的信号来自于CPU外部。 (与当前执行的指令无关,比如打印机输出完成之后发出的外中断信号)
外中断的处理过程
- 执行完每条指令之后,CPU会检查当前是否有外部中断信号。
- 如果检测到外部中断信号 (比如打印机工作完成了),则需要保护被中断进程的CPU环境 (如程序状态字PSW, 程序计数器PC,各种通用寄存器的值)。
- 根据中断信号类型转入相应的中断处理程序。
- 恢复原进程的CPU环境并退出中断处理程序,返回原进程继续往下执行。
在这里,进程可以理解为正在运行的程序。
总结