螺旋锁和cli一起使用

时间:2010-07-15 01:05:45

标签: linux-kernel interrupt rtos spinlock

我最近从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),它们如何影响?

1 个答案:

答案 0 :(得分:7)

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

  • 历史上,在单处理器(UP)系统上,唯一的并发源是硬件中断。在临界区周围cli/sti就足以防止IRQ处理程序弄乱了。
  • 然后是巨型锁设计,其中内核将在单个CPU上有效运行,并且一次只有一个进程可以在内核中(这就是巨锁的用途)。同样,禁用中断足以保护内核不受其影响。
  • 在完整的SMP系统上,多个线程可以在内核中同时处于活动状态,并且中断可以传递到几乎任何CPU,仅仅禁用单个处理器上的中断,或者只获取一个锁定就不够了。两者都是必需的:禁用中断可以保护同一CPU上的IRQ处理程序 ,保持锁可以防止其他线程进入不同CPU上的相同关键部分 。这正是spin_lock_irqsave()spin_unlock_irqrestore()被发明的原因。