Caching 一级、二级和三级缓存如何处理多个并发运行的进程?

Caching 一级、二级和三级缓存如何处理多个并发运行的进程?,caching,multiprocessing,cpu,cpu-architecture,cpu-cache,Caching,Multiprocessing,Cpu,Cpu Architecture,Cpu Cache,几年来,我一直在研究缓存以及如何有效利用缓存。我知道缓存的层次结构,如何根据缓存线提取缓存块,预取器如何检测内存访问模式并根据它提前提取内存,甚至缓存如何在线程上工作,以及多线程程序中缓存的陷阱 在经历了这么长时间之后,我一直无法发现缓存在具有多个并发运行进程的计算机上是如何工作的。多年来,我意识到我的程序只是计算机中与其他进程同时运行的另一个进程。即使我的程序是唯一正在运行的程序,也会有操作系统在后台运行 话虽如此,缓存如何在多个进程同时运行的情况下工作?它们是在每个进程之间共享的还是一个进程

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

在经历了这么长时间之后,我一直无法发现缓存在具有多个并发运行进程的计算机上是如何工作的。多年来,我意识到我的程序只是计算机中与其他进程同时运行的另一个进程。即使我的程序是唯一正在运行的程序,也会有操作系统在后台运行


话虽如此,缓存如何在多个进程同时运行的情况下工作?它们是在每个进程之间共享的还是一个进程的缓存内存在上下文切换时被逐出?也许答案是两者有点混合?

有几个场景,让我们选择一个。在这种情况下,使用物理地址访问缓存

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

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


如果检查物理页面的上下文,它可以包含来自多个进程的页面。每个进程的页面表都会知道虚拟页面在哪个物理位置。

大多数CPU都设计有基于物理地址的缓存,因此在上下文切换后它们仍然可能是热的,即使TLB失效需要页面漫游来为虚拟地址找到正确的物理页面


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

数据缓存与进程正交(这只是一个软件概念),通常不会刷新。进程可能会相互弄乱缓存线,尽管empasse情况很少见。由于页表的更改,某些缓存(如TLB)会在上下文开关上部分刷新。BTB实际上是一个缓存,当进入特定模式(SMM、SGX)、预测模式改变(仍然是IBRS)或按需(IBPB)时,它也可以自动刷新(IBRS)。听起来像是在问。我投票决定结束这个问题,因为它太宽泛了。我决定选择这个答案,因为它更直接地解决了缓存问题