我已经阅读了很长一段时间,但对我来说没有意义。可能是因为我对这一切都是新手并且仍然不了解内核概念。
这就是我想出来的(没有错误或NULL处理,只是为了问题):
内核螺旋锁在内核线程内部执行,这是预先设置的。
void spinlock_acquire(spinlock_t *spinlock)
{
tryagain:
while(spinlock->plock != UNLOCKED) ;
context_switch_block;
if(spinlock->plock != UNLOCKED) {
context_switch_unblock;
goto tryagain;
}
spinlock_lock(spinlock, current_thread);
context_switch_unblock;
}
答案 0 :(得分:8)
在Linux是抢占式内核之前,UP上的自旋锁基本上是无操作的。一旦内核被抢占,就会向自旋锁添加对preempt_disable()
的调用。
所以它或多或少地像这样:
spin_lock_bh
,它会禁用softirqs,tasklet等...(bh
用于历史名称,它来自“bottom”半“)。spin_lock_irq*
冲突的硬件中断,从而禁用硬件中断。答案 1 :(得分:2)
非SMP上不需要旋转锁定。由于自旋锁被禁用中断,因此其他任何人都无法在此时锁定。一旦线程A禁用中断,线程B就不可能尝试获取相同的锁,因为没有任何东西可以导致A丢失CPU而支持B.因此,非SMP上的所有自旋锁都是好吧,什么都没有(除非你要求它禁用中断)。
Shachar