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

sgu*_*pta 1 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;
}
Run Code Online (Sandbox Code Playgroud)

nin*_*alj 8

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

所以它或多或少像这样:

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