ILD

Kernel Synchronization 2: spin lock
作者:YUAN JIANPENG 邮箱:yuanjp@hust.edu.cn
发布时间:2018-8-20 站点:Inside Linux Development

spin lock自旋锁,和架构相关,使用汇编实现。架构相关的代码定义在<asm/spinlock.h>,但是使用的接口定义在<linux/spinlock.h>


在单处理器上,实际上不需要锁,只需要禁止内核抢占。


注意:

Spin Locks are not recursive

获取一个你已经获取的锁,你将spin,等待自己释放锁。

实际上,spin lock不关心是谁上的锁,如果锁已经被某人获取,任何人再次获取都将自旋。


自旋锁可以用在中断。但是semaphore不能,它们会睡眠。


spin lock methods

methodDesc
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()


Reader-Writer Spin Locks

读写自旋锁,读者可以共享锁,写者独占锁。


示例代码:

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()


最后一个需要注意的是:内核更喜欢读者,当锁已经被某人获取时,一个读者和一个写者均请求锁,那么读者将优先获得锁。只有没有任何读者时,写者才能获得锁。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.