关于spinlock的使用

不知大家注意没有,在2.6.27的内核中,semaphone中的down函数的实现已经不是内联汇编(lock decl ....)的实现了,同样,up函数已经不是用(lock incl ...)来实现了。而是用到了
spin_lock_irqsave和spin_lock_irqrestore.实现过程见kernel/semaphone.c文件。

如果现在还在问信号量与自旋锁有什么区别,那这个问题还真是不好答了....

原则上信号是用于单CPU,指令少的情况,自旋锁运用于多CPU,但能快速执行的情况,但现在弄的信号量用自旋锁来实现了...

当有自旋锁存在时,其它进程无法使用,所以自旋锁不能进入睡眼状态。

 

关于spin_lock的irq和irqsave的区别,放在下面,这也能很好解释为什么spin_lock能够运用于多CPU了。

spin_lock_irq() <-- Irqs disabled
spin_lock_irqsave() <-- Irqs disabled, save disabled state.
spin_unlock_irqrestore() <-- Retain state. Irqs still disabled.
spin_unlock_irq() <-- Irqs enabled.

 

在有些情竘下,当spin_lock之后,运行语句,一般情况下,然后spin_unlock的,是会重新开启中断,但是运行的这个进程不允许开启中断,于是spin_unlock就无法顺利执行,这种情况下,会用到spin_lock_irqsave,需要保存之前的所有状态。

你可能感兴趣的:(汇编,UP)