免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dingyujie
打印 上一主题 下一主题

[内核同步] 关于自旋锁中的忙等的疑问 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-12-14 09:07 |只看该作者
mark,高手如云,问题分析得都很深刻。个人赞同liuiang 的分析。bensenq 的分析也很精彩。

论坛徽章:
0
22 [报告]
发表于 2012-12-14 23:35 |只看该作者
非常感谢您的分析,学习了回复 13# bensenq


   

论坛徽章:
0
23 [报告]
发表于 2012-12-17 14:41 |只看该作者
回复 21# cengku


    他对volatile的理解是不对的,怎么这么基础的问题这么多人都不知道?编译器对一个变量会做什么样的优化而volatile会阻止什么样的优化不是个很基本的知识?不要被错误的认识给误导。
    另外这个问题的结论是必须加上这一句才能阻止编译器的优化,程序运行才正确。性能优不优化不清楚,可能跟体系架构有关,即使有,也只是个附带的作用。

论坛徽章:
0
24 [报告]
发表于 2012-12-17 20:53 |只看该作者
leslielg 发表于 2012-12-17 14:41
回复 21# cengku

他对volatile的理解是不对的,怎么这么基础的问题这么多人都不知道?编译器对一个变量会做什么样的优化而volatile会阻止什么样的优化不是个很基本的知识?不要被错误的认识给误导。
    另外这个问题的结论是必须加上这一句才能阻止编译器的优化,程序运行才正确。性能优不优化不清楚,可能跟体系架构有关,即使有,也只是个附带的作用。


我想大家对volatile的理解并不像你想象的那样,大家应该都理解volatile的含义和作用,您再看看是不是自己搞错了?

1. 楼主的问题是rep:nop的作用,所以前面几楼的回答都没什么大问题,其等价的pause简单的说就是对cpu能耗的优化,但你确纠结在__asm__ __volatile__上了。

2. __asm__ __volatile__中的volatile是用来修饰后面的内嵌汇编的, 告诉编译器不要随便优化我后面的汇编代码,否则可能会有逻辑错误,这里跟lock变量没有任何关系。另外,因为这里的内嵌汇编非常简单,根本没有什么可以优化的,所以这里用__asm__ __volatile__和只用__asm__编译出的汇编代码没有任何区别。(加不加-O2都一样)

3. 造成上面说的在循环体内加  __asm__ __volatile__("rep;nop":::"memory"; 跟不加这条语句造成加优化编译后逻辑上正确与错误的区别,原因是是汇编指令中的"memory",memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废,cpu将不得不在需要的时候重新读取内存中的数据。
简单的验证方法是将这条语句改成 __asm__ __volatile__("rep;nop"::; 加优化编译后依然有逻辑错误。

4. 说到这里你应该已经明白了,要达到你说的目的,直接将lock变量的定义前加volatile就可以了。循环体内的内嵌汇编真正的作用是优化用的,不过其中的"memory"恰好解决了-O2编译时可能导致的逻辑错误问题,跟volatile是没有关系的。

论坛徽章:
1
水瓶座
日期:2013-09-28 21:40:25
25 [报告]
发表于 2012-12-17 21:14 |只看该作者
回复 24# allen303allen

跟我理解的一样,并且补充了一些我不知道的东西,感谢。
   

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
26 [报告]
发表于 2012-12-17 21:15 |只看该作者
我的理解跟leslielg 应该是一样的,并大部分同意楼上。leslielg 说的volatile与代码的__volatile__并不是一回事。

论坛徽章:
0
27 [报告]
发表于 2012-12-17 23:05 |只看该作者
intel的架构还在用锁总线的办法来做spin lock么?。。。怪不得能耗大。。。

arm用的strex和ldrex已经可以不需要锁总线了,显式的wfi指令主动进入低能耗loop。

论坛徽章:
0
28 [报告]
发表于 2012-12-18 15:57 |只看该作者
是的回复 27# onlyxuyang


   

论坛徽章:
0
29 [报告]
发表于 2012-12-20 09:25 |只看该作者
volatile的理解大家应该都是一致的,volatile跟性能没有半分钱的关系。
回复 23# leslielg


   

论坛徽章:
0
30 [报告]
发表于 2012-12-20 09:37 |只看该作者
黄总的分析很清晰,说到了问题的本质,学习了!
allen303allen 发表于 2012-12-17 20:53
我想大家对volatile的理解并不像你想象的那样,大家应该都理解volatile的含义和作用,您再看看是不是自 ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP