当前位置: 技术问答>linux和unix
在获得自旋锁后为什么不能够进行可能引起休眠的操作?
来源: 互联网 发布时间:2016-06-28
本文导语: 在获得自旋锁后为什么不能够进行可能引起休眠的操作? 我看有的资料上是这样解释的:进程A获得自旋锁后,进行可能引起休眠的操作后(例如copy_from_user等),进程将会被切换出去,这个时候另外一个进程B企图获...
在获得自旋锁后为什么不能够进行可能引起休眠的操作?
我看有的资料上是这样解释的:进程A获得自旋锁后,进行可能引起休眠的操作后(例如copy_from_user等),进程将会被切换出去,这个时候另外一个进程B企图获取本自旋锁,死锁就会发生。
但是我想,即使进程A被切换出去,进程B一直试图获取该自旋锁,但是当进程B的时间片被用完的话进程B将自动被切换出去,在一段时间后,进程A将被唤醒执行,然后释放自旋锁等等,进程B自然有机会获得该自旋锁,怎么会出现死锁的情况呀,一直想不通。
还请各位大牛给点解释,谢谢。
我看有的资料上是这样解释的:进程A获得自旋锁后,进行可能引起休眠的操作后(例如copy_from_user等),进程将会被切换出去,这个时候另外一个进程B企图获取本自旋锁,死锁就会发生。
但是我想,即使进程A被切换出去,进程B一直试图获取该自旋锁,但是当进程B的时间片被用完的话进程B将自动被切换出去,在一段时间后,进程A将被唤醒执行,然后释放自旋锁等等,进程B自然有机会获得该自旋锁,怎么会出现死锁的情况呀,一直想不通。
还请各位大牛给点解释,谢谢。
|
spin lock的自动禁止抢占的
也就是说,A如果那到锁以后,内核的抢占暂时被禁止。然后它休眠了,切换到另一个进程B(注意,这不是抢占,是进程自己放弃CPU)。等到进程B想要获得这个锁时发生了死锁,尽管B的时间片会被用完,但由于内核抢占被禁止了,所以B不会被调度出去。
更糟的情况是,如果A用irq save方式来得到这个spin lock,那中断是被禁止的,时钟中断不会被响应,B的时间片根本不会被跟新。
也就是说,A如果那到锁以后,内核的抢占暂时被禁止。然后它休眠了,切换到另一个进程B(注意,这不是抢占,是进程自己放弃CPU)。等到进程B想要获得这个锁时发生了死锁,尽管B的时间片会被用完,但由于内核抢占被禁止了,所以B不会被调度出去。
更糟的情况是,如果A用irq save方式来得到这个spin lock,那中断是被禁止的,时钟中断不会被响应,B的时间片根本不会被跟新。
|
顶