spin lock自旋锁,和架构相关,使用汇编实现。架构相关的代码定义在<asm/spinlock.h>,但是使用的接口定义在<linux/spinlock.h>
在单处理器上,实际上不需要锁,只需要禁止内核抢占。
注意:
Spin Locks are not recursive
获取一个你已经获取的锁,你将spin,等待自己释放锁。
实际上,spin lock不关心是谁上的锁,如果锁已经被某人获取,任何人再次获取都将自旋。
自旋锁可以用在中断。但是semaphore不能,它们会睡眠。
spin lock methods
method | Desc |
spin_lock() | |
spin_lock_bh() | |
spin_lock_irq() | |
spin_lock_irqsave() | |
spin_unlock() | |
spin_unlock_bh() | |
spin_unlock_irq() | |
spin_unlock_irqrestore() | |
spin_lock_init() | |
spin_trylock() | |
spin_is_locked() |
读写自旋锁,读者可以共享锁,写者独占锁。
示例代码:
1 2 3 4 5 6 7 8 9 | DEFINE_RWLOCK(mr_rwlock); read_lock(&mr_rwlock); /* critical section (read only) ... */ read_unlock(&mr_rwlock); write_lock(&mr_rwlock); /* critical section (read and write) ... */ write_unlock(&mr_lock); |
Reader-Writer spin lock methods
Method | Desc |
read_lock() | |
read_lock_irq() | |
read_lock_irqsave() | |
read_unlock() | |
read_unlock_irq() | |
read_unlock_ irqrestore() | |
write_lock() | |
write_lock_irq() | |
write_lock_irqsave() | |
write_unlock() | |
write_unlock_irq() | |
write_unlock_irqrestore() | |
write_trylock() | |
rwlock_init() |
最后一个需要注意的是:内核更喜欢读者,当锁已经被某人获取时,一个读者和一个写者均请求锁,那么读者将优先获得锁。只有没有任何读者时,写者才能获得锁。