Reference:
spin_lock_bh()与spin_unlock_bh()
Linux内核自旋锁
Linux自旋锁
Spinlock - Wikipedia, the free encyclopedia
原理
首先,spinlock是一把锁,它的功能与其他锁的作用类似,都是对用于临界区进行原子读写。使用这把锁时,原理上就是不停的循环检查锁的状态,直到可用的时候进入临界区。
与mutex的区别
Spinlock只进行虚幻检查,在内核中仍然允许抢占。
Mutex会立即引起调度,因而在一些中断处理函数中会出问题。
注意:
由于是循环检查而已,因此临界区的大小应该限制,否则非常影响效率。
选择自旋锁时,要注意考虑中断(软中断与硬中断;timer中断属于软中断)
函数和宏定义
头文件
# include 静态初始化
spinlock_t a_lock = SPIN_LOCK_UNLOCKED;宏定义和函数
动态初始化:
spin_lock_init(&a_lock);判断自旋锁是否上锁:
spin_is_locked(&a_lock);等待直到spinlock解锁
spin_unlock_wait(&a_lock);进入和退出临界区
spin_lock(&a_lock);spin_unlock(&a_lock);保存状态寄存器值地进入和退出临界区
int flags;spin_lock_irqsave(&a_lock, flags);spin_unlock_irqrestore(&a_lock, flags);屏蔽硬件中断地进入和退出临界区
spin_lock_irq(&a_lock);spin_unlock_irq(&a_lock);屏蔽底半部中断地进入和退出临界区
spin_lock_bh(&a_lock);spin_unlock_bh(&a_lock);关键字:linux, linux内核模块, lock, 互斥