Caching 缓存一致性(物理标记的缓存的特殊情况)

Caching 缓存一致性(物理标记的缓存的特殊情况),caching,operating-system,x86-64,cpu-cache,dma,Caching,Operating System,X86 64,Cpu Cache,Dma,假设您有一个进程已经完成(现在不在内存中),但在运行时,它使用了0x12345000物理地址(4KB页面)。现在,MMU将0x12345000(物理)分配给刚刚启动的另一个进程。 但是,您可能在caché(物理标记)中使用了0x12345标记和上一个进程的数据。这是一个一致性问题。如何解决 编辑:假设是:一个进程完成,另一个进程从磁盘传送到内存,并运行到同一页内存。我的问题是:如何防止这方面的问题?我知道,在第二个进程进入内存之前,页面已归零。所以现在在缓存中,我们有对应于该页面的零。但是页面中

假设您有一个进程已经完成(现在不在内存中),但在运行时,它使用了0x12345000物理地址(4KB页面)。现在,MMU将0x12345000(物理)分配给刚刚启动的另一个进程。 但是,您可能在caché(物理标记)中使用了0x12345标记和上一个进程的数据。这是一个一致性问题。如何解决

编辑:假设是:一个进程完成,另一个进程从磁盘传送到内存,并运行到同一页内存。我的问题是:如何防止这方面的问题?我知道,在第二个进程进入内存之前,页面已归零。所以现在在缓存中,我们有对应于该页面的零。但是页面中有第二个进程的数据。这是我所理解的全部,但可能是错误的

彼得·科尔德斯的答案是完美的

但缓存中剩余的数据来自上一个进程

是的,这就是应该发生的事。缓存只是跟踪物理内存中的内容。这是它唯一的工作。它不了解流程

如果操作系统不希望新进程看到这些数据,内核需要运行一些指令将新数据存储到该页面,覆盖缓存和内存内容

缓存对此操作是透明的;无论缓存中的数据是否仍然是热的,或者在内核重用该物理页时旧进程的数据是否已写回RAM

(有关更多详情,另见问题下的评论)

我知道OS zero是一个物理页面,但这是在主内存中,但我说的是缓存内存中的剩余数据

我认为这是您困惑的根源:这种归零是在CPU执行普通存储指令时发生的。操作系统在CPU上运行,通过循环存储零的字节(或字)来归零页面。这些存储是普通的可缓存存储,与缓存/内存层次结构顶部的任何其他写入相同

如果操作系统想要将归零转移到缓存不一致的DMA引擎或blitter芯片上,那么是的,操作系统必须首先使该页面中的任何缓存线无效,以避免您所说的问题,即失去与RAM的一致性。但这不是正常情况


顺便说一句,“普通商店”仍然可以相当快。e、 g.现代x86 CPU可以使用SIMD指令或
rep stosb
存储32或64字节/时钟周期,这基本上是一个微代码内存集,可以在内部使用广泛的存储。AMD甚至有一个
clzero
指令将整个缓存线归零。但这些仍然是CPU指令,其内存视图通过缓存


为新进程加载新代码/数据 现代x86-64系统具有缓存一致性DMA,因此这不是问题。在现代x86-64中,当内存控制器内置到CPU时,这很容易实现,因此PCIe流量可以在经过时检查三级缓存。在前一个进程的缓存中,哪些缓存线仍然是热的并不重要;DMA进入该页将从缓存中逐出这些行。(或者,对于非DMA“编程IO”,数据实际上通过运行在CPU内核上的驱动程序代码加载到寄存器中,并通过正常存储器存储到内存中,这些存储器同样与缓存一致)


一些Xeon系统甚至可以DMA到L3缓存中,从而避免了主内存延迟/带宽瓶颈(例如,对于千兆网络),并节省了电源

没有缓存一致性的较旧系统在DRAM中的数据发生更改时,必须小心避免过时的缓存命中。这是一个真正的问题,而且不限于启动新进程。将刚刚释放的(
munmap
ped)页面重新用于另一个文件的新
mmap
,必须考虑这一点。任何磁盘I/O都必须担心这一点,包括写入磁盘:您需要将数据从缓存同步到DRAM,在DRAM中数据可以被DMAed到磁盘

这可能需要在页面上循环,并在其他ISA上运行类似于
clflush
的指令或等效指令。(我不知道操作系统在
clflush
之前的x86 CPU上做了什么,如果有任何缓存不一致的话)您可能会在Linux内核的doc目录中找到一些关于它的信息

这可能与2002年的情况有关。在这一点上,x86已经被称为具有缓存一致性DMA,所以也许x86一直都具有这种特性。在SSE之前,我不知道x86如何能够可靠地使缓存失效,除了
wbinv
,它速度非常慢,而且在系统范围内(使所有缓存线失效,而不仅仅是一个页面失效),出于性能原因,它实际上不可用


无论采用哪种方式(一致性还是非一致性),操作系统都不会浪费时间将零存储到它将要从磁盘读取的页面。对新进程的BSS以及它使用
mmap(MAP\u ANONYMOUS)
分配的任何页面进行调零,而不是对其代码/数据部分进行调零


另外,作为新进程执行的可执行文件可能已经在RAM中,在这种情况下,您只需设置新进程的页表。

当第一个进程终止时,其所有物理内存页都会被操作系统“释放”。在几乎所有情况下,内核都会将这些新释放页面的内容归零(这会使系统中任何位置的物理地址的任何缓存副本无效),并“击落”相应的TLB条目(因此没有TLB保留从以前的虚拟地址到物理地址的映射)。只有在每个TLB条目都被“击落”并且每个页面都被归零之后,内核才能将该页面添加到“自由列表”中,此时它才有资格重新使用

根据硬件的功能和操作系统开发人员的偏好,这种模式有很多变化。我似乎记得在SGI IRIX操作系统中