spin_lock_irqsave

自旋锁特点:
(1)        自旋锁机制本身不会休眠,所以可以用于不能休眠的代码中(如IRQ 例程)。
(2)        自旋锁有性能优势(加锁/解锁 约7us)

并发是需要同步操作的根源,在SMP上并发的来源如下:
       A 进程间的抢占
       B 异步中断事件
       C 两个以上的CPU,执行同一段代码

如果有一段critical code需要在上面的A、B、C三种情况下都有可能执行到,可使用spin_lock_irq(&lock),因为
(1)        自旋锁本身是禁止本CPU上的抢占,所以A不可能发生
(2)        Spin_lock_irq(&lock)是关本CPU上的中断的,所以B不可能发生
(3)        对于C情况,CPU0没有释放自旋锁时,CPU1一直忙等待,但不会死锁

总结,需思考所要保护的资源的并发执行场景。然后决定是否使用自旋锁,以及使用哪种自旋锁。自旋锁使用不当会有如下问题:
(1)        死锁

(2)        受保护的critical code太多,可能阻止本CPU的任务调度(更高优先级的任务不得不等待),或者其它CPU忙等(不做任何事情)。




==========


spin_lock_irqsave()做了如下工作:
1)关闭本CPU内核抢占;
2)保存本地eflags到外部变量,以便于后续恢复eflags;
3)关闭本地中断;
4)加自旋锁保护;
此时无论从本地CPU上还是其他CPU上都无法进入临界区(本地关闭硬件中断,同时关闭本地CPU内核抢占,其他CPU的进程则在当前CPU上自旋);

spin_unlock_irqrestore()做了如下工作:
1)释放自旋锁;
2)从外部变量恢复本地eflags;
3)开启本地CPU内核抢占;
此时本地CPU上若在spin_lock_irqsave()之前中断是开启的则此时中断恢复开启状态,否则中断仍为关闭状态。本地CPU允许内核抢占。其他CPU可以退出自旋状态进入临界区;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值