免费注册 查看新帖 |

Chinaunix

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

为什么说在持有自旋锁时不能进入睡眠 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-25 15:08 |只看该作者 |倒序浏览
看LDD149页时,看到休眠的两条规则,其中之一是说,永远不要再原子上下文睡眠!


为什么说,驱动程序在持有自旋锁时绝对不能进入睡眠,而在拥有信号量时就可以?

论坛徽章:
0
2 [报告]
发表于 2008-06-25 16:07 |只看该作者
原子级操作:
举例吧,在一个函数中只有1个线程读或者写,当读线程进入函数时候获得锁,进行一些变量数据的读取直到完成放开锁由下一个别的线程再进来操作,如果这个读线程在持锁时睡了,那么它将一直抱着这个锁,别的线程也再无法持有这个锁.很大可能再也无法UN_LOCK.

实话:我是个新手加菜鸟,这锁的东西只能讲到这里,还得请高手来讲可能更清楚吧

自旋是否可以理解为 0或者1就两种状态.

再举个例子吧,一个函数里有一个指针,它所要接收的是一个MALLOC的地址,我两个A B线程同时都在分配,A先进来,那这个指针指向A,
而B这时候又进来了,指针又改指B,对一个指针连续两次赋值,很显然,第1次A分配的地址不存在,这就出现了一个泄露.

汗ING 我要讲错了,或者误导了,请大牛过来指正,拍啥都行,我回这帖就是想组织一下自己知道的,也许很混乱,但是不写出来哪怕有错的也不知道错在哪里了.

[ 本帖最后由 jn200002 于 2008-6-25 16:16 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-06-25 16:31 |只看该作者
感谢二楼的回帖

但是,在拥有信号量睡眠时,别的线程也是无法持有这个信号量呀,可为什么拥有信号量时睡眠就是可以的呢

论坛徽章:
0
4 [报告]
发表于 2008-06-26 09:26 |只看该作者
原帖由 TimothyShi 于 2008-6-25 15:08 发表
看LDD149页时,看到休眠的两条规则,其中之一是说,永远不要再原子上下文睡眠!


为什么说,驱动程序在持有自旋锁时绝对不能进入睡眠,而在拥有信号量时就可以?

驱动程序进入睡眠! ??[非中断程序中吧?]

[ 本帖最后由 AIXHP 于 2008-6-26 09:28 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-06-26 19:04 |只看该作者
自旋锁最多只能被一个可执行线程持有。自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

论坛徽章:
0
6 [报告]
发表于 2008-06-28 13:59 |只看该作者

回复 #1 TimothyShi 的帖子

自旋锁跟信号量用的地方不一样。
自旋锁是用来防止同一个被保护的东西在别的CPU上被同时修改,造成不一致。所以如果你一旦执有锁并且睡眠就会影响其他CPU的工作,从增大系统吞吐量的角度,这会降低性能,所以要不能睡眠

论坛徽章:
0
7 [报告]
发表于 2010-01-25 16:34 |只看该作者
自旋锁禁止处理器抢占,屏蔽中断

论坛徽章:
0
8 [报告]
发表于 2010-01-29 19:23 |只看该作者
自旋锁在设计的初衷就是减少上下文切换的开销,如果像信号量那样持有再睡眠的话,那不就是自己既要像信号量等维护机制,又使得处理器利用率不高(自旋),,自讨苦吃
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP