lewis89 最近的时间轴更新
lewis89
ONLINE

lewis89

V2EX 第 443327 号会员,加入于 2019-09-26 07:45:35 +08:00
今日活跃度排名 700
收一个蜗牛 带价来
二手交易  •  lewis89  •  3 天前  •  最后回复来自 luvroot
10
国航 switch 256G 破解 双系统 带一个良值手柄
二手交易  •  lewis89  •  9 天前  •  最后回复来自 inorilzy
4
我们是正经的技术内推交流群
程序员  •  lewis89  •  19 天前  •  最后回复来自 lewis89
35
难道 Linux 不比 Windows 安全吗?
新手求助  •  lewis89  •  23 天前  •  最后回复来自 towser
38
调查一下,有多少开发是懂汇编语言的
调查  •  lewis89  •  19 天前  •  最后回复来自 lewis89
49
lewis89 最近回复了
49 分钟前
回复了 catror 创建的主题 分享发现 温铁军:解构现代化
何为现代化,那就是资本的集约化,何为资本的集约化,那就资本会越来越掌握在少数人手中,虽然整体社会的效率提升了,相比过去生产力水平提升了,但是人民的福祉并不会提升,该包身工的,21 世纪继续会成为包身工,只不过他们有了一个新的名字 --- 996
53 分钟前
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@nuk #15 几乎所有语言都只是 保证单线程自身的 as-if-serial 语义,因为到 CPU 层面 你也不知道 CPU 干了什么优化,CPU 也是保证单线程的 as-if-serial,除非你强制使用 内存栅栏去同步,这样 CPU 就会 invalid 掉 它的重排序
7 小时 11 分钟前
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@sagaxu #6 system.out.println 这个我也研究过了 println 方法里面的 synchronize 关键字 在底层就用到了 同步的原语
7 小时 15 分钟前
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@mind3x #9 这个我就不了解了,从我了解的资料来看,包括我看 GCC 的编译后的汇编,都存在重排序优化的情况,所以我对 Java 字节码 也是一种猜测。
7 小时 15 分钟前
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@fuse #7

重排序是完全可能发生的,因为从编译器到 CPU 都是保证单线程 as-if-serial 语义,
多线程的时候只能用到处理的同步原语才能解决

int a = 2;
int c = 1 + a;
float b = 3f / 2f;

像这种代码 第三条代码完全可能发生重排序,因为浮点运算会用到 FPU 而 CPU 完全是空闲出来的,
而且从 CPU 优化的角度来看,第一条指令跟第二条有依赖,所以不会重排,但是 第三条指令跟 第一条 and 第二条指令不存在任何依赖,所以将 float b= 3f/2f 提前拿出来 交给 FPU 计算 得出结果是完全合理的,而且并不会影响程序的正确性,当然这一切都是在单线程的情况下,如果你多线程需要同步,那么必然要用 x86 lock mfence 这些原语来禁止 重排序
8 小时 11 分钟前
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@lewis89 #3 关于这些验证的猜想,都得像寻宝一样,设置各种运行条件,参考各种资料,然后到汇编代码层面去验证才能还原出结果来,对于初学者,我不建议大家这么去研究,一来这样研究的价值跟意义不大,应用层面的编程你只要遵循 Java 提供的抽象模型 Happen before 即可,二来如果你计算机体系结构基础不是很扎实的话,很难弄明白底层干了什么,当然如果你是反汇编 搞破解出生的,这些问题就能有办法研究清楚
8 小时 42 分钟前
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
另外书上讲的不一定是发生了指令重排序,也有可能是内存可见性的问题,

sysout() 线程可能根本就没观测到 change() 线程里面 对变量 a 的修改,因为 a 既没有 volatile ( x86 的 lock 原语),可能线程 sysout() 取到 a 的值 只是它在寄存器里面之前的拷贝,或者是线程 sysout() CPU 的 L1 的缓存,
而且 sysout() 跟 change() 线程 都没有用到 同步的原语
8 小时 51 分钟前
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
说实在话 这个东西验证很困难,涉及到很多技术细节

1. 你要确认 class 文件的字节码是否存在重排序,最好去翻一下字节码,一般这种简单的代码,
我觉得可能字节码层面不会发生重排序

2. 你要用这些代码 反复运行 让 JVM 生成 JIT 后的汇编指令,看下 JIT 后的汇编代码是否存在重排序

3. CPU 层面还有分支预测跟指令冒险 这个更加不好验证

4. 另外这里多线程的话 还要涉及到内存可见性的问题的,因为 CPU 的 L1 L2 L3 同步的模型很复杂,
现在 X86 都是 TSO 模型,具体到 Intel 下面还有 MESI 的模型,另外 AMD zen2 架构流行后,
现在又开始流行 NUMA 了,总之多线程同步下面的技术细节太多。


有兴趣的话 你可以研究我的这篇博文,是关于内存可见性的研究,里面对 JVM 的 JIT 后的代码 用 GDB 打断点验证过了
https://www.cnblogs.com/richard-winters/p/14237940.html

关于重排序跟 memory barrier 这块,你只要记住 多线程同步的时候 一定要用 Java 的锁或者原子变量就行了,
因为这两个都会用 x86 的同步原语 lock sfence mfence 等指令,如果不想搞清楚底层同步的原语,最好的办法就是记住 Java 的 happen before 原则就行了,这样多线程编程的时候就不会被底层的技术细节给搞蒙 B 了。
21 小时 13 分钟前
回复了 ohoh 创建的主题 macOS 黑果, 硬件白痴, 虚心请教
@ohoh #3 不要上 tonymacx86 就行.. 你可以关注一下 司博图
关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1333 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 23:16 · PVG 07:16 · LAX 15:16 · JFK 18:16
♥ Do have faith in what you're doing.