繁体   English   中英

如何在SMP上处理中断?

[英]How are interrupts handled on SMP?

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

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

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

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

中断有两个主要来源:

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

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

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

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

关于示例中的序列:

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

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

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

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

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

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

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

外部中断通常通过某种交换结构,允许它们以某种方式(静态或动态)映射到处理器。 例如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/dd/chapter/book/ch13.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM