为什么Linux内核(非SMP)中的spinlock no-op?

时间:2012-07-22 18:38:23

标签: linux kernel spinlock

我已经阅读了很长一段时间,但对我来说没有意义。可能是因为我对这一切都是新手并且仍然不了解内核概念。

这就是我想出来的(没有错误或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;
}

2 个答案:

答案 0 :(得分:8)

在Linux是抢占式内核之前,UP上的自旋锁基本上是无操作的。一旦内核被抢占,就会向自旋锁添加对preempt_disable()的调用。

所以它或多或少地像这样:

  • 你想要防止一些冲突的CPU,使用某种螺旋锁。
  • 您希望防止冲突的softirq,tasklet,...使用spin_lock_bh,它会禁用softirqs,tasklet等...(bh用于历史名称,它来自“bottom”半“)。
  • 您希望防止使用spin_lock_irq*冲突的硬件中断,从而禁用硬件中断。
  • 所有自旋锁都可以防止抢占。
  • 在UP内核上,自旋锁不会采用真正的自旋锁(因为没有冲突的CPU,我们不能被抢占,并且有自旋锁变种来处理hardirqs,softirqs,......)。
  • 在具有SMP内核的UP计算机上,自旋锁可能会变成nops。
  • 即使在禁用了抢占的UP内核上,如果启用了自旋锁,也可以使用自旋锁调试代码。

答案 1 :(得分:2)

非SMP上不需要旋转锁定。由于自旋锁被禁用中断,因此其他任何人都无法在此时锁定。一旦线程A禁用中断,线程B就不可能尝试获取相同的锁,因为没有任何东西可以导致A丢失CPU而支持B.因此,非SMP上的所有自旋锁都是好吧,什么都没有(除非你要求它禁用中断)。

Shachar