免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-09 12:58 |只看该作者 |正序浏览
我们知道内核中,如果某个自旋锁暂时获取不到,就进入一个忙等阶段,大概的代码归纳为:

while (lock != 1) {
    __asm__ __volatile__("rep;nop": : :"memory");
}

查了一些资料也不太清楚rep;nop的作用,我想问的是,如果这里就是简单的写一个死循环会怎样,即:
while (lock != 1);

请大牛指点!谢谢

论坛徽章:
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
36 [报告]
发表于 2012-12-27 04:22 |只看该作者
:::memory是编译器复位寄存器分配。volatile只是针对其所修饰的变量。没搞过编译器,不过听上去倒像是:::memory的力度更强。

论坛徽章:
0
35 [报告]
发表于 2012-12-26 16:44 |只看该作者
另外还有一个细节,:::memory我所知道的是让寄存器里缓存的变量都失效,而完全不会影响到cpu cache。楼上有人提到这条语句对cpu cache的影响,不知从何而来??影响是什么?所有的cache line全部失效??麻烦能否提供以下出处。

据我所知,cpu cache要失效软件只有通过对协处理器的操作指令才可以做到。所以我看到bensenq提到cache一致性觉得完全是不沾边的。

论坛徽章:
0
34 [报告]
发表于 2012-12-26 16:12 |只看该作者
不知可否做这样一个归纳:

1. 理论上讲所有并发访问的全局变量都需要加volatile
2. 但是对频繁访问的全局变量用volatile会较大的影响性能
3. 所以可以对并发全局变量不加volatile,而在代码有并发访问的地方,用:::memory这样的汇编来起到一样的效果

这里的语句就是这样一个例子

论坛徽章:
0
33 [报告]
发表于 2012-12-26 15:40 |只看该作者
回复 26# liuiang


    我明白你明白了。

论坛徽章:
0
32 [报告]
发表于 2012-12-26 15:35 |只看该作者
回复 24# allen303allen


    我说的是volatile,不是这里的这句__volatile__,我提volatile是用来跟bensenq类比为何这里要加上:::memory的,因为这里的lock不是volatile的变量(它不能被加上volatile,大部分时间里会影响性能),所以它会被优化为从寄存器取值,所以这里需要这样一句汇编用:::memory来达到volatile的效果。这是编译器对非volatile变量的优化,而内核必须用-O2来编译,所以这里肯定会优化,编译器对变量的优化就是从寄存器取值而不从内存取值,至于这里的死循环是进一步逻辑优化的结果。而bensenq 否认了编译器会对变量优化为从寄存器取值,所以我才提到了volatile,但是恰好这里又有个__volatile__,所以我看大家理解上可能有误差了?

性能优化我确实不清楚,但我觉得应该跟体系架构有关,也是gcc针对不同体系架构做出的编译结果,因为并不是所有cpu在nop时都有这样的节能指令,所以这里不一定是写这个代码的人的意图?仅是猜测。

所以我仍然认为这句话最主要的作用是在用:::memory来防止因为编译器优化而产生的逻辑错误的。

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
31 [报告]
发表于 2012-12-20 12:04 |只看该作者
回复 24# allen303allen
讲的非常清楚,学习了。这里显然不是一个violate变量问题。


   

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

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


   

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


   
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP