1

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

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

2 回答 2

8

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

所以它或多或少是这样的:

  • 你想防止一些冲突的 CPU,使用某种自旋锁。
  • 您想防止出现冲突的 softirq、tasklet、... use spin_lock_bh,它会禁用 softirq、tasklet 等...(bh用于历史名称,它来自“下半部分”)。
  • 您想防止出现冲突的硬件中断使用spin_lock_irq*,这会禁用硬件中断。
  • 所有自旋锁都可以防止抢占。
  • 在 UP 内核上,自旋锁不采用真正的自旋锁(因为没有冲突的 CPU,我们不能被抢占,并且有用于处理 hardirqs、softirqs 的自旋锁变体......)。
  • 在带有 SMP 内核的 UP 机器上,自旋锁可能会变成 nops。
  • 即使在禁用抢占的 UP 内核上,如果启用,自旋锁也可能具有用于自旋锁调试的代码。
于 2012-07-22T20:07:10.367 回答
2

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

沙查尔

于 2012-07-22T19:59:39.077 回答