关抢占 自旋锁_spinlock与中断、抢占的关系
在kernel中,一个线程获得了spinlock,那么这个线程可以被interrupt吗?
可以,spin_lock 并没有关中断,只关闭了抢占,spin_lock_irqsave,spin_lock_irq,spin_lock_bh等才关中断了,这些是在spin_lock可能会被中断上下文拥有时使用的模式。
tips1:为什么要关闭抢占?
staticinlineunsignedlong__raw_spin_lock_irqsave(raw_spinlock_t*lock)
{
unsignedlongflags;
local_irq_save(flags);
preempt_disable();
spin_acquire(&lock->dep_map,0,0,_RET_IP_);
。。。
关闭抢占是在所有spin_lock中都会做的,下面阐述禁止抢占的原因:
如果不禁止内核抢断(或者不禁止中断),可能会有以下的情况发生(假设进程B比进程A具有更高的优先级):
进程A获得spinlock lock
进程B运行(抢占进程A)
进程B获取spinlock lock
由于进程B比进程A优先级高,所以进程B在进程A之前运行,而进程B需要进程A释放lock之后才能运行,于是,死锁
tip2:在关闭本地中断后是否有必要关闭抢占?
前阵子有网友发短消息问:“...在研究自旋锁的时候,发现在 spin_lock_irq函数,也就是在自旋锁中关闭中的这类
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
