问题

会不会有两个中断绝对同时发出,cpu会如何处理?

回答
关于中断是否会绝对同时发出以及CPU如何处理这个问题,我们来聊聊这个挺有意思的话题。

首先,我们得明白“绝对同时”这个概念在物理世界里,尤其是在电子信号的层面,其实是很难精确实现的。任何信号的产生和传播都伴随着微小的时间延迟,比如传感器响应、总线传输、CPU内部逻辑电路的时序等等。所以,严格意义上的“绝对同时”就像一个理想化的模型,在实际硬件中几乎不可能。

但是,我们可以理解为 非常接近 的时间点发出。比如,在CPU处理一个任务的同一个指令周期内,或者非常短的时间间隔内,接连发生了两个中断请求。这时候,CPU就会遇到“谁先来”的问题了。

CPU处理中断的逻辑,本质上是一种“优先级”和“排队”机制。即便两个中断请求信号几乎是同时到达,CPU内部的硬件设计也会有一个明确的判定顺序。这通常是如何运作的:

1. 中断控制器(Interrupt Controller): 大多数现代CPU系统都有一个中断控制器(比如PIC Programmable Interrupt Controller,或者更现代的APIC Advanced Programmable Interrupt Controller)。这个控制器是CPU和外部中断源之间的中介。它的主要职责就是接收来自各个硬件设备的中断请求,然后根据预设的优先级,将最高优先级的请求传递给CPU。

2. 优先级机制: 中断控制器内部通常会有一个硬件电路来比较同时到达的中断请求。即使它们在时间上非常接近,控制器也会有一个内部的判定逻辑,比如:
硬编码优先级(Hardcoded Priority): 有些中断源本身就拥有固定的、无法改变的优先级。比如,时钟中断(Timer Interrupt)通常优先级很高,因为它对系统计时至关重要。而一些外设的请求优先级可能就低一些。
可编程优先级(Programmable Priority): 现代系统中,优先级很多是可以由操作系统通过编程来设定的。操作系统在初始化时会根据设备的重要性和响应需求来分配优先级。
仲裁逻辑(Arbitration Logic): 当两个或多个优先级相同的请求同时到达时,仲裁逻辑会介入。这可能基于某种轮询机制,或者更常见的,基于中断源在总线上的连接顺序(比如PCIe总线上的设备仲裁)。

3. CPU的响应过程:
当CPU收到一个中断请求(无论是通过中断控制器还是直接送到CPU的引脚)时,它会立即停止当前正在执行的任务(但不会立即丢弃状态)。
CPU会完成当前正在执行的指令,然后保存当前指令的执行状态(比如程序计数器PC、寄存器等),这些信息会被压入堆栈。
接着,CPU会根据中断源的类型,查找中断向量表(Interrupt Vector Table)或者类似的数据结构,获取处理该中断所需的例程(中断服务程序,ISR Interrupt Service Routine)的地址。
CPU跳转到该ISR执行。

那么,回到“绝对同时”的问题:

如果真的出现了两个中断请求在CPU完成当前指令并准备处理中断的那个瞬间几乎同时到达中断控制器,那么中断控制器会先进行优先级判定。

如果优先级不同: 低优先级的那个请求会被暂时搁置(或者丢失,取决于控制器设计),CPU会优先响应高优先级的那个。一旦高优先级中断处理完毕,并且CPU允许低优先级中断被处理时,低优先级的中断才会发挥作用。
如果优先级相同: 仲裁逻辑会决定哪个先被送到CPU。CPU只会接收其中一个作为“第一个”中断。它会像处理单个中断一样,保存状态、查找向量表、执行对应的ISR。

关键点在于:

1. CPU的“处理中断”动作本身也是一个顺序的、有时间长度的过程。 CPU进入中断处理状态,保存现场,查找ISR地址,然后跳转执行ISR,这个过程不是瞬时的。
2. 中断控制器是“守门员”。 在请求到达CPU之前,它会先做一次“分流”和“排序”。

