免费注册 查看新帖 |

Chinaunix

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

请问下,linux中的自旋锁是如何实现的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-08 23:27 |只看该作者 |倒序浏览
现在有点不太理解,就是就算用锁,如果多个进程同时来获取锁,会不会同时获取到锁?按理说应该不会这样,不然锁其实也没啥用了,呵呵。

现在就是不明白针对这样的问题,锁是通过何种方式避免这样的状况的?请达人们详细的讲下~ :)

论坛徽章:
1
巨蟹座
日期:2014-09-15 14:33:54
2 [报告]
发表于 2012-03-08 23:39 |只看该作者
自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。

论坛徽章:
1
巨蟹座
日期:2014-09-15 14:33:54
3 [报告]
发表于 2012-03-08 23:41 |只看该作者
本帖最后由 20060502156 于 2012-03-08 23:42 编辑

还有一种叫信号量,具体可以参照操作系统有关书里的PV元语

论坛徽章:
0
4 [报告]
发表于 2012-03-08 23:45 |只看该作者
楼上的大哥解释的很好,还有一点,我想知道自旋锁是如何保证最多只能被一个可执行线程持有的呢?如果2个线程同时来请求获取锁会怎么样?

论坛徽章:
0
5 [报告]
发表于 2012-03-08 23:50 |只看该作者
Linux Kernel 2.6.35.7 x86:
  1. static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
  2. {
  3.         short inc = 0x0100;

  4.         asm volatile (
  5.                 LOCK_PREFIX "xaddw %w0, %1\n"
  6.                 "1:\t"
  7.                 "cmpb %h0, %b0\n\t"
  8.                 "je 2f\n\t"
  9.                 "rep ; nop\n\t"
  10.                 "movb %1, %b0\n\t"
  11.                 /* don't need lfence here, because loads are in-order */
  12.                 "jmp 1b\n"
  13.                 "2:"
  14.                 : "+Q" (inc), "+m" (lock->slock)
  15.                 :
  16.                 : "memory", "cc");
  17. }
复制代码
  1. #define LOCK_PREFIX LOCK_PREFIX_HERE "\n\tlock; "
复制代码
带lock前缀的指令会锁住总线,其他CPU上的指令(进程)不能获取数据;

可以搜下ticket lock的运作机制;

论坛徽章:
0
6 [报告]
发表于 2012-03-08 23:57 |只看该作者
谢谢,这下明白了! 回复 5# wangjianchangdx


   

论坛徽章:
0
7 [报告]
发表于 2012-03-09 10:15 |只看该作者
上述代码中实际上只是另一个CPU上的动作,在本地CPU上(获取锁的进程所在的CPU)是不会出现自旋的,因为已经禁止内核抢占了。

论坛徽章:
1
巨蟹座
日期:2014-09-15 14:33:54
8 [报告]
发表于 2012-03-10 12:04 |只看该作者
男女不分回复 4# 屋顶的袋熊


   

论坛徽章:
0
9 [报告]
发表于 2012-03-10 12:09 |只看该作者
回复 8# 20060502156

哈哈,头像未必真实~
   

论坛徽章:
0
10 [报告]
发表于 2012-03-10 12:55 |只看该作者
不好意思,姐姐,搞错了~!
20060502156 发表于 2012-03-10 12:04
男女不分回复 4# 屋顶的袋熊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP