11.24 自旋锁

        这些东西之前在学习陈莉君老师<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);//申请读锁,关中端.

  .......


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值