如何在SMP(Symmeteric多处理器/多核)计算机上处理中断?是否只有一个或更多的内存管理单元?
假设两个线程,在不同核心上运行的A和B触摸一个内存页面(同时),该页面表中没有该内存页面,在这种情况下会出现页面错误并从中引入新页面记忆。
将会发生什么事件的顺序?如果有一个内存管理单元,哪个核心是转发到的页面错误?内核如何处理它?是否有多个内核实例,每个实例运行在不同的内核上?如果是这样,他们如何同步页面错误处理等事件?
答案 0 :(得分:8)
嗯,这取决于具体的架构,但取决于我从英特尔文档中记得的......
有两个主要的中断来源:
内部中断始终传递给生成它的CPU。外部的被发送到一个arbirary核心。
在现代模型中,中断也可以使用类似总线的系统而不是旧的中断驱动系统来提供,但我忽略了这个模型是否在任何当前的操作系统中使用。
关于MMU,当然每个核心都有自己的核心,但它们通常被OS强制使用相同的段,因此它们可以对称使用。请注意,物理内存和虚拟内存之间的大多数映射实际上都在内存中,并且始终是共享的。
关于示例中的序列:
答案 1 :(得分:8)
在多核/多处理器体系结构上,APIC用于将中断路由到核心/处理器。顾名思义,APIC可以编程为根据需要进行路由。
关于内核的同步:这取决于内核/操作系统。您可以使用带锁定的方案(尽管在非高速缓存一致的体系结构上可能需要IPI),或者您也可以使用建议的方法在每个内核上运行内核并使用某种显式的内核间通信。
Barrelfish是运行多个内核的操作系统的示例。如果您对这种架构感兴趣,可能需要阅读论文“The Multikernel: A new OS architecture for scalable multicore systems”
答案 2 :(得分:4)
每个处理器都有自己的内存管理单元,带有转换后备缓冲区。这是必要的,因为每个核心可能正在执行具有不同地址空间的不同进程。
多个内核可以同时独立处理中断/异常。因此,可以在内核中同时执行多个并发中断上下文。
页面错误或除零等异常将始终在发生错误的同一处理器上处理,因为它与处理器正在执行的操作有关。
外部中断通常通过某种交换结构,允许它们以某种方式(静态或动态)映射到处理器。例如。 PC型硬件上的“APIC”。
如果结构足够复杂,那么中断可以重新编程,目标是不同的核心。
这取决于架构。例如,简单的架构可以将所有外部中断连接到一个核心。但这不会是非常对称的;它不允许IRQ负载平衡。
(另请注意,在所有处理器上发生某些外部中断很有用。例如,定时器中断。如果每个内核都有自己的中断定时器,那么在调度程序中处理时间切片是对称的:没有一个主核心与其他核心的特殊情况处理。中断响起,核心运行调度程序代码,如果当前任务的时间量上升,它会选择另一个任务在该核心上运行。)
答案 3 :(得分:1)
每个逻辑CPU(即CPU核心)都有自己的cr3
寄存器,处理指向分页结构的指针。两页错误可能发生在:
如果这些是不同进程的线程,那么这没问题。我不知道Linux的具体实现是什么(是的,我知道它被标记为“linux”),但在SMP环境中有两种通用算法来管理虚拟内存:
相同的代码(#PF处理程序)可以在两个不同的内核上同时执行,这不是问题。如果线程使用两个不同的VAS 1 ,则它们的页面错误只是对称处理。如果在单个VAS中发生页面错误,则仍然没有问题,直到#PF由访问同一页面引起。在这种情况下,VAS中的每个页面都应该受到自旋锁的保护(或者只是给定VAS中的#PF可以通过单一锁保护 - 这样可以减少内存开销,但不会同时运行两个#PF处理程序)。
根据this answer,仅在NUMA系统中,每个CPU核心都有自己的MMU;在其他系统中,每个物理处理器都有自己的MMU,以及TLB来处理由cr3
寄存器的不同值引用的不同分页结构。
<子> 1。 VAS =虚拟地址空间
答案 4 :(得分:0)
我没有得到“内核的多个实例”,通常是内核统一了所有内容。意味着它没有实例,相反应该将内核视为一个全局响应系统,它为应用程序提供服务。
据我所知,内存处理是一个单元(尽管每个内核都有自己的中断向量),页面使用page_table_lock
锁定,因此页面检索只执行一次,顺序为锁定。
**编辑:看到其他评论后,我的回答可能已过时:无论如何你应该检查:http://www.xml.com/ldd/chapter/book/ch13.html