多核处理器如何处理中断。 我知道单核处理器如何处理中断。 我也知道不同类型的中断。 我想知道多核处理器如何处理硬件,程序,CPU时序和输入/输出中断
答案 0 :(得分:3)
一般来说,这取决于您所测试的特定系统 更广泛的方法是在每个处理器 1 中分配一个特定的芯片,静态或dinamically 2 ,一个唯一的ID,可以通过共享发送和接收中断或专用巴士 ID允许特定处理器成为中断的目标。
在处理器A上运行的代码可以要求其中断芯片在处理器B上引发中断,当发生这种情况时,沿着上述总线发送消息,路由到处理器B,相关中断芯片将其拾取,解码它并引发相应的中断。
在系统级,存在一个或多个通用中断控制器,用于将来自IO设备(在任何总线中)的中断请求路由到处理器。
这些控制器是可编程的,操作系统可以平衡所有处理器的中断负载(或实施任何其他方便的策略)。
这是最灵活的方法,有线方法也是可能的 在这种情况下,处理器A信号直接连接到处理器B输入,反之亦然;断言这些信号会在目标处理器上产生中断。
一般概念称为Inter-processor Interrupt (IPI)
x86 architecture紧跟第一种方法 3 (但要注意命名法, processor 具有不同的含义)。
其他架构可能没有,例如IBM OS/360 M65MP使用有线方法 4 。
软件生成的中断只是程序中的指令,每个处理器都执行自己的指令流,因此如果程序X在处理器A上运行时产生异常,则处理器A处理它。
任务调度通常分布在所有处理器上(that's what Linux does。
计时通常由指定的处理器完成,该处理器用于硬件定时器中断 This is not always the case,我还没有看到现代操作系统实现的确切细节。
1 通常是集成芯片,因此我们可以将其视为处理器的功能单元。
2 通过开机协议
3 实际上,这是反向因果关系
4 我跟随维基百科的例子。
答案 1 :(得分:1)
这应被视为other answer的延续或扩展。
大多数多处理器都支持可编程中断控制器,例如Intel的APIC。这些是复杂的芯片,由许多组件组成,其中一些组件可能是芯片组的一部分。在引导时,所有I / O中断都被传送到内核0(引导处理器)。然后,在APIC系统中,OS可以为每个中断指定哪个核应该处理该中断。如果指定了多个核心,则意味着由APIC系统决定哪个核心应该处理传入的中断请求。这称为中断亲和力。已经为OS和硬件提出了许多调度算法。一种显而易见的技术是通过以循环方式调度中断来对系统进行负载平衡。另一个来自英特尔的this技术试图平衡性能和功耗。
在Linux系统上,您可以打开/proc/interrupts
以查看每个核心处理的每种类型的中断数。在具有8个逻辑核心的系统上,该文件的内容可能如下所示:
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
0: 19 0 0 0 0 0 0 0 IR-IO-APIC 2-edge timer
1: 1 1 0 0 0 0 0 0 IR-IO-APIC 1-edge i8042
8: 0 0 1 0 0 0 0 0 IR-IO-APIC 8-edge rtc0
9: 0 0 0 0 1 0 0 2 IR-IO-APIC 9-fasteoi acpi
12: 3 0 0 0 0 0 1 0 IR-IO-APIC 12-edge i8042
16: 84 4187879 7 3 3 14044994 6 5 IR-IO-APIC 16-fasteoi ehci_hcd:usb1
19: 1 0 0 0 6 8 7 0 IR-IO-APIC 19-fasteoi
23: 50 2 0 3 273272 8 1 4 IR-IO-APIC 23-fasteoi ehci_hcd:usb2
24: 0 0 0 0 0 0 0 0 DMAR-MSI 0-edge dmar0
25: 0 0 0 0 0 0 0 0 DMAR-MSI 1-edge dmar1
26: 0 0 0 0 0 0 0 0 IR-PCI-MSI 327680-edge xhci_hcd
27: 11656 381 178 47851679 1170 481 593 104 IR-PCI-MSI 512000-edge 0000:00:1f.2
28: 5 59208205 0 1 3 3 0 1 IR-PCI-MSI 409600-edge eth0
29: 274 8 29 4 15 18 40 64478962 IR-PCI-MSI 32768-edge i915
30: 19 0 0 0 2 2 0 0 IR-PCI-MSI 360448-edge mei_me
31: 96 18 23 11 386 18 40 27 IR-PCI-MSI 442368-edge snd_hda_intel
32: 8 88 17 275 208 301 43 76 IR-PCI-MSI 49152-edge snd_hda_intel
NMI: 4 17 30 17 4 5 17 24 Non-maskable interrupts
LOC: 357688026 372212163 431750501 360923729 188688672 203021824 257050174 203510941 Local timer interrupts
SPU: 0 0 0 0 0 0 0 0 Spurious interrupts
PMI: 4 17 30 17 4 5 17 24 Performance monitoring interrupts
IWI: 2 0 0 0 0 0 0 140 IRQ work interrupts
RTR: 0 0 0 0 0 0 0 0 APIC ICR read retries
RES: 15122413 11566598 15149982 12360156 8538232 12428238 9265882 8192655 Rescheduling interrupts
CAL: 4086842476 4028729722 3961591824 3996615267 4065446828 4033019445 3994553904 4040202886 Function call interrupts
TLB: 2649827127 3201645276 3725606250 3581094963 3028395194 2952606298 3092015503 3024230859 TLB shootdowns
TRM: 169827 169827 169827 169827 169827 169827 169827 169827 Thermal event interrupts
THR: 0 0 0 0 0 0 0 0 Threshold APIC interrupts
DFR: 0 0 0 0 0 0 0 0 Deferred Error APIC interrupts
MCE: 0 0 0 0 0 0 0 0 Machine check exceptions
MCP: 7194 7194 7194 7194 7194 7194 7194 7194 Machine check polls
ERR: 0
MIS: 0
PIN: 0 0 0 0 0 0 0 0 Posted-interrupt notification event
PIW: 0 0 0 0 0 0 0 0 Posted-interrupt wakeup event
第一列指定中断请求(IRQ)编号。可以在列表中找到所有正在使用的IRQ号码。文件/proc/irq/N/smp_affinity
包含一个指定IRQ N的亲和力的值。该值应根据APIC的当前操作模式进行解释。
逻辑核心可以接收多个I / O和IPI中断。此时,发生本地中断调度,也可以通过为中断分配优先级来配置。
其他可编程中断控制器类似。