这些东西之前在学习陈莉君老师<linux操作系统原理>课的时候基本都了解过了,也用过,先在做个复习,所谓温故而知新
自旋锁 保证一段代码操作的原子性,自旋,自己等待.即在自旋锁被占用期间,任何进程将无法申请到得,这些进程回进入一个小的循环一直等待自旋锁的缩放.自旋锁是一种忙等锁,当锁被占用的时候,再次尝试获取自旋锁时,CPU会一直循环执行"测试自旋锁",直到自旋锁被释放,并成功获取自旋锁为止,此刻CPU一直处理等待状态........因此只有占有锁极短的情况下,使用自旋锁.当临界区很大(要执行的代码很多)或者共享设备时,需要长时间占用锁,使用自旋锁会降低系统 性能,
自旋锁的使用
spinlock_t lock;
spin_lock_init(&lock);
// spin_lock(&lock); //成功立即返回,失败阻塞
spin_trylock(&lock); //不管成功与否都立即返回
// 临界区
spin_unlock(&lock);
自旋锁主要针对SMP(symmetrical Multi-Processing 对象多处理)或单CUP但是内核支持可抢占的..否则自旋锁退化为空操作.
尽管使用自旋锁可以保证临界区不受别的CPU和本CPU内的抢占进程打扰,但是在执行临界区的代码时仍会受到中断/底半部的影响.为此衍生出:
spin_lock/spi_unlock与local_irq_disable(关中断)/local_irq_enable(开中断) ,与local_bh_disable(关底半部)/local_bh_enable(开底半部)的结合形成整套自选锁机制.
常见API(锁的申请和释放成对使用)
void spin_lock_init(spinlock_t *lock); //初始化锁
void spin_lock(spinlock_t *lock); //申请锁
void spin_trylock(spinlock_t *lock); //申请锁,失败不等待
void spin_unlock(spinlock_t *lock); //释放锁
void spin_lock_irq(spinlock_t *lock); //获取锁,禁止中断
void spin_trylock_irq(spinlock_t *lock);
void spin_unlock_irq(spinlock_t *lock); //释放所,允许中断
void spin_lock_bh(spinlock_t *lock); //获取锁,关闭底部分
void_spin_trylock_bh(spinlock_t *lock);
void spin_ulock_bh(spinlock_t *lock);
int spin_is_locked(spinlock_t *lock); //自旋锁是否被占用
读写自旋锁:共享读,排他写.将临界区的读写操作分开.
注意的是不能同时申请读锁,写锁,否则会造成死锁.
rwlock_t lock;
rwlock_init(&lock);
read_lock(&lock);
//临界区
read_unlock(&lock);
write_lock(&lock);
//临界区
write_unlock(&lock);
读写锁同样与中断/底半部结合使用
read_lock_irq(&lock);//申请读锁,关中端.
.......