gpt4 book ai didi

java - 单核 cpu 上的 volatile 和 synchronized(示例 - pentium pro)

转载 作者:行者123 更新时间:2023-11-29 02:57:54 28 4
gpt4 key购买 nike

我已阅读并详细了解 Java volatile 和 synchronized 关键字在基于 SMP 架构的 CPU 中 cpu 级别的含义。

这里有一篇关于该主题的优秀论文:

http://irl.cs.ucla.edu/~yingdi/web/paperreading/whymb.2010.06.07c.pdf

现在,将 SMP cpus 放在一边来解决这个问题。我的问题是:volatile 和 synchronized 关键字如何工作,因为它与旧的单核 CPU 相关。以 Pentium I/Pro/II/III/早期 IV 为例。

我特别想知道:

1) L1-L2 缓存是否不用于读取内存地址,所有读写都直接对主内存执行?如果是,为什么? (既然只有一个缓存副本,不需要一致性协议(protocol),为什么缓存不能直接被两个对单核CPU进行时间分片的线程使用?)。这是我在阅读了数十个关于 volatile 如何读写“主内存中的主副本”的互联网论坛后问这个问题的。

2) 除了锁定 this 或 specified 对象(更像是 Java 平台)之外,synchronized 关键字对单核 CPU(编译器、汇编、执行、缓存)还有哪些其他影响?

3) 对于非超标量 CPU (Pentium I),指令不会重新排序。那么如果是这样的话,那么在 Pentium 1 上运行时是否需要 volatile 关键字? (原子性、可见性和排序将是“没有问题”的权利,因为只有一个缓存,一个核心在缓存上工作,并且没有重新排序)。

最佳答案

1) Is the L1-L2 caches not used to read memory addresses and all reads and writes are performed directly to main memory?

没有。缓存仍处于启用状态。这与 SMP 无关。

2) Apart from taking a lock on the this or specified object which is more of a Java platform thingy, what other effects does the synchronized keyword have on single core CPUs (compilers, assembly, execution, cache) ?

3) Does anything change with respect to a superscalar/non superscalar architecture (out-of-order) processor w.r.t these two keywords?

天啊,你一定要问这个关于 Java 的问题吗?请记住,所有事情最终都会归结为良好的老式机器指令。我不是很熟悉 Java 同步的内部结构,但据我了解,synchronized 只是典型的监视器式同步机制的语法糖。临界区中不允许同时存在多个线程。不是简单地在自旋锁上旋转,而是利用调度程序 - 等待线程进入 hibernate 状态,并在能够再次获取锁定时唤醒。

要记住的是,即使在单核、非 SMP 系统上,您仍然必须担心操作系统抢占线程!只要操作系统需要,这些线程就可以在 CPU 上和关闭时进行调度。当然,这就是锁的用途。

同样,这个问题最好在汇编的上下文中提出,甚至是 C(其编译结果通常可以直接推断),而不是 Java,后者必须处理 VM、JIT 代码等。

关于java - 单核 cpu 上的 volatile 和 synchronized(示例 - pentium pro),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23487397/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com