举个例子(简化的):

想象CPU正在执行一个加法指令,这是它最后一条指令了,接下来就该看有没有中断了。就在它执行完加法的瞬间,有两个中断信号(中断A和中断B)几乎同时冲进了中断控制器。

中断控制器发现A和B都来了。它查了一下规则:A的优先级是3,B的优先级是1。
优先级1比优先级3高。所以,中断控制器就立刻将中断B的信号送到CPU。
CPU收到B的信号,就知道“有中断B要来了”。它会赶紧把执行加法指令前的状态(比如下一条要执行的指令地址)存起来,然后去执行处理中断B的程序。
中断B的程序执行完毕,CPU会恢复刚才保存的状态,继续执行它被打断的加法指令之后的任务。
在CPU完成中断B的ISR并回到正常执行流程后,中断控制器可能会再次将之前被压制的中断A的信号发送给CPU(当然这取决于CPU是否设置了中断屏蔽位等)。

在某些非常特定的设计中(比如早期的一些简单系统或者某些特殊用途处理器),可能存在CPU核心内部直接连接了多个中断输入,并且这些输入没有经过一个统一的、有强大仲裁能力的中断控制器的情况。 在这种极少数情况下,如果两个信号在同一时刻触发了CPU的某个内部中断检测逻辑,理论上可能会发生一些不可预测的行为。但对于现代通用处理器来说,这种设计是极少见的。

总而言之,现代CPU在设计上非常严谨,会通过中断控制器等硬件机制来确保即使多个中断请求非常接近,也能被一个一个、有条不紊地按照优先级和仲裁规则进行处理。所以,“绝对同时”的两个中断会被CPU“分批”或“排队”处理,而不会导致混乱。

希望这个解释能让你更清楚其中的细节!

网友意见

user avatar

题主的问题表达的不太正确,不过要问的内容还是很清晰的,先回答一下:

1. 整个一个键盘共一个中断,甚至是跟别的设备共用一个中断,不管是什么键盘。

机械键盘,并不是一个键位对应着一个中断。如果是PS/2的,只有一个中断。如果是USB的,那么实际上是USB控制器轮询的(虽然叫中断传输),所以从操作系统驱动的层面上,根本看不到“同时来了两个中断”的事件。

由于主流的机械键盘都是USB的,USB-HID类型的设备,单次只能上报8字节的报文,处理6-9个按键,所以,同时按下两个键,那么操作系统在某个轮训周期内,看到的是一个HID report里新包含了两个键。

但是即使这样,驱动也是从前往后扫描report然后依次上报的(从keycode1到keycode6),所以从驱动到操作系统软件这个层次上,按键时间是依次上报的。

2. 不管键盘同时按下几个键,键盘硬件是可以处理的。

这个解释起来比较长,我在这个问题里回答过:

电路扫描动作也是从上到下的,所以,即使同时按下两个键,硬件也是依次上报。

3. 不谈键盘,只说两个中断,中断控制器不会同时上报两个中断。

以x86上最古老的8259控制器来说,它的中断是有优先级的:

没配置优先级的情况下,从IRQ0到IRQ7依次排列,所以即使硬件上同时来了两个中断,那么8259A也是按照优先级依次上报的,不会同时上报两个中断。

(4)优先权判别器PR
若某中断请求正在被处理,8259A外部又有新的中断请求,则由优先权判别器将新进入的中断请求和当前正在处理的中断进行比较,以决定哪一个优先级更高。若新的中断请求比正在处理的中断级别高,由PR通过控制逻辑向CPU发出中断申请INT,正在处理的中断自动被禁止,先处理级别高的中断

对于高级一点的LoAPIC,建议看Intel的手册,配置过于复杂,但也是有优先级的。

所以,对于题主的问题,答案就是:不会有两个中断同时发出。

user avatar

你以为你的外设是直接用一根导线连接到CPU的吗?

不,他们是连接到总线的,俗称南北桥,南北桥上的中断控制器会根据优先级选择。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有