多核 CPU 中断

god*_*god 8 cpu multiprocessing

多核处理器如何处理中断。我知道单核处理器如何处理中断。我也知道不同类型的中断。我想知道多核处理器如何处理硬件、程序、cpu时序和输入/输出中断

Mar*_*oom 5

通常,这取决于您所测试的特定系统。
更广泛的方法是在每个处理器1中都有一个特定的芯片,该芯片被静态或动态地2分配了唯一 ID,并且可以通过共享或专用总线发送和接收中断。
ID 允许特定处理器成为中断目标。

在处理器 A 上运行的代码可以要求它的中断芯片在处理器 B 上引发一个中断,当发生这种情况时,一条消息沿着上述总线发送,路由到处理器 B,在那里相关的中断芯片接收它,解码它并引发相应的中断。

在系统级,存在一个或多个通用中断控制器以将中断请求从 IO 设备(在任何总线中)路由到处理器。
这些控制器是可编程的,操作系统可以平衡所有处理器的中断负载(或实现任何其他方便的策略)。

这是最灵活的方法,有线方法也是可能的。
在这种情况下,处理器 A 的信号直接连接到处理器 B 的输入端,反之亦然;断言这些信号会在目标处理器上产生中断。

一般概念称为处理器间中断 (IPI)。
该x86架构遵循第一种方法密切3(小心的命名法的虽然,处理器具有不同的含义)。
其他体系结构可能不会,例如使用有线方法4的IBM OS/360 M65MP。

软件生成的中断只是程序中的指令,每个处理器执行自己的指令流,因此如果程序 X 在处理器 A 上运行时产生异常,则由处理器 A 处理。

任务调度通常分布在所有处理器上(这就是 Linux 所做的.

计时通常由服务于硬件定时器中断的指定处理器完成。
情况并非总是如此,我没有查看现代操作系统实现的确切细节。


1通常是集成芯片,因此我们可以将其视为处理器的一个功能单元。
2通过上电协议。
3实际上,这是反向因果关系。
4我正在关注维基百科的例子。


Had*_*ais 5

这应该被视为其他答案的延续或扩展。

大多数多处理器支持可编程中断控制器,例如 Intel 的 APIC。这些是由许多组件组成的复杂芯片,其中一些可能是芯片组的一部分。在启动时,所有 I/O 中断都传递到内核 0(引导处理器)。然后,在 APIC 系统中,操作系统可以为每个中断指定哪个内核应该处理该中断。如果指定了多个内核,则意味着由 APIC 系统决定应由哪个内核处理传入的中断请求。这称为中断关联。已经为操作系统和硬件提出了许多调度算法。一种明显的技术是通过以循环方式调度中断来平衡系统负载。另一个是这个 来自 Intel 的技术,试图平衡性能和功耗。

在 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
Run Code Online (Sandbox Code Playgroud)

第一列指定中断请求 (IRQ) 编号。所有正在使用的 IRQ 编号都可以在列表中找到。该文件/proc/irq/N/smp_affinity包含一个指定 IRQ N 关联的值。该值应根据 APIC 的当前操作模式进行解释。

一个逻辑内核可以接收多个 I/O 和 IPI 中断。在这一点上,本地中断调度发生,这也可以通过为中断分配优先级来配置。

其他可编程中断控制器类似。