L1、L2 和 L3 缓存如何与多个并发 运行 进程一起工作?

How does L1, L2 and L3 cache work with multiple concurrently running processes?

几年来我一直在研究缓存以及如何有效地利用它。我知道缓存的层次结构,如何根据缓存行获取缓存块,预取器如何检测内存访问模式并根据它提前获取内存,甚至缓存如何在线程上工作以及多线程缓存的陷阱-线程程序。

我一直没能弄清楚缓存是如何在具有多个并发 运行ning 进程的计算机上工作的。多年来,我意识到我的程序只是 运行 与计算机中其他进程并存的另一个进程。即使我的程序是唯一的程序 运行,后台仍然会有 OS 运行ning。

话虽如此,缓存如何与多个进程同时工作 运行ning?它们是在每个进程之间共享,还是在上下文切换时驱逐了一个进程的缓存内存?也许答案是两者兼而有之?

场景不多,挑一个吧。在这种情况下,缓存是通过物理地址访问的。

并行执行的所有多个进程(P1、P2...Pn)都在虚拟地址上运行。我们可以让 TLB(保存虚拟到物理的转换)在上下文切换时刷新其条目。所有进程都可以拥有相同数量的虚拟页面。但在给定时间,只有少数人被流程引用。因此,您可以将这些最常用的页面保存在物理内存中,其余的保存在硬盘中。这适用于所有当前活动的进程。

当前进程P1在运行时,需要从内存中取数据时,流程类似,就好像只有一个进程一样。这里需要注意一点,当进程 P1 发生页面错误时,如果物理内存中要替换的页面属于另一个进程,则需要更新该进程的页面 table 以反映这一点。

如果您检查物理页面的上下文,它可能有来自多个进程的页面。这很好,因为每个进程的页面 tables 将知道哪个虚拟页面位于哪个物理位置。

大多数 CPUs 都设计有基于 物理 地址缓存的缓存,因此即使 TLB 失效需要,它们在上下文切换后仍然是热的a 页面遍历以找到虚拟地址的正确物理页面。

如果进程迁移到另一个 CPU 核心,私有 L1 和 L2 将是冷的,但共享的 L3 仍然是热的。