关注
假设一台计算机配备两个CPU,在每个CPU中,cache 按地址被分成了两块 cache banks,分别是cache bank0 和 cache bank1。
举个理想的内存访问指令顺序例子:
1,CPU0往cache address 0×12345000 写入一个数字 1。因为address 0×12345000是偶数,所以值被写入 bank0.
2,CPU1读取 bank0 address 0×12345000 的值,即数字1。
3,CPU0往 cache 地址 0×12345100 写入一个数字 2。因为address 0×12345100是奇数,所以值被写入 bank1.
4,CPU1读取 bank1 address 0×12345100 的值,即数字2。
重排序后的内存访问指令顺序:
1,CPU0 准备往 bank0 address 0×12345000 写入数字 1。
2,CPU0检查 bank0 的可用性。发现 bank0 处于 busy 状态。
3,CPU0 为了防止 cache等待,发挥最大效能,将内存访问指令重排序。即先执行后面的 bank1 address 0×12345100 数字2的写入请求。
4,CPU0检查 bank1 可用性,发现bank1处于 idle 状态。
5,CPU0 将数字2写入 bank 1 address 0×12345100。
6,CPU1来读取 0×12345000,未读到 数字1,出错。
7,CPU0 继续检查 bank0 的可用性,发现这次bank0 可用了,然后将数字1写入 0×12345000。
8,CPU1 读取 0×12345100,读到数字2,正确。
可以看到第 3 步发生了指令重排序,并导致第 6步读到错误的数据。通过对指令重排,CPU可以获得更快地响应速度。重排序是为了优化性能,但是不管怎么重排序,单线程下程序的执行结果不能被改变。
内存屏障是用来防止CPU出现指令重排序的利器之一,一般在Java中,我们可以使用volatile来修饰变量,volatile底层就是使用到了内存屏障。
内存屏障会提供3个功能:
1.在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2.它会强制将对缓存的修改操作立即写入主存;
3. 如果是写操作,它会导致其他CPU中对应的缓存行无效。
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
- 1... 《从研一摆烂到稳拿oc:嵌入式er的踩坑血泪史,这些弯路真的别再走了!》4755
- 2... 害,找工作哪有不上当的!4522
- 3... 找到靠谱的公司,少走些弯路3359
- 4... 双非秋招timeline供参考(腾讯字节阿里快手美团)3177
- 5... 最近面试回答不出来的题3014
- 6... 26国考公告出炉,放宽到38岁意味着什么2885
- 7... 末9四段大厂实习|秋招收尾结束2759
- 8... 牛牛求救🆘,不敢梭哈后端第二技能点怎么搭配2270
- 9... 国庆可能会被打折,但发疯文学永远不打折!2190
- 10... 京东官宣发布新车,会有新的HC吗?2077
正在热议
更多
# 找工作中的小确幸 #
10639次浏览 98人参与
# 秋招踩过的“雷”,希望你别再踩 #
20152次浏览 225人参与
# 爱玛科技集团求职进展汇总 #
30269次浏览 209人参与
# 面包vs爱情,怎么选? #
17260次浏览 187人参与
# 实习在多还是在精 #
3307次浏览 44人参与
# 发面经攒人品 #
2350141次浏览 32674人参与
# 反问环节如何提问 #
107082次浏览 2009人参与
# 实习下班不想学习,正常吗? #
3657次浏览 48人参与
# 机械求职避坑tips #
67437次浏览 449人参与
# 校招谈薪一定要知道的事 #
3506次浏览 53人参与
# 你觉得什么岗位会被AI替代 #
4942次浏览 83人参与
# 贝壳求职进展汇总 #
36389次浏览 202人参与
# 机械人值得去的小众企业 #
24482次浏览 54人参与
# 浪潮求职进展汇总 #
18030次浏览 137人参与
# 秋招结束之后的日子 #
88908次浏览 986人参与
# 实习最想跑路的瞬间 #
82095次浏览 524人参与
# 你做过哪些dirty work #
20063次浏览 143人参与
# 选完offer后,你后悔学机械吗? #
39552次浏览 243人参与
# 投格力的你,拿到offer了吗? #
119360次浏览 686人参与
# 诺瓦星云求职进展汇总 #
220073次浏览 1715人参与
# 机械人,签完三方你在忙什么? #
61869次浏览 235人参与