悟空学Linux专栏----第51篇

  (Linux内核同步机制之自旋锁)

  到目前为止,我们讲解了什么事自旋锁,自旋锁的数据结构定义以及内核提供的自旋锁操作APIs。这一篇我们呢讲解一下使用自旋锁的需要注意的问题,来结束对自旋锁同步手段讨论。

  首先,第一点需要明确的是,自旋锁是在SMP系统中为防止并发访问提供所需同步机制;在单处理器系统中,编译内核镜像的时候不会加入自旋锁代码,也即是在此时自旋锁代码无效;

  第二点,自旋锁是不可递归的;如果试图持有一个自身正持有的自旋锁,那么自己就必须自旋,等待自己释放这个 自旋锁,而自己当前正在自旋,所以自己永远也无法释放锁,于是,自己就被自己锁死了,所以,千万注意自旋锁死锁呀!

  第三点,可以在中断处理程序中使用自旋锁,在获取锁之前,首先需要禁止本地中断,否则,新的中断处理程序就会打断持有锁的内核代码, 可能会去争用这个已经被持有的自旋锁,如果这样的话,新的中断处理程序就会自旋,等待该自旋锁重新可用,但是锁的持有者在这个新的中断处理程序执行完毕之前不可能运行,这就导致了双重死锁!在这里,需要关闭的只是当前处理器的中断,如果新的中断不是发生在当前处理器上,即使中断处理程序在同一自旋锁上自旋,也不会妨碍锁的持有者在不同的处理器上最终释放锁。

  现在我们来终结下自旋锁。

  通常自旋锁的使用形式是这样的:

  spin_lock(&lock)

  /* 临界区 */

  spin_unlock(&lock)

  只有在获取锁和释放锁的两个过程是原子的,而在加锁和解锁过程中间的临界区是非原子的,是可以被中断的!这就意味着,临界区被中断之后,新执行的代码就有可能会去争夺这个已经被持有的锁, 而自旋;如果被中断的代码在新执行的代码执行完毕之前,没有机会再执行,那么就会造成死锁。

  所以,请小心使用自旋锁。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值