为什么说在持有自旋锁时不能进入睡眠或阻塞
2011-04-27 04:13
267 查看
看LDD149页时,看到休眠的两条规则,其中之一是说,永远不要再原子上下文睡眠!
为什么说,驱动程序在持有自旋锁时绝对不能进入睡眠,而在拥有信号量时就可以?
看到网上有人这么提问,这也是我读书时候自己迷惑不解的地方。但是,通过仔细研读,我理解到了这个问题的答案。我在网上也看了大家对于这个问题的回答,大都没说到点上。根据我自己的理解,应该是:
自旋锁自旋锁禁止处理器抢占;而信号量不禁止处理器抢占。
基于这个原因,如果自旋锁在锁住以后进入睡眠,由于不能进行处理器抢占,其他系统进程将都不能获得CPU而运行,因此不能唤醒睡眠的自旋锁,因此系统将不响应任何操作(除了中断或多核的情况,下面会讨论)。而信号量在临界区睡眠后,其他进程可以用抢占的方式继续运行,从而可以实现内存拷贝等功能而使得睡眠的信号量程序由于获得了等待的资源而被唤醒,从而恢复了正常的代码运行。
当然,自旋锁的睡眠的情况包含考虑多核CPU和中断的因素。自旋锁睡眠时,只是当前CPU的睡眠以及当前CPU的禁止处理器抢占,所以,如果存在多个CPU,那么其他活动的CPU可以继续运行使操作系统功能正常,并有可能完成相应工作而唤醒睡眠了的自旋锁,从而没有造成系统死机;自旋锁睡眠时,如果允许中断处理,那么中断的代码是可以正常运行的,但是中断通常不会唤醒睡眠的自旋锁,因此系统仍然运行不正常。
以上是我对这个问题的理解。如果有说错的地方,非常希望高手给予指正!谢谢。
其实这个问题可以自己写个小程序测试一下,我现在也正在读书,还没有测试,其实测试很简单,写一个自旋锁,然后睡眠,看看在单CPU下系统是不是死机了,就可以清楚。估计死机时还应该可以响应键盘操作,因为键盘是中断处理,测试时把中断屏蔽了,也是一个不错的办法。
为什么说,驱动程序在持有自旋锁时绝对不能进入睡眠,而在拥有信号量时就可以?
看到网上有人这么提问,这也是我读书时候自己迷惑不解的地方。但是,通过仔细研读,我理解到了这个问题的答案。我在网上也看了大家对于这个问题的回答,大都没说到点上。根据我自己的理解,应该是:
自旋锁自旋锁禁止处理器抢占;而信号量不禁止处理器抢占。
基于这个原因,如果自旋锁在锁住以后进入睡眠,由于不能进行处理器抢占,其他系统进程将都不能获得CPU而运行,因此不能唤醒睡眠的自旋锁,因此系统将不响应任何操作(除了中断或多核的情况,下面会讨论)。而信号量在临界区睡眠后,其他进程可以用抢占的方式继续运行,从而可以实现内存拷贝等功能而使得睡眠的信号量程序由于获得了等待的资源而被唤醒,从而恢复了正常的代码运行。
当然,自旋锁的睡眠的情况包含考虑多核CPU和中断的因素。自旋锁睡眠时,只是当前CPU的睡眠以及当前CPU的禁止处理器抢占,所以,如果存在多个CPU,那么其他活动的CPU可以继续运行使操作系统功能正常,并有可能完成相应工作而唤醒睡眠了的自旋锁,从而没有造成系统死机;自旋锁睡眠时,如果允许中断处理,那么中断的代码是可以正常运行的,但是中断通常不会唤醒睡眠的自旋锁,因此系统仍然运行不正常。
以上是我对这个问题的理解。如果有说错的地方,非常希望高手给予指正!谢谢。
其实这个问题可以自己写个小程序测试一下,我现在也正在读书,还没有测试,其实测试很简单,写一个自旋锁,然后睡眠,看看在单CPU下系统是不是死机了,就可以清楚。估计死机时还应该可以响应键盘操作,因为键盘是中断处理,测试时把中断屏蔽了,也是一个不错的办法。
相关文章推荐
- 为什么说在持有自旋锁时不能进入睡眠或阻塞
- 为什么说在持有自旋锁时不能进入睡眠或阻塞
- spinlock与linux内核调度的关系,那么为什么信号量保护的代码可以睡眠而自旋锁就不能呢?
- 为什么可能导致睡眠的函数都不能在中断上下文中使用呢?【转】
- 为什么可能导致睡眠的函数都不能在中断上下文中使用呢
- 关于中断上下文为什么不能睡眠?
- 关于hbase中进入shell但是无法使用的问题,以及web界面为什么不能访问。
- 驱动: 中断【3】为什么可能导致睡眠的函数都不能在中断上下文中使用呢?
- 为什么可能导致睡眠的函数都不能在中断上下文中使用呢?
- 非阻塞TCP套接字的要点 发表于 2015-04-22 | 分类于 网络编程 | 套接字的默认状态是阻塞的。如果一个套接字不能立即完成相应的调用,那么该线程就会被投入睡眠,等待相应的操
- 关于中断上下文为什么不能睡眠?
- java泛型类为什么不能声持有类型的静态变量
- 为什么使用spinlock的时候不能睡眠
- android不能进入睡眠的原因
- 关于中断上下文为什么不能睡眠?
- 为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句
- vsts编译silverlight工程为什么xap文件不能进入web project 的ClientBin文件夹
- vs2008+opencv2.1:为什么不能跟踪进入函数源代码?
- 为什么在中断过程中不能进行睡眠
- 为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句