2

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

“这确实意味着如果你有一些代码

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) ,它们会如何影响?

4

1 回答 1

7

这里的关键部分是“在两个不同的 CPU 上”。一些背景:

  • 从历史上看,在单处理器 (UP) 系统上,并发的唯一来源是硬件中断。绕过临界区就足以cli/sti防止 IRQ 处理程序搞砸了。
  • 然后是巨型锁设计,内核将有效地在单个 CPU 上运行,并且一次只能在内核中运行一个进程(巨型锁的用途)。同样,禁用中断足以保护内核免受自身的影响。
  • 在完整的 SMP 系统上,内核中的多个线程可以同时处于活动状态,并且可以将中断传递到几乎任何 CPU,仅在单个处理器上禁用中断或仅获取单个锁已不够。两者都是必需的:禁用中断可防止同一 CPU 上的IRQ 处理程序,持有锁可防止其他线程进入不同 CPU 上的相同临界区。这正是发明spin_lock_irqsave()spin_unlock_irqrestore()发明的原因。
于 2010-07-17T03:04:29.937 回答