java - 如果将单个线程调度到多个内核,对内存可见性的影响
问题描述
这个问题专门关于 JVM 和内存可见性保证
假设我有一个t1
访问堆上变量的线程说x
假设线程计划在内核中执行并且在寄存器c1
中进行了修改x
(从 RAM 中获取之后)x
并且必须从寄存器中移出,因为t1
需要执行更多指令,这些指令需要将额外的数据加载到寄存器中。所以实际上x
是在c1
缓存而不是寄存器中
现在,操作系统将另一个线程调度t2
到c1
中,因此 cpu 寄存器中填充了新数据,但我们在缓存中仍有容量x
(实际上,我的意思是缓存可能尚未刷新到 RAM/L3。这是一个我的假设,不确定是否确实如此)
一段时间后,操作系统将原始t1
线程调度到新内核上c2
,是否t1
仍然需要在所有情况下查看x
in c1
s 缓存的最新值?
如果t1
inc2
没有看到最新x
的 in c1
,我相信我们会违反 JMM 的顺序一致性
我错了吗?
PS:我已经阅读了另一个讨论相同/相似问题的线程,但它并没有解决我满意的问题。所以在这里转发
解决方案
只是不要担心与缓存相关的不一致。JMM 向您隐藏所有特定于硬件的内存模型详细信息。因此,坚持它并从 JMM 的角度避免竞争条件就足够了。
如果您担心这样的低级细节,那么对于 x86,您可能需要阅读 Intel 手册 Vol 3A,第 8 章:
这些多处理机制具有以下特点:
[...]
• 保持缓存一致性——当一个处理器访问缓存在另一个处理器上的数据时,它不能接收到不正确的数据。如果它修改数据,访问该数据的所有其他处理器必须接收修改后的数据。
[...]
这应该足够令人信服,因此至少在 x86 上不必担心缓存不一致 :)
推荐阅读
- google-cloud-platform - 如何让嵌套虚拟化在 e2-micro GCP VM 上工作?
- python - 如何在列表中查找项目的索引,但不是完全匹配
- html - 如何创建 HTML?
- jquery - Jquery .html() 不附加信息
- visual-studio - 如何从 VCConfiguration 获取自定义构建工具属性
- r - 比较线性模型的交叉验证
- r - 如果闪亮中的 else 语句无法正常工作
- java - 如何在 java 中处理 tessrac 的图像?
- html - 如何提取 src Name 数据抓取
- android - 如何在 Android 中重复或重用 Activity