如果我有一个双核 CPU,每个核都有自己的 L1 缓存,Core1 和 Core2 是否可能同时缓存同一部分内存?
如果可能,如果 Core1 和 Core2 都在缓存中编辑了它们的值,主内存的值会是多少?
答案1
如果我有一个具有两个核心的 CPU,每个核心都有自己的 L1 缓存,那么 Core1 和 Core2 是否可能同时缓存同一部分内存?
是的。如果不是这样,性能会很糟糕。考虑两个运行相同代码的线程。您希望该代码在两个 L1 缓存中。
如果可能的话,如果 Core1 和 Core2 都在缓存中编辑了它们的值,那么主存储器的值会是多少?
旧值将位于主内存中,这无关紧要,因为两个 CPU 都不会读取它。在从缓存中弹出修改后的值之前,必须将其写入内存。通常,MESI 协议在传统的 MESI 实现中,如果某个值在一个缓存中被修改,则该值根本不能出现在同一级别的任何其他缓存中。
答案2
是的,这种情况(两个缓存缓存相同的内存区域)是可能发生的,实际上这是一个在实践中经常发生的问题。有多种解决方案,例如:
- 两个缓存可以进行通信,以确保它们不会产生分歧
- 你可以有某种监控程序来监控所有缓存并进行相应的更新
- 每个处理器都会监视自己缓存的内存区域,当检测到写入时,就会抛出其(现在无效的)缓存
这个问题被称为高速缓存一致性。 这维基百科上关于该主题的文章对问题和可能的解决方案有一个很好的概述。
答案3
要回答标题中的问题,这取决于缓存协议是什么。如果是写回的,则只有当缓存控制器别无选择地将新的缓存块放入已占用的空间时,缓存才会刷新回主内存。先前占用该空间的块将被删除,其值将写回主内存。
另一种协议是直写。在这种情况下,每当在 n 级写入缓存块时,n+1 级上的相应块都会更新。(这在概念上类似于在下方用复写纸填写表格;您在顶部写的任何内容都会复制到下面的表格上。)这更慢,因为它显然涉及更多写入操作,但缓存之间的值更一致。在回写方案中,只有最高级别的缓存才会具有特定内存块的最新值。