2012-04-19 187 views
24

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

说两个线程,运行在不同内核上的A和B触及页表中不存在的内存页面(在同一时间),在这种情况下会出现页面错误并导入新页面来自记忆。

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

回答

7

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

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

Barrelfish是运行多个内核的OS的一个例子。如果你有兴趣在那样的建筑,你可能需要阅读的文件“The Multikernel: A new OS architecture for scalable multicore systems

8

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

有中断的两个主要来源:

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

内部中断总是被传送给产生它的CPU。外部的是发送到arbirary核心。

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

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

关于在你的榜样序列:

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

同样,请看Barrelfish作为多内核的例子。单片内核方法不能超越数百个内核。 – mensi 2012-04-20 09:34:03

+0

@mensi - 当然,但我认为OP更多地提到了主流操作系统,特别是Linux,因为他包含了该标签。而且AFAIK数百个内核还不是一个可扩展性问题...... – rodrigo 2012-04-20 16:40:37

1

每个逻辑CPU(即CPU内核),有它自己的cr3寄存器,处理指针分页结构。这两个页面错误,可能会发生两种:

  • 在同一进程
  • 的线程在不同进程的线程

如果这些不同进程的线程,那么它是没有问题的。我不知道什么是Linux特有的实现这个(是的,我知道这是标记为“LINUX”),但一般有两种算法在SMP环境中管理虚拟内存:

  • 每个核心拥有它自己的当自己的列表中的所有页面被分配时,免费物理页面和请求的列表更多
  • 所有内核都使用相同的空闲页列表,受到某种锁的保护(通常是螺旋锁就足够了),这是当然速度较慢的解决方案

相同的代码(#PF处理程序)可以在两个不同的内核上同时执行,这不是一个问题EM。如果线程使用两个不同的VAS ,那么它们的页面错误只是对称地处理。如果页面错误发生在单个VAS中,那么它仍然没有问题,直到#PF是由访问同一页面引起的。在这种情况下,VAS中的每个页面都应该受到自旋锁的保护(或者只是给定VAS中的#PF可以通过单锁来保护 - 这样可以减少内存开销,但可以同时运行两个#PF处理程序)。

根据this answer,只有在NUMA系统中,每个CPU核心都有自己的MMU;在其他系统中,每个物理处理器都有它自己的MMU,以及TLB来处理由cr3寄存器的不同值引用的不同分页结构。


1. VAS =虚拟地址空间

0

我没有拿到,通常内核规则,他们的人都“内核的多个实例”。这意味着它没有实例,相反,应该将内核看作是为应用程序提供服务的全局响应系统。据我所知,内存处理是一个单元(尽管每个内核都有自己的中断向量),页面被锁定使用page_table_lock,因此页面检索只按照锁定的顺序执行一次。

**编辑:看到对方的意见后,我的答案可能是过时的:反正你应该检查:http://www.xml.com/ldd/chapter/book/ch13.html

+0

“内核的多个实例”,他的意思是“多个#PF处理程序同时运行”。 – Griwes 2012-04-19 19:35:41

+0

有关“内核的多个实例”的示例,请参阅我在我的回答中链接的论文 – mensi 2012-04-19 19:36:20

3

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

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

页面错误或被零除的异常将始终在其出现的同一处理器上处理,因为它与该处理器正在执行的操作有关。

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

如果结构足够复杂,那么可以将中断重新编程为针对不同的内核。

这取决于体系结构。例如,一个简单的架构可以将所有外部中断连接到一个内核。这不会是非常对称的;它不会允许IRQ负载平衡。如果每个内核都有自己的中断定时器,那么在调度器中处理时间片就是对称的:这里有一个例子:定时器中断。没有特殊的情况下处理一个主核心相对于其他核心中断,核心运行调度程序代码,并且如果当前任务的时间段结束,它会选择另一个任务在该核心上运行。)

+0

酷;我喜欢你如何称它为“面料”。 ARM arch的任何细节(如OMAP3/4)?谢谢。 – kaiwan 2012-06-28 01:47:39