免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 63511 | 回复: 97
打印 上一主题 下一主题

那为大侠给俺讲讲cache和volatie变量的关系 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-29 13:44 |只看该作者 |倒序浏览
上次面试被考官问到volatie变量,他说这个要结合cache来讲才能说的清,那位大侠给讲一下。

论坛徽章:
0
2 [报告]
发表于 2008-02-29 14:13 |只看该作者
什么cache?我只觉得跟优化有关系。。。

论坛徽章:
0
3 [报告]
发表于 2008-02-29 14:20 |只看该作者
原帖由 南海一钓叟 于 2008-2-29 13:44 发表
上次面试被考官问到volatie变量,他说这个要结合cache来讲才能说的清,那位大侠给讲一下。

他骗你的。
volatie变量和cache没有关系,只和内存有关系。
简单点说就是每次操作前从内存取值
有volatie修饰的变量,每次操作时遵循下面动作:
从内存取值 ---> 放入寄存器 ----> 操作 ---->写回内存
没有volatie修饰的变量,操作可能遵循(可能就是不是所有情况都如此):
从内存取值 ---> 放入寄存器 ----> 第一次操作 -----> 第二次操作(此时仍操作寄存器中的值) …… ---->第N次操作 ---->写回内存

举个例子论述两者关系:
int volatie i; //全局变量,在其它地方会被修改


while (i)
{
do_somethings();
}

如果i没有被volatie修饰,当while循环执行时,另一段程序并发的执行了i=0, 这个循环仍不会退出,因为每次循环都是检查寄存器中的值。
如果有volatie修饰,那么循环结束,因为循环每次检查i的时候,会先从内存把i读入寄存器,这个时候i在其它地方被赋0,则循环结束。

论坛徽章:
0
4 [报告]
发表于 2008-02-29 15:00 |只看该作者
有关系的,volatile变量的修改要求即时被所有cpu可见,所以会要求cache一致性。对一些weak memory model的cpu,还有对memory access order的限制。

论坛徽章:
0
5 [报告]
发表于 2008-02-29 15:13 |只看该作者
原帖由 tinywind 于 2008-2-29 15:00 发表
有关系的,volatile变量的修改要求即时被所有cpu可见,所以会要求cache一致性。对一些weak memory model的cpu,还有对memory access order的限制。

不不不,这个一致性并非是volatile引起的,而是从内存取值都会有的问题。
假设有两个CPU,CPU1和CPU2, 一个变量A(不管有没有volatile修饰)位于地址addr1

CPU1修改了变量A,同步回内存,这个时候可能它并没有直接被写到内存,而是放到CPU1的缓存中了。这个时候CPU2要从内存中读入A的值,会向总线提交地址addr1。由于一个总线的translation阶段有个snoop(监听)阶段,CPU1就会得知CPU2在请求位于地址addr1的变量A的值,则CPU1会把变量A的值同步回内存,从而CPU2从内存读到的A的值就是最新的。从而保证了一致性。

所以这个一致性和volatie没有关系,只要是变量在修改后写回内存,硬件机制就会保证它们的一致性。
故前面提到的volatie变量修改顺序中最后一步:
从内存取值 ---> 放入寄存器 ----> 操作 ---->写回内存
就做了这个一致性保证。

评分

参与人数 1可用积分 +3 收起 理由
cugb_cat + 3 精品文章

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2008-02-29 15:22 |只看该作者
原帖由 tinywind 于 2008-2-28 23:00 发表
有关系的,volatile变量的修改要求即时被所有cpu可见,所以会要求cache一致性。对一些weak memory model的cpu,还有对memory access order的限制。

这个access order应该不是能用volatile可以解决的。。。

论坛徽章:
0
7 [报告]
发表于 2008-02-29 15:24 |只看该作者
多谢zx_wing 和tinywind两位大侠给的解释,本来一头雾水,现在终于有点了解了,但是有些不明白的就是zx_wing说到了两个CPU,这个我不是很理解了,

论坛徽章:
0
8 [报告]
发表于 2008-02-29 15:32 |只看该作者
原帖由 南海一钓叟 于 2008-2-29 15:24 发表
多谢zx_wing 和tinywind两位大侠给的解释,本来一头雾水,现在终于有点了解了,但是有些不明白的就是zx_wing说到了两个CPU,这个我不是很理解了,

这个其实和volatie没有关系,不理解就算了,这个是前端总线怎么在多CPU情况下如何保证内存一致性的方法。
我说这个主要是想说明volatie和cache是没有关系的。

如果volatie可以指定编译器执行内存同步(也就是cache同步),那么一个简单的实验就可以检验。
写一个小程序,修改了volatie变量,编译成汇编,然后看修改 volatie 变量的下一条指令是否带有隐式的内存同步功能,或显式的执行了内存屏障指令。很明显可以看到,编译器实际上是没有这样做的。

我认为LZ只要理解了我第一个回帖中的内容即可。

[ 本帖最后由 zx_wing 于 2008-2-29 15:34 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-02-29 15:32 |只看该作者
学习,学习

论坛徽章:
0
10 [报告]
发表于 2008-02-29 15:33 |只看该作者
原帖由 mingyanguo 于 2008-2-29 15:22 发表

这个access order应该不是能用volatile可以解决的。。。

不能解决,这个要靠带有内存屏障功能的指令才行,volatile不能指定编译器生成这样的指令。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP