SMP如何处理中断?

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

假设有两个线程,运行在不同内核上的A和B触及页表中不存在的内存页面(同时),在这种情况下会出现页面错误,并从内存中引入新页面。

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

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

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

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

那么,这取决于具体的架构,但从我能记得的英特尔文档…

有两个主要的中断源:

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

内部中断总是交付给产生它的CPU。 外部的被送到一个arbirary核心。

在现代模型中,中断也可以使用类似总线的系统来传递,而不是由旧的中断驱动,但是我忽略了这个模型是否被当前的操作系统所使用。

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

关于你的例子中的序列:

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

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

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

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

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

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

这取决于体系结构。 例如,一个简单的架构可以将所有外部中断连接到一个内核。 这不会是非常对称, 它不会允许IRQ负载平衡。

(另外请注意,在所有的处理器上都有一定的外部中断是有用的,例如定时器中断,如果每个内核都有自己的中断定时器,那么在调度器中处理时间片就是对称的:没有特殊的情况处理对于一个主核心而言,一个中断会关闭,内核运行调度程序代码,并且如果当前任务的时间段结束,它将选择另一个任务在该核心上运行。

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

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

如果这些是不同进程的线程,那么这是没有问题的。 我不知道什么是Linux的具体实现(是的,我知道它被标记为“linux”),但有两种通用算法来管理SMP环境中的虚拟内存:

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

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

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


1. VAS =虚拟地址空间

我没有得到“内核的多个实例”,通常内核规则是“全部”。 这意味着它没有实例,相反,我们应该把内核视为一个全局的反应系统,它为应用程序提供服务。

据我所知,内存处理是一个单元(虽然每个内核都有自己的中断向量),页面被锁定使用page_table_lock ,所以页面检索只执行一次,按照锁定的顺序。

**编辑:看到其他评论后,我的答案可能会过时:无论如何,你应该检查: http : //www.xml.com/ldd/chapter/book/ch13.html