linux - 为什么自旋锁在 Linux 内核(非 SMP)中是空操作?

标签 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;
}

最佳答案

在 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/

相关文章:

linux - 安装testdisk时遇到问题

linux - 进程和线程调度开销

linux - 在 NETLINK 消息中添加 MPLS 属性

c - 在 glibc 源代码中哪里可以找到 select() 源代码?

c++ - 微软的OpenMP自旋锁时间如何控制?

linux - Linux 中处理的 AVRCP 关键事件

linux - 通过减少 Linux 中的交换内存大小来增加 ext4 分区大小

linux - Shell命令是用什么语言写的?

lock-free - 自旋锁总是需要内存屏障吗?在内存屏障上旋转是否昂贵?

assembly - 使用 XCHG 解锁的自旋锁