如果将单个线程调度到多个内核,则会对内存可见性产生影响

时间:2019-06-02 10:55:28

标签: java multithreading scheduling multicore cpu-cache

这个问题专门关于JVM和内存可见性保证

假设我有一个线程t1,该线程访问堆上一个x的变量

假设线程计划在内核c1中执行,并且已经修改了寄存器中的x(从RAM中提取),并且x必须移出寄存器,因为{{ 1}}需要执行更多的指令,这些指令需要将其他数据加载到寄存器中。因此实际上t1位于x的缓存中,而不是寄存器中

现在,操作系统将另一个线程c1调度到t2中,因此cpu寄存器中充满了新数据,但是我们仍然在缓存中具有c1的容量(实际上,我表示可能未将缓存刷新到RAM / L3。这是我的假设,不确定是否确实如此)

一段时间后,操作系统将原始x线程调度到新的核心t1上,仍然需要c2来查看{{1}中t1的最新值}在所有情况下都缓存?

如果x中的c1t1中看不到最新的c2,我相信我们将违反JMM的顺序一致性

我错了吗?

PS:我已经阅读了另一个讨论相同/相似问题的主题,但是并没有解决我满意的问题。所以在这里重新发布

Data visibility on multi-core processor by single thread

1 个答案:

答案 0 :(得分:1)

不必担心与缓存相关的不一致。 JMM向您隐藏所有特定于硬件的内存模型详细信息。因此坚持下去并从JMM的角度避免竞争条件就足够了。

如果您担心如此低的细节,那么在x86的情况下,您可能需要阅读Intel手册Vol 3A,第8章:

  

这些多处理机制具有以下特点   特点:

     

[...]

     

•维护高速缓存一致性—当一个处理器访问时   数据缓存在另一个处理器上,它一定不能   接收不正确的数据。如果它修改数据,则所有其他处理器   访问该数据必须接收修改后的数据。

     

[...]

这应该足以令人信服,因此至少不必担心x86上的缓存不一致:)