自旋锁的概念
自旋,自动旋转而不停歇。在Linux的理解中来看,其代表着一旦启动获取锁流程,则会一直占用CPU资源,而不挂起,直至获取锁成功。
自旋锁与其他锁类型(互斥锁、信号量等)的区别即在于此。其与select的轮询逻辑有些相似。
另外,因为自旋锁的禁止抢占逻辑,其经常被使用于工作量少、耗时短的场合。
自旋锁的分类
自旋锁通常用于中断上下文中,即经常使用的场合包括:软中断、硬件中断、tasklet、定时器等。
而根据使用场景的需求,则基本可以分为两大类:
1、关中断的锁
2、不关中断的锁
关中断的锁
1、spin_lock_irq/spin_unlock_irq
2、spin_lock_irqsave/spin_unlock_irqrestore
3、spin_lock_bh/spin_unlock_bh
上述1、2两种均属于关闭当前所在CPU中断并获取/释放自旋锁逻辑,而3则属于关闭下半部中断,如软中断。
不关中断的锁
仅有如下一种:
spin_lock/spin_unlock
自旋锁注意事项
<1> 在自旋锁保护的临界区禁止使用会释放CPU资源的接口,如获取信号量、互斥锁、延时等函数,否则会导致 死锁 情况的发生;
<2>自旋锁的目的是锁定CPU资源,因此对于 单核CPU 无效;
<3>关中断的自旋锁环境内,再次调用配对的另一组自旋锁,其释放锁时可能出 异常 ;
<4>同一自旋锁不可重复调用,会导致CPU 空转 ;
<5>非关中断自旋锁可被中断 打断 。