操作系统-中断、关中断和开中断简介

中断、关中断和开中断
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):当计算机处于关中断状态下,中断请求被禁止或忽略,处理器不会对中断信号进行响应。在关中断状态下,处理器会继续执行当前的任务,而不会立即响应响应中断请求。这种状态通常用于对某些关键任务或临界区的保护,以确保这些任务或临界区能够在不被中断的情况下完成。
开关中断状态通常由操作系统或应用程序控制。通过合理地设置中断状态,可以确保系统的可靠性、稳定性和数据完整性。开中断状态可以即时响应系统事件,提高系统的效率和实时性;而关中断状态可以防止中断干扰,保护关键任务或临界区的正确执行。具体的中断状态的切换和控制方法会根据不同的计算机体系结构和操作系统而有所差异。

<think>好的,我现在需要解释“中断关中”这两个概念。首先,用户可能是在学习操作系统或者嵌入式系统,涉及到中断处理的部分。这两个术语听起来像是与中断的启用禁用有,但需要更准确的理解。 中断应该是指允许处理器响应中断请求,而关中则是禁止处理器响应中断。但具体来说,可能涉及到CPU的状态设置,比如通过特定的指令来启或中断。比如在x86架构中,sticli指令可能就是用来做这个的。 接下来,我需要考虑用户可能的背景。他们可能是计算机科学的学生,刚始学习操作系统的底层机制,或者是发者,在编写需要控制中断的代码,比如设备驱动程序或者实时系统。这时候,理解何时以及如何正确使用中断关中非常重要,因为不当使用可能导致系统不稳定或响应延迟。 用户的问题可能源于他们遇到了相的内容,比如在学习临界区问题、自旋锁或者上下文切换时,遇到了中断控制的概念。他们可能想知道为什么需要暂时中断,以及这样做的影响是什么。此外,用户可能想知道在实际编程中如何实现这些操作,以及它们在不同体系结构中的差异。 需要区分关中中断的具体应用场景。例如,在操作系统中,当内核正在处理某些键任务,如更新核心数据结构时,可能会暂时中断,防止被中断导致数据不一致。但长时间中断会导致系统无法及时响应外部事件,影响实时性。 可能还需要提到中断屏蔽中断处理程序的系。关中不仅仅是禁止所有中断,可能还有不同优先级的中断是否被屏蔽的问题。但通常来说,关中指的是禁用所有可屏蔽中断,而不可屏蔽中断(NMI)可能仍然会被处理。 另外,需要注意关中的使用场景替代方案。比如,在单处理器系统中,关中可以用来保护临界区,避免并发问题,但在多核系统中,这可能不够,还需要结合其他同步机制,如自旋锁。这里需要说明不同场景下的适用性。 还需要指出关中的风险,比如长时间关中会导致系统无法响应外部事件,影响实时性,甚至导致硬件故障未被及时处理。因此,在编写代码时,必须确保关中的时间尽可能短,并且只在必要时使用。 最后,可能需要举例说明,比如在上下文切换时,操作系统会先关中,保存当前任务的状态,然后进行切换,再中断。这样确保切换过程不会被中断,保持原子性。 总结来说,回答需要涵盖定义、实现方式、应用场景、注意事项以及相概念的区别联系。确保用户理解为什么需要控制中断,如何操作,以及可能带来的影响。</think>**中断关中的详细解析** 在计算机系统中,**中断(Enable Interrupt)****关中(Disable Interrupt)**是操作系统底层硬件控制的键机制,主要用于管理处理器对中断请求的响应能力。以下是分步解释: --- ### **一、核心定义** 1. **关中(Disable Interrupt)** - **含义**:通过设置CPU状态寄存器中的中断标志位(如x86的`IF`标志),**暂时禁止处理器响应可屏蔽中断**。 - **目的**:保护键代码段(如内核临界区)的原子性,防止被中断导致数据不一致。 - **实现指令**: - x86架构:`CLI`(Clear Interrupt Flag) - ARM架构:通过CPSR寄存器设置中断屏蔽位 2. **中断(Enable Interrupt)** - **含义**:恢复处理器对中断的响应能力,允许外部设备或定时器触发中断- **实现指令**: - x86架构:`STI`(Set Interrupt Flag) - ARM架构:清除CPSR中的中断屏蔽位 --- ### **二、工作原理** 1. **关中的硬件行为** - 当执行关中指令后: - 所有可屏蔽中断(如键盘输入、磁盘I/O完成)**被临时忽略**。 - 不可屏蔽中断(NMI,如硬件故障)**仍会被处理**。 - **代码示例**(x86汇编): ```asm cli ; 关中 ; 临界区操作(如修改全局链表) sti ; 中断 ``` 2. **中断后的行为** - 处理器重新检查中断队列,若有未处理的中断,立即触发中断处理程序。 --- ### **三、典型应用场景** 1. **操作系统内核的临界区保护** - **场景**:内核更新进程调度队列、内存管理数据结构时。 - **必要性**:防止中断导致上下文切换,破坏操作的原子性。 2. **实现自旋锁(Spin Lock)** - 在单核CPU系统中,自旋锁需配合关中使用: ```c void spin_lock() { cli(); // 关中 while (lock_busy); // 自旋等待 lock_busy = 1; sti(); // 中断 } ``` 3. **上下文切换(Context Switch)** - 操作系统在切换任务时,需先关中,避免切换过程被中断--- ### **四、键注意事项** | **特性** | **关中** | **中断** | |------------------|-------------------------------------|-------------------------------------| | **中断响应** | 禁止可屏蔽中断 | 允许所有中断 | | **执行时间** | 必须极短(通常微秒级) | 长期保持启状态 | | **多核影响** | 仅对当前CPU有效 | 仅对当前CPU有效 | | **风险** | 过长闭导致系统无响应 | 可能引入中断嵌套 | --- ### **五、与“中断屏蔽”的区别** - **关中**:禁用**所有可屏蔽中断**(全局控制)。 - **中断屏蔽**:选择性禁用**特定类型中断**(如通过APIC配置局部中断)。 --- ### **六、实际案例分析** **Linux内核中的使用** 在Linux内核代码中,关中通常通过`local_irq_disable()`实现,中断通过`local_irq_enable()`: ```c unsigned long flags; local_irq_save(flags); // 保存当前中断状态并中断 // 临界区操作(如修改task_struct) local_irq_restore(flags); // 恢复原中断状态 ``` 此方法确保中断状态在操作后恢复原状,避免意外启用本应闭的中断--- ### **七、总结** - **关中**是“**以空间换安全**”的机制,通过牺牲短暂的中断响应能力,确保键操作的原子性。 - **中断**需及时执行,否则会导致系统失去实时响应能力。 - **适用原则**:仅在必要时使用,且关中时间必须极短(通常控制在数十条指令内)。 通过合理使用/关中,系统能够在并发环境下稳定运行,同时平衡实时性与安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值