LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2321|回复: 6

为什么说在持有自旋锁时不能进入睡眠

[复制链接]
发表于 2008-6-25 18:18:14 | 显示全部楼层 |阅读模式
看LDD149页时,看到休眠的两条规则,其中之一是说,永远不要再原子上下文睡眠!


为什么说,驱动程序在持有自旋锁时绝对不能进入睡眠,而在拥有信号量时就可以?
发表于 2008-6-28 11:32:14 | 显示全部楼层
自旋锁的实现是通过自旋来获取锁的,如果要获得的锁没有被释放,就是一直循环(自旋)去等待锁的释放。
自旋锁只在多处理器系统上有效,如果自旋锁在某个CPU锁住后(锁住后会关闭中断)了,没有及时释放,那么其他CPU在获取这个锁的时候就什么也不能做了,如果经常出现这种情况,性能下降就很严重了。

所以在自旋锁内的临界区域: 执行时间必须尽可能的短,以减少对性能的影响。
如果在持有自旋锁的时候睡觉,让本地CPU其他进程调度,其他进程只要尝试获取这个自旋锁,就会出现死锁。

初学,望指正。
回复 支持 反对

使用道具 举报

发表于 2008-7-6 14:51:21 | 显示全部楼层
信号量不一定是加锁的线程来解锁吧,可以其他线程解锁。但是自旋锁,互斥锁,都要谁来锁,谁来开
回复 支持 反对

使用道具 举报

发表于 2008-7-13 23:26:11 | 显示全部楼层
锁自己锁  自己开
回复 支持 反对

使用道具 举报

发表于 2008-8-4 16:52:47 | 显示全部楼层
嘿嘿,,学习!!!
回复 支持 反对

使用道具 举报

发表于 2008-8-12 16:13:54 | 显示全部楼层
spin_lock——自旋锁,顾名思义,必须由自己来解锁,因此持有的锁的时候不能睡眠,所以自旋锁的两端代码之间不能睡眠,适合低开销的应用
回复 支持 反对

使用道具 举报

发表于 2008-8-12 16:17:48 | 显示全部楼层
2楼的is02bing  
请注意,自旋锁并不是只在多处理器中才有作用。
例如对于中断的处理,但处理器如果禁止了中断嵌套,可以不使用自旋锁,否则自旋锁还是有作用的。

此外 Linux内核很多驱动程序注册的时候,需要使用自旋锁将这个短暂的临界段隔离
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表