如何在SMP上处理中断?

pyt*_*nic 25 c linux x86-64

如何在SMP(Symmeteric多处理器/多核)机器上处理中断?是否只有一个或更多的内存管理单元?

假设在不同核心上运行的两个线程A和B触摸页面表中不存在的存储页面(同时),在这种情况下将出现页面错误并且从存储器引入新页面.

会发生什么事件的顺序是什么?如果有一个内存管理单元,哪个核心是转发到的页面错误?内核如何处理它?是否有多个内核实例,每个实例运行在不同的内核上?如果是这样,他们如何同步页面错误处理等事件?

rod*_*igo 9

嗯,这取决于具体的架构,但从我记得的英特尔文档......

中断有两个主要来源:

  • 内部:这些是由CPU本身生成的.包括故障,陷阱,软件中断等.
  • 外部:这些是外设生成的硬件中断.

内部中断始终传递给生成它的CPU.外部的被发送到一个arbirary核心.

在现代模型中,中断也可以使用类似总线的系统而不是旧的中断驱动系统来提供,但是如果在任何当前的操作系统中使用此模型,我会忽略.

关于MMU,当然每个核心都有自己的核心,但它们通常被OS强制使用相同的段,因此它们可以对称使用.请注意,物理内存和虚拟内存之间的大多数映射实际上都在内存中,并且始终是共享的.

关于示例中的序列:

  • 页面错误被转发到生成它的核心.
  • 内核更新其受共享锁或类似锁保护的MMU表.
  • 不,通常只有一个内核,除非您应用虚拟化模型.
  • 它们使用共享锁或类似结构进行同步.如果两个核心同时在同一页面上发生故障......实际上这并不是什么大不了的事.


men*_*nsi 8

在多核/多处理器体系结构中,APIC用于将中断路由到核心/处理器.顾名思义,APIC可以编程为根据需要进行路由.

关于内核的同步:这取决于内核/操作系统.您可以使用带锁定的方案(尽管在非高速缓存一致的体系结构上可能需要IPI),或者您也可以使用建议的方法在每个内核上运行内核并使用某种显式的内核间通信.

Barrelfish是运行多个内核的操作系统的一个例子.如果您对这种架构感兴趣,可能需要阅读论文" Multikernel:可扩展多核系统的新OS架构 "


Kaz*_*Kaz 5

每个处理器都有其自己的带有转换后备缓冲器的内存管理单元。这是必要的,因为每个内核可能正在执行具有不同地址空间的不同进程。

多个内核可以同时独立处理中断/异常。因此,内核中可以同时执行多个并发中断上下文。

诸如页面错误或被零除之类的异常将始终在发生该异常的同一处理器上进行处理,因为它与该处理器正在执行的操作有关。

外部中断通常会经过某种交换结构,使它们能够以某种方式静态或动态地映射到处理器。例如,PC型硬件上的“ APIC”。

如果结构足够复杂,则可以针对运行中的其他内核对中断进行重新编程。

这取决于架构。例如,一种简单的架构可以将所有外部中断绑定到一个内核。不过,这不是很对称。它不会允许IRQ负载平衡。

(还要注意,在所有处理器上发生某些外部中断是很有用的。计时器中断就是一个例子。如果每个内核都有自己的中断计时器,则调度程序中的时间分片处理是对称的:没有特殊情况处理一个主内核与另一个主内核。中断发生,内核运行调度程序代码,如果当前任务的时间已到,它将选择另一个任务在该内核上运行。)