在单核计算机上,一次执行一个线程。在每次上下文切换时,调度程序都会检查要调度的新线程是否与前一个线程在同一进程中。如果是这样,则无需对 MMU(页表)进行任何操作。在另一种情况下,需要使用新的进程页表来更新页表。
我想知道在多核计算机上是如何发生的。我猜每个核心上都有一个专用的MMU,如果同一进程的两个线程同时在2个核心上运行,那么这个核心的每个MMU都只是引用同一个页表。这是真的 ?你能指出我关于这个主题的好的参考吗?
在单核计算机上,一次执行一个线程。在每次上下文切换时,调度程序都会检查要调度的新线程是否与前一个线程在同一进程中。如果是这样,则无需对 MMU(页表)进行任何操作。在另一种情况下,需要使用新的进程页表来更新页表。
我想知道在多核计算机上是如何发生的。我猜每个核心上都有一个专用的MMU,如果同一进程的两个线程同时在2个核心上运行,那么这个核心的每个MMU都只是引用同一个页表。这是真的 ?你能指出我关于这个主题的好的参考吗?
看看这个方案。这是 Corei7 cpu 上单个内核中所有内容的高级视图。图片取自 Computer Systems: A Programmer's Perspective, Bryant and Hallaron。您可以在此处访问图表,第 9.21 节。
例如,在 ARM 上,顶层( Linux 中使用的PGD或页面全局目录名称)覆盖 1MB 的地址空间。在简单的系统中,您可以映射为 1MB 的部分。但是,这通常指向第二级表(PTE或页表条目)。
有效实现多 CPU 的一种方法是为每个 CPU 设置一个单独的顶级PGD。操作系统代码和数据将在内核之间保持一致。每个核心都有自己的 TLB 和 L1-cache;L2/L3 缓存可能共享也可能不共享。数据/代码缓存的维护取决于它们是 VIVT 还是 VIPT,但这是一个附带问题,不应影响 MMU 和多核的使用。
第二级页表的进程或用户部分在每个进程中保持不变;否则它们将具有不同的内存,或者您需要同步冗余表。各个内核在运行不同的进程时可能具有不同的二级页表集(不同的顶级页表指针)。如果它是多线程的,并且在两个 CPU 上运行,那么顶级表可能包含该进程的相同的第二级页表条目。事实上,当两个 CPU 运行相同的进程时,整个顶级页表可能相同(但内存不同)。如果使用 MMU 实现线程本地数据,则单个条目可能会有所不同。但是,由于 TLB 和缓存问题(刷新/一致性),线程本地数据通常以其他方式实现。
下面的图片可能会有所帮助。图中的 CPU、PGD 和 PTE 条目有点像指针。
虚线是使用 MMU 运行不同进程和相同进程(多线程情况)之间的唯一区别;它是从 CPU2 PGD 到进程 B PTE 或第二级页表的实线的替代。内核始终是多线程 CPU 应用程序。
当一个虚拟地址被翻译时,不同的位部分是每个表的索引。如果虚拟地址不在 TLB 中,则 CPU 必须执行表遍历(并获取不同的表内存)。因此,单次读取进程内存将导致三个内存访问(如果 TLB 不存在)。
内核代码/数据的访问权限明显不同。实际上,可能还会有其他问题,例如设备内存等。但是,我认为该图应该清楚地表明 MMU 如何设法保持多线程内存相同。
二级表中的条目完全有可能每个线程都不同。但是,这会在同一 CPU 上切换线程时产生成本,因此通常会映射所有“线程本地”的数据,并使用其他方式来选择数据。通常,线程本地数据是通过指针或索引寄存器(每个 CPU 特殊)找到的,该寄存器映射/指向“进程”或用户内存中的数据。“线程本地数据”不与其他线程隔离,因此如果您在一个线程中有内存覆盖,您可能会杀死另一个线程数据。
抱歉之前的回答。删除了答案。
TI PandaBoard 在 OMAP4430 双 Cortex A9 处理器上运行。每个内核有一个 MMU。它有 2 个用于 2 个内核的 MMU。
http://forums.arm.com/index.php?/topic/15240-omap4430-panda-board-armcortex-a9-mp-core-mmu/
上面的线程提供了信息。
此外,有关 ARM v7 的更多信息
每个核心具有以下特点:
双核配置由一组通用组件完成:
虽然所有这些都是针对 ARM 的,但它会提供一般的想法。
到目前为止,这里的答案似乎没有意识到转换后备缓冲区(TLB)的存在,这是 MMU 将进程使用的虚拟地址转换为物理内存地址的方式。
请注意,现在 TLB 本身是一个具有多级缓存的复杂野兽。就像 CPU 的常规 RAM 缓存 (L1-L3) 一样,您不一定期望它在任何给定时刻的状态都包含有关当前正在运行的进程的专门信息,而是根据需要逐个移动;请参阅维基百科页面的上下文切换部分。
在 SMP 上,所有处理器的 TLB 都需要保持系统页表的一致视图。有关处理它的一种方法,请参见例如linux kernel book 的这一部分。
AFAIK 每个物理处理器都有一个 MMU,至少在 SMP 系统中,所以所有内核共享一个 MMU。
在 NUMA 系统中,每个核心都有一个单独的 MMU,因为每个核心都有自己的私有内存。
在 ARMv8 中,表基地址寄存器具有 CnP 位以支持内部可共享域中的分片 TLB: 在此处输入图像描述
关于每个处理器的 MMU 问题,可能有多个。假设每个 MMU 都会增加额外的内存带宽。如果 DDR3-12800 内存在具有一个 MMU 的处理器上允许每秒 1600 兆次传输,那么一个具有四个 MMU 的处理器理论上将允许 6400。确保可用内核的带宽可能是一项壮举。在此过程中,所宣传的带宽将大大减少。
处理器上的 MMU 数量与其上的内核数量无关。最明显的例子是 AMD 的 16 核 CPU,它们肯定没有 16 个 MMU。另一方面,双核处理器可能有两个 MMU。或者只有一个。还是三个?
编辑
也许我将 MMU 与频道混淆了?