自旋锁

注:本文根据LDD编写。


一个自旋锁是一个互斥设备,它只能有两个值:“锁定”和“解锁”。它通常实现为某个整数值中的单个位。希望获得某特定锁的代码测试相关的位。如果锁可用,则“锁定”位被设置,而代码继续进入临界区;相反,如果锁被其他人获得,则代码进入忙循环并重复检查这个锁,直到该锁可用为止。这个循环就是自旋锁的“自旋”部分。“测试并设置”的操作必须以原子的方式完成。

所有的自旋锁等待在本质上都是不可中断的。一旦调用了spin_lock,在获得锁之前将一直处于自旋状态。

适用于自旋锁的核心规则是:任何拥有自旋锁的代码都必须是原子的。它不能休眠,事实上,它不能因为任何原因放弃处理器,除了服务中断以外(某些情况下此时也不能放弃处理器)。

内核抢占的情况由自旋锁本身进行处理。任何时候,只要代码内核拥有自旋锁,在相关的处理器上的抢占都被禁止。

休眠可能发生在许多无法预期的地方,当我们编写需要在自旋锁下执行的代码时,必须注意每一个所调用的函数。

我们需要在拥有与中断处理例程相同的自旋锁时禁止中断(仅在本地CPU上)。

自旋锁使用上最后一个重要的规则是,自旋锁必须在可能的最短时间内拥有。


锁定一个自旋锁的函数有四个:

  • spin_lock                    禁止抢占,中断(仅在本地CPU上),软件中断(仅在本地CPU上)。
  • spin_lock_irqsave    禁止抢占,中断(仅在本地CPU上),软件中断(仅在本地CPU上),并保存之前的中断状态。
  • spin_lock_irq             禁止抢占,中断(仅在本地CPU上),软件中断(仅在本地CPU上)。
  • spin_lock_bh             禁止抢占,软件中断(仅在本地CPU上),但是会让硬件中断保持打开。
如果一个自旋锁确定不会在中断(硬件或软件)上下文中的代码获得,则使用spin_lock 。
如果一个自旋锁会在硬件中断上下文中的代码获得,则使用spin_lock_irqsave  或 spin_lock_irq。
如果一个自旋锁确定只会在软件中断上下文中的代码获得,则使用spin_lock_bh。

选定合适函数的主要目的是,防止死锁!所以,在需要时,才仅是在本地CPU上禁止中断。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值