我已经阅读这篇文章很长时间了,但对我来说没有任何意义。可能是因为我对这一切都不熟悉,仍然不了解一些内核概念。
这就是我想出的(没有错误或 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;
}
最佳答案
在 Linux 成为抢占式内核之前,UP 上的自旋锁基本上是空操作。一旦内核成为抢占式的,就会向自旋锁添加对 preempt_disable()
的调用。
所以它或多或少是这样的:
- 你想防止某些 CPU 冲突,使用某种自旋锁。
- 您想防止发生冲突的软中断、微线程...使用
spin_lock_bh
,它会禁用软中断、微线程等...(bh
用于历史名称,它来自“下半部分”)。 - 您想防止硬件中断冲突,请使用
spin_lock_irq*
,它会禁用硬件中断。 - 所有自旋锁都可以防止抢占。
- 在 UP 内核上,自旋锁不采用真正的自旋锁(因为没有冲突的 CPU,我们不能被抢占,并且有用于处理硬中断、软中断等的自旋锁变体)。
- 在带有 SMP 内核的 UP 机器上,自旋锁可能会变成 nop。
- 即使在禁用了抢占的 UP 内核上,自旋锁也可能具有用于自旋锁调试的代码(如果启用的话)。
关于linux - 为什么自旋锁在 Linux 内核(非 SMP)中是空操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11602962/