中断、关中断和开中断
1、中断是什么
在计算机中,中断是系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。
中断是一种异步的事件处理机制,可以提高系统的并发处理能力。操作系统收到了中断请求,会打断其他进程的运行,所以中断请求的响应程序,也就是中断处理程序,要尽可能快的执行完,这样可以减少对正常进程运行调度地影响。
而且,中断处理程序在响应中断时,可能还会临时关闭中断,这意味着,如果当前中断处理程序没有执行完之前,系统中其他的中断请求都无法被响应,也就说中断有可能会丢失,所以中断处理程序要段且快。
2、软中断
linux系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是上半部和下半部分。
·上半部分用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。
·下半部分用来延迟处理上半部分未完成的工作,一般以内核线程的方式运行。
举一个计算机中的例子,常见的网卡接收网络包的例子。
网卡收到网络包后,通过dma(dma:direct memory access,直接内存访问,是一些计算机总线架构提供的功能,它能使数据从附加设备,如磁盘驱动器,直接发送到计算机主板的内存上)方式将接收到的数据写入内存,接着会通过硬件中断通知内核由新的数据到了,于是内核就会调用对应的中断处理程序来处理该事件,这个事件的处理也是会分成上半部和下半部。
上半部分要做的事情很少,会先禁止网卡中断,避免频繁硬中断,而降低内核的工作效率。接着,内核会触发一个软中断,把一些处理比较耗时且复杂的事情,交给软中断处理程序去做,也就是中断的下半部,其主要是需要从内存中找到网络数据,再按照网络协议栈,对网络数据进行逐层解析和处理,最后把数据送给应用程序。
所以,中断处理程序的上部分和下半部可以理解为:
·上半部直接处理硬件请求,也就是硬中断,主要是负责耗时短的工作,特点是快速执行;
·下半部是由内核触发,也就说软中断,主要是负责上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行。
还有一个区别,硬中断(上半部)是会打断cpu正在执行的任务,然后立即执行中断处理程序,而软中断(下半部)是以内核线程的方式执行;并且每个cpu都对应一个软中断内核线程,名字通常为[ksoftirqd/CPU 编号],比如0号cpu对应的软中断内核线程的名字是ksoftirqd/0
不过,软中断不只是包括硬件设备中断处理程序的下半部,一些内核自定义事件也属于软终端,比如内核调度等、RCU锁(内核里常用的一种锁)等。
3、系统里有哪些软中断
在linux系统里,我们可以通过查看/proc/softirqs的内容来知晓[软中断]的运行情况,以及/proc/interrupts的内容来知晓[硬中断]的运行情况。
中断是指cpu对i/o设备发来的中断信号的一种响应。cpu暂停正在执行的程序,保留cpu环境后,自动地去执行该i/o设备的中断处理程序。执行完后,再回到断点,继续执行原来的程序。i/o设备可以是字符设备、也可以是块设备、通信设备等。由于中断是由外部设备引起,故又称为外部中断。
陷入:
另外还有一种由cpu内部事件所引起的中断,例如进程在运算中发生了上溢或下溢,又如程序出错,如非法指令、地址越界、以及电源故障等。通常把这类的中断称为内中断或陷入(trap)。与中断一样,若系统发生了有陷入事件,cpu也将暂停正在执行的程序,转去执行该陷入事件的处理程序。中断和陷入的主要区别是信号的来源,即是来自cpu内部,还是cpu外部。
开中断状态(enabled interrupts):当计算机处于开中断状态时,意味着中断请求是被允许和相应的。这样,当一个中断请求被触发,处理器会立即停止正在执行的任务,并转去处理中断请求。这可以保证即时响应系统的各种中断事件。
关中断状态(disabled interrupts):当计算机处于关中断状态下,中断请求被禁止或忽略,处理器不会对中断信号进行响应。在关中断状态下,处理器会继续执行当前的任务,而不会立即响应响应中断请求。这种状态通常用于对某些关键任务或临界区的保护,以确保这些任务或临界区能够在不被中断的情况下完成。
开关中断状态通常由操作系统或应用程序控制。通过合理地设置中断状态,可以确保系统的可靠性、稳定性和数据完整性。开中断状态可以即时响应系统事件,提高系统的效率和实时性;而关中断状态可以防止中断干扰,保护关键任务或临界区的正确执行。具体的中断状态的切换和控制方法会根据不同的计算机体系结构和操作系统而有所差异。