spin_lock 和 spin_lock_irqsave

一  、spin_lock_irqsave 、 spin_unlock_irqrestore

 

如果自旋锁在中断处理函数中被用到,那么在获取该锁之前需要关闭本地中断,spin_lock_irqsave 只是下列动作的一个便利接口:
1 保存本地中断状态
2 关闭本地中断
3 获取自旋锁

解锁时通过 spin_unlock_irqrestore完成释放锁、恢复本地中断到之前的状态等工作


二  、spin_lock_irq 和 spin_unlock_irq


如果你确定在获取锁之前本地中断是关闭的,那么就不需要保存中断状态,解锁的时候直接将本地中断启用就可以啦

 

 

三 、 总结

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠

自旋锁一直占用CPU,他在未获得锁的情况下,一直运行

在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。

posted @ 2016-07-11 10:42  chencesc  阅读(5590)  评论(0编辑  收藏  举报