免费注册 查看新帖 |

Chinaunix

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

Linux2.6 kernel中的spinlock [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-02 18:42 |只看该作者 |倒序浏览
最近看了一点MP上的lock,发现一个问题,大家讨论一下吧。
一般在IA32的spinlock的实现中几乎都有“pause”这条指令,为的是减少MP之间为了维持cache的一致性而进行的大量通讯,这也是Intel手册上建议的。在FreeBSD与OpenSolaris上也确实是这样作了,但是,奇怪的是Linux2.6的内核中并没有这么作,而是用"rep;nop"来代替的,看代码

  1.          "\n1:\t" \
  2.          "lock ; decb %0\n\t" \
  3.          "jns 4f\n\t" \
  4.          "2:\t" \
  5.          "testl $0x200, %1\n\t" \
  6.          "jz 3f\n\t" \
  7.          "sti\n\t" \
  8.          "3:\t" \
  9. XXXX"rep;nop\n\t" \XXXXXXXXX
  10.          "cmpb $0, %0\n\t" \
  11.          "jle 3b\n\t" \
  12.          "cli\n\t" \
  13.          "jmp 1b\n" \
  14.          "4:\n\t"
复制代码

并且,rep;nop好像还是P4的指令,而pause是都可以用的。
google了一下,没发现解释,倒是很多说为什么rep;nop的,但是没解释为什么不是pause。
大家讨论一下吧。

论坛徽章:
0
2 [报告]
发表于 2006-01-02 19:30 |只看该作者
看了指令手册,似乎pause是为了防止内存乱序的。rep;nop是IA32都支持的,至于为何没有pause则不清楚

论坛徽章:
0
3 [报告]
发表于 2006-01-02 20:12 |只看该作者
原帖由 albcamus 于 2006-1-2 19:30 发表
看了指令手册,似乎pause是为了防止内存乱序的。rep;nop是IA32都支持的,至于为何没有pause则不清楚

pause好像是让CPU不必因为担心乱序而影响效率,我刚才的理解确实有问题。不过pause也是backward compatible,只不过非P4上按照nop处理。
那个memory order violation的解释没看懂,不过确实是推荐在
spin-wait loop中使用的。而且,solaris与FreeBSD也这样用。
似乎,应该到mailinglist上问问。

论坛徽章:
0
4 [报告]
发表于 2006-01-03 11:21 |只看该作者
如果我没记错的话. Linux2.6内核的自旋锁 是不加如等待队列的.
只是自己空循环.然后等待锁的释放.所以不pause

论坛徽章:
0
5 [报告]
发表于 2006-01-03 13:18 |只看该作者
原帖由 hades555 于 2006-1-3 11:21 发表
如果我没记错的话. Linux2.6内核的自旋锁 是不加如等待队列的.
只是自己空循环.然后等待锁的释放.所以不pause

我想你可能没看明白我的意思,pause只是一条指令,而不是等待队列之类的东西。
所谓自旋,自然是忙等,而不是睡眠等待。我说的是为什么不用intel推荐的pause而用rep;nop。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-01-17 12:39 |只看该作者
记得 ULK2 好像是这样说的 pause 指令 其实就是rep;nop
我回去再翻书看看.

论坛徽章:
0
7 [报告]
发表于 2006-01-18 17:28 |只看该作者

[转贴]

  * rep;nop
这是一条很有趣的指令,咋一看,这只是一条空指令,但实际上这条指令可以降低CPU的运行
    频率,减低电的消耗量,但最重要的是,提高了整体的效率。因为这段指令执行太快的话,会生成
    很多读取内存变量的指令,另外的一个CPU可能也要写这个内存变量,现在的CPU经常需要重新
    排序指令来提高效率,如果读指令太多的话,为了保证指令之间的依赖性,CPU会以牺牲流水线
    执行(pipeline)所带来的好处。从pentium 4以后,intel引进了一条pause指令,专门
    用于spin lock这种情况,据intel的文档说,加上pause可以提高25倍的效率!

来自:http://www.linuxforum.net/forum/ ... &sb=5&o=all
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP