1.什么是中断?
中断是由硬件或软件所发送的一种称为IRQ(中断求救)的信号,CPU会对这一信号进行响应。
2.为什么引入中断?
中断在操作系统中有着特殊重要的地位,它是多道程序得以实现的基础,没有中断就没有多道程序。另一方面也是设备管理的基础,为了提高处理机的利用率和实现CPU与I/O设备并行执行,必需有中断的支持,是整个I/O系统的基础。
3.中断什么时候发生?
(1)当I/O设备向CPU发来中断信号。
(2)CPU内部的事件,如:进程在运算中发生了上溢或下溢。或者程序出错:非法指令,地址越界,电源故障等。
4.中断发生时CPU做什么,中断机制做什么?
当CPU接收到中断请求时,会对该请求进行响应,然后转向中断处理程序,由它来执行相应的处理,处理完之后解除相应进程的阻塞状态。
中断机制主要进行如下操作:
(1)测定是否有未相应的中断信号
每当设备完成一个数据块(可以是一个字符或者字)的读入或输出时,设备控制器就会向处理机发送一个中断请求信号,请求将要输入的数据传送到内存缓冲区或者将要输出的数据传送到设备控制器。
每次有一道指令执行后,处理机都会检测,是否存在未响应的上面提到的设备控制器所发出的中断信号。
有的话就会停止原有进程,准备转到中断处理程序,准备将处理机的控制权交给中断处理程序。反之继续执行下一条指令
(2)保护中断进程的CPU环境
上面提到要转交处理机的控制权,在这之前需要保护被中断的CPU中正在运行的进程信息,以方便中断处理结束之后能够继续回来执行最初的进程。
首先,通常由硬件将处理机状态字(PSW)和保存在程序计数器(PS)中的下一条指令的地址保存到中断保留区(栈)中。这样就保存了之后恢复进程所需要的信息
然后,将CPU的现场信息(寄存器和段寄存器)内容都压入中断栈中(中断处理时可能会用到这些)。
(3)转入相应的设备处理程序
处理机对中断源进行测试,确定本次中断的I/O设备,向提供中断信号的设备发送确认信号。
该设备收到确认信号之后,就会取消它所发出的中断请求信号。之后将相应的设备中断处理程序的入口地址装入程序计数器中。
这样当处理机运行时,便可自动转向中断处理程序。
(4)中断处理
不同设备有不同的中断处理程序。
该程序先从设备控制器中读出设备状态,判断本次中断类型。
正常完成中断的话,中断程序就作结束处理。
还是异常结束中断的话,就根据发生异常的原因做相应处理。
(5)恢复CPU的现场并退出中断
处理完成后就要恢复CPU现场,退出中断。有两种情况:
①若采用了屏蔽(禁止)中断方式,就会返回中断进程。
②若采用的是嵌套方式,若没有优先级更高的中断请求I/O,中断结束后返回原进程。反之将会去处理更高优先级的中断请求。
当返回到被中断进程,可将保存在中断的断栈中的被中断进程现场信息取出,放入寄存器中。信息包括:程序下一次要执行的指令的地址N+1、PWS、通用寄存器和段寄存器的内容。
5.中断和系统调用有什么异同?
中断分两种,硬中断和软中断;硬中断是实实在在的硬件发出的中断,cpu检测到发生中断后,保护现场,查找中断向量地址,执行中断服务程序,之后,重新选择进程进行调度。软中断是由指令执行过程中发出的中断,但是并没有中断向量表,而是有对应的散转表,查找对应的中断号,转中断服务程序,之后的和硬中断相同。
系统调用是软中断的一种。
6.为什么说中断机制是一种C/S模式?
C/S是客户端发出请求,服务端进行处理后响应请求。
中断机制是外设发出中断请求,然后CPU进行相应的处理并响应请求。
从机制上来看十分相似。
7.什么是IRQ?这个号是由谁分配的?
IRQ(Interrupt ReQuest),是中断请求号,计算机每个组成组件都会拥有一个独立的IRQ,除了使用PCI总线的PCI卡之外,每一组件都会单独占用一个 IRQ,且不能重复使用。电脑周边硬件需要处理器去执行某些工作时,该硬件就会发出一个硬件信号,通知处理器工作,而这个信号就是IRQ。
系统会自动为外部设备分配IRQ号
8.从来列表中,可以看出每个CPU核心被中断的次数,列举几个设备的中断次数
从图中可以看出IRQ号为1的设备,被CPU8中断了327次,从后面的i8042可以看出表示的是控制键盘和鼠标的键盘控制器。
9.什么是硬中断,有哪几种类型?什么是软中断?
硬中断:
硬中断由硬件产生。每个设备或者设备集都有自己的IRQ(中断请求)。
硬件中断又可以分为内中断和外中断。
处理中断的驱动是需要运行在CPU上的。在多核处理机上,一个中断只能中断一颗CPU。
硬中断可以直接中断CPU。硬中断可以中断软中断。
对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程运行。他的存在是为了让调度器可以调度多任务。
软中断:
软中断是当前进程产生的。
通常,软中断是一些对IO的请求。
软中断仅与内核联系。
软中断不会直接中断CPU。
10.如何对中断进行负载均衡,尽可能让中断在每个CPU上发生,以提升系统的性能?
使用linux的实用程序Irqbalance,它主要是用于分发中断请求到CPU核心上,有助于性能的提升。
rqbalance是用户空间用于优化中断的一个工具,通过周期性的(默认10s)统计各个cpu上的中断情况,重新对中断进行再分配,实现各个cpu上中断负载相对均衡。中断均衡是建立再“object tree”的基础之上的,object tree则是通过系统的拓扑结构建立的分层结构。根据系统结构属性NUMA node/packet/cache affinity可以将系统划分为自上而下的四层:node->package->cache->cpu。
Irqbalance对于包含多个核心的系统来说是非常有用的,因为通常中断只被第一个CPU核心服务。暂时了解这些,具体后面会继续进行学习。