首页 > 解决方案 > 如果将单个线程调度到多个内核,对内存可见性的影响

问题描述

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

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

假设线程计划在内核中执行并且在寄存器c1中进行了修改x(从 RAM 中获取之后)x并且必须从寄存器中移出,因为t1需要执行更多指令,这些指令需要将额外的数据加载到寄存器中。所以实际上x是在c1缓存而不是寄存器中

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

一段时间后,操作系统将原始t1线程调度到新内核上c2,是否t1仍然需要在所有情况下查看xin c1s 缓存的最新值?

如果t1inc2没有看到最新x的 in c1,我相信我们会违反 JMM 的顺序一致性

我错了吗?

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

单线程在多核处理器上的数据可见性

标签: javamultithreadingschedulingmulticorecpu-cache

解决方案


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

如果您担心这样的低级细节,那么对于 x86,您可能需要阅读 Intel 手册 Vol 3A,第 8 章:

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

[...]

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

[...]

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


推荐阅读