代码之家  ›  专栏  ›  技术社区  ›  Karthik Balaguru

同时使用spinlock和cli

  •  2
  • Karthik Balaguru  · 技术社区  · 14 年前

    我最近从下载了Linux源代码 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2 . 我在linux-2.6.34.1\documentation文件夹中的spinlocks.txt文件中遇到了以下段落。

    “IT 意思是如果你有一些代码

    cli();
    .. critical section ..
    sti();
    

    还有另一个序列

    spin_lock_irqsave(flags);
    .. critical section ..
    spin_unlock_irqrestore(flags);
    

    那么它们不是互相排斥的,关键区域可能发生 同时在两个不同的CPU上。这本身没问题,但是 关键区域最好对不同的事物(如 不能互相踩踏。”

    如果某些代码使用cli()/sti(),而同一代码的其他部分使用spin-lock-irqsave(flags)/spin-unlock-irqrestore(flags),它们将如何影响?

    1 回复  |  直到 14 年前
        1
  •  7
  •   Nikolai Fetissov    14 年前

    关键是 “在两个不同的CPU上 “。一些背景:

    • 在单处理器(UP)系统上,历史上唯一的并发源是硬件中断。足够了 cli/sti 避免IRQ处理程序把事情搞砸。
    • 然后是 巨锁 设计一个内核可以在单个CPU上有效运行,一次只能在内核中运行一个进程(这就是巨型锁的作用)。同样,禁用中断足够保护内核不受干扰。
    • 在完整的SMP系统中,多个线程可以同时在内核中处于活动状态,中断可以传递给几乎所有的CPU,这已经不足以只在单个处理器上禁用中断,或者只获取一个锁。这两者都是必需的:禁用中断保护IRQ处理程序 在同一个CPU上 ,持有锁可以防止其他线程进入同一关键部分。 在不同的CPU上 . 这就是为什么 spin_lock_irqsave() spin_unlock_irqrestore() 是发明出来的。