【发布时间】:2020-06-11 13:34:35
【问题描述】:
假设您有一个已完成的进程(现在不在内存中),但是当它运行时,它使用了 0x12345000 物理地址(4KB 页)。现在 MMU 将 0x12345000(物理)分配给另一个刚刚启动的进程。 但也许你在缓存(物理标记)中有前一个过程的数据的 0x12345 标记。这是一个连贯性问题。怎么解决的?
编辑:假设是:一个进程完成,另一个进程从磁盘传送到内存到内存的同一页运行。我的问题是:如何防止出现问题?我了解到,在将第二个进程带入内存之前,页面已清零。所以现在在缓存中我们有对应于该页面的零。但是页面有第二个进程的数据。这就是我所理解的,但可能是错误的。
Peter Cordes 的回答很完美!
【问题讨论】:
-
我在这里没有发现问题。操作系统可以让新进程看到前一个进程留在该页面中的任何陈旧数据,或者通过缓存命中,或者如果脏数据被写回,则通过从 RAM 填充。或者更可能在实际操作系统中,内核将在将物理页面(通过其虚拟地址)归零之前将其提供给新进程,以避免跨进程(可能还有用户)边界泄漏数据。在多核系统上,一致性由 MESI 或某种变体维护,因此无论新进程在哪个核上运行,缓存是否热都无关紧要。
-
彼得,我看到的问题是新进程在缓存中看到它想要访问的内存位置已经在缓存中(这会导致缓存命中)。但是要从缓存中使用的数据不是正确的数据,它是前一个进程的数据,映射到该物理方向,并且其数据仍保留在缓存中。 (我是 stackoverflow 的新手,我不知道这是否是回复您评论的最佳方式。我希望它能传达给您)。
-
您可以在使用@username 回复时通知他人。有时 Stack Overflow 会发送通知,就像在这种情况下一样,但最好确定一下,除非您在其他人的帖子下发表评论(然后他们总是会收到通知)。此外,“缓存”在 e 上没有重音。计算的含义来自名词merriam-webster.com/dictionary/cache,意思是隐藏的供应品(“食物的缓存”),它的发音与“现金”相同。不是cachet / caché 意味着声望。
-
回到您的问题:我认为您在这里混淆了两个概念:即使在没有缓存的系统中,操作系统通常也需要先将物理页面归零(或将新数据加载到其中)使用它来支持不同进程中的虚拟页面。如果没有,新进程将看到其中留下的任何陈旧数据。缓存与此无关。 PIPT 缓存对 CPU 完全透明(没有混叠问题);它基于物理地址进行缓存,因此即使操作系统将同一页面映射到另一个进程中的不同 virtual 地址,它也不会在意。
-
此外,“一致性”仅适用于同一内存的两个缓存之间,例如在多核 CPU 中。 en.wikipedia.org/wiki/Cache_coherence。也许您正在考虑缓存别名问题? (Definition/meaning of Aliasing? (CPU cache architectures))。 PIPT 缓存不受别名的影响,并且将相同的页面映射到相同的虚拟地址也使得 VIPT 甚至 VIVT 缓存不可能出现别名。缓存中的任何热行都将准确反映该物理内存页面中的内容。
标签: caching operating-system x86-64 cpu-cache dma