怎么自旋并且休眠Java,自旋锁不能睡眠(参考CSDN帖子)

问题:

在获得自旋锁后为什么不能够进行可能引起休眠的操作?

我看有的资料上是这样解释的:进程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的时间片根本不会被跟新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值