![]() |
1
7
如果没有缓存一致性
|
![]() |
2
10
简而言之,非缓存一致性系统非常难以编程,特别是如果您想保持效率的话——这也是当今大多数NUMA系统都是缓存一致性的主要原因。 如果缓存不连贯,则“显式步骤”必须强制执行一致性-显式步骤通常是关键部分/互斥(例如C/C++中的易失性)。这是相当困难的,如果不是不可能的服务,如互斥,保持跟踪只有内存有变化,需要在所有的缓存更新-它可能必须更新所有的内存,也就是说,如果它甚至可以跟踪哪些核心有哪些块的内存在他们的缓存。 可以推测,硬件在跟踪已更改的内存地址/范围并保持同步方面可以做得更好、更有效。
如果缓存不是可选择的,这将是非常致命的,否则在core1的缓存中可能会有进程数据的残余,而core2的缓存中不存在。不过,对于以这种方式工作的系统,操作系统必须在调度线程时强制执行缓存一致性—这可能是一个“更新所有内核之间缓存中的所有内存”操作,或者它可以借助MMU跟踪脏页,并且只同步已更改的内存页—再次,硬件可能以更精细和有效的方式保持缓存的一致性。 |
![]() |
3
8
要记住的另一件事是连贯性和一致性之间的区别。因为即使x86派生的CPU使用存储缓冲区,也不能保证已经完成的指令修改了内存,使得其他CPU可以看到这些修改,即使编译器决定将值写回内存(可能是因为
|
![]() |
4
1
当您处理多个线程并从多个线程访问同一变量时,缓存一致性变得非常重要。在那种情况下,你 有 要确保所有处理器/核心在同时访问变量时看到相同的值,否则您将有非常不确定的行为。 |
|
5
1
|
![]() |
6
0
缓存一致性是在硬件中实现的,因为在多核/多处理器环境中运行时,程序员不必担心确保所有线程都能看到内存位置的最新值。Cache coherence提供了一种抽象,即所有核心/处理器都在一个统一的Cache上运行,尽管每个核心/处理器都有自己的单独Cache。 它还可以确保遗留的多线程代码在新处理器模型/多处理器系统上正常工作,而无需进行任何代码更改以确保数据一致性。 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 3 年前 |