spin_lock和raw_spin_lock()有什么区别?

时间:2015-11-02 17:32:21

标签: linux linux-kernel synchronization locking

linux内核中有每个自旋锁的原始变体,我想知道它的用法吗?例如:

raw_spin_lock()raw_spin_lock_irqsave()

2 个答案:

答案 0 :(得分:6)

spin_lock*函数与raw_spin_lock*函数的作用相同,加上启用锁定调试(CONFIG_DEBUG_LOCK_ALLOC)时,对锁定操作执行一些额外的运行时检查,例如检查死锁。这些检查由lockdep子系统执行。

通常,只要可能就应使用 spin_lock*函数。

只有在非常棘手的锁定策略的极少数情况下,当lockdep可以产生错误警告时,可以使用raw_spin_lock*函数。

此外,raw_*函数可以优于常用函数,以减少内存使用或性能原因。但它应该是实际的时间/空间测量,反映了使用这些优化的重大胜利

答案 1 :(得分:4)

主要区别是spin_lock变体映射到非RT的raw_spin_lock变体,而如果设置CONFIG_PREEMPT_RT,则它们映射到可以睡眠的rt_spin_lock

通过将spin_lock从睡眠与非睡眠变化分离,取决于我们是否为RT,spin_lock API可以在整个内核代码中保持一致。