spin_lock_bh作用:

1.保护临界区

2.禁止抢占

3.禁止软中断

在软中执行函数_do_softirq()中已经使用__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET)来禁止软中断了,所以CPU上执行软中断是串行执行的。

软中断的执行:

1.irq_exit()退出时可能会执行softirq

2.softirq的内核线程

软中断和进程B共享链表A,软中断修改链表A,进程B读链表A。

情况1 未使用spin_lock保护链表A:

进程B读链表A的数据。硬件中断来的时候会中断进程B,当进程B正在读取链表A的时候,硬件中断来了,此时硬件中断退出时执行irq_exit,并调用了_do_softirq()执行软中断,修改了链表A,执行完成返回进程B,进程B再次读取链表A,可能访问到NULL的数据,出现崩溃。

情况2 使用spin_lock保护链表A:

spin_lock()无法禁止软中断执行。进程B先执行spin_lock(),进入临界区,读链表A,在临界区硬件中断到来,硬件中断执行完成,执行irq_exit(),然后执行_do_softirq()进入软中断执行,软中断处理函数也去执行spin_lock(),出现死锁。

情况3 使用spin_lock_bh保护链表A:

进程B先执行spin_lock_bh(),进入临界区,读链表A,在临界区硬件中断到来,硬件中断执行完成,执行irq_exit(), 然后执行in_interrupt()判断是否禁止了软中断,由于spin_lock_bh()禁止了软中断,所有不会去执行软中断函数,返回到进程B继续执行,正常。

总结:

1、spin_lock_bh()主要用于保护其他进程上下文访问软中断函数共享的变量。

2、在软中断中其实可以用spin_lock即可,可以不用spin_lock_bh

spin_lock_bh使用相关推荐

  1. spin_lock、spin_lock_bh、spin_lock_irq、spin_lock_irqsave的使用

    概述 Spinlock的目的是用来同步SMP中会被多个CPU同时存取的变量.在Linux中,普通的spinlock由于不带额外的语义,用起来反而要非常小心. 在Linux kernel中执行的代码大体 ...

  2. spin_lock_bh()与spin_unlock_bh()

    spin_lock_bh通常用在进程中,用来禁止抢断和禁止软中断. spin_lock_bh()中首先会调用local_bh_disable()禁止当前CPU的软件中断.而函数spin_unlock_ ...

  3. spin_lock spin_lock_irq spin_lock_irqsave、spin_lock_bh

    1,为啥需要自旋锁 很多时候我们并不能采用其他的锁,比如读写锁.互斥锁.信号量等.一方面这些锁会发生上下文切换,他的时间是不可预期的,对于一些简单的.极短的临界区完全是一种性能损耗:另一方面在中断上下 ...

  4. 内核spinlock raw_spin_lock spin_lock_bh

    使用自旋锁的场景 临界区在中断上下文中不能被调度出去的场景. 先说明下中断上下文不能被调度出来的原因. 中断上下文中唯一能打断当前中断的是更高优先级的中断.进程是不能打断中断的. 在linux的中断模 ...

  5. linux设备驱动第五篇:驱动中的并发与竟态

    目录[-] 综述 信号量与互斥锁 Completions 机制 自旋锁 其他的一些选择 不加锁算法 原子变量与位操作 seqlock(顺序锁) 读取-拷贝-更新(RCU) 小结 综述 在上一篇介绍了l ...

  6. linux并发控制之自旋锁

    自旋锁是一种对临界资源进行互斥访问的典型手段,其名来源于它的工作方式. 通俗的讲,自旋锁就是一个变量,该变量把一个临界区标记为"我当前在运行,请等待"或者标记为"我当前不 ...

  7. linux 同步方法剖析,Linux 同步方法剖析

    级别: 中级 M. Tim Jones (), 顾问工程师, Emulex 2007 年 11 月 19 日在 学习 Linux® 的过程中,您也许接触过并发(concurrency).临界段(cri ...

  8. 华为内部面试题库---(9)

    1.spinlock可通过配置选项CONFIG_DEBUG_SPINLOCK来打开内核编译选项,进行自旋锁调试,作用有(多选):(参考:Linux内核设计与实现,第二版,第9章,9.2节) A. 内核 ...

  9. Linux内核自旋锁使用笔记

    Reference: spin_lock_bh()与spin_unlock_bh() Linux内核自旋锁 Linux自旋锁 Spinlock - Wikipedia, the free encycl ...

最新文章

  1. 这项X射线技术让芯片无秘密可言:纳米级还原内部构造,现已破解16nm芯片
  2. CNN结构:场景分割与Relation Network
  3. 手机(jzoj 1983)
  4. Quartz学习资料地址记录 、Quartz 学习的博客地址记录
  5. C#Const与static readonly的区别
  6. 别被数据分析师骗了!用数据说谎的三种办法
  7. 山西好点的计算机专科学校排名及分数线,2019-2020山西专科学校排名及分数线(理科+文科)...
  8. 2022首届(江西)功能性农业农业大健康大会暨中国农民丰收节交易会
  9. linux c 进程池 简单实现
  10. 在win中搭建IOS自动化
  11. 浅谈代理服务器的作用
  12. Java定义一个名为Square继承Shape抽象类,覆盖Shape类中的抽象方法getPerimeter()和getArea
  13. DialogFragment dismiss闪退异常DialogFragment何时持有FragmentManager
  14. macOS10.13.6及以下版本不能自动升级到更高版本的解决方案
  15. 利用PHP开发的一款万能、表白墙系统
  16. 常见PCIE X1/X4/X8/X16插槽作用与区别
  17. Python 调用WebService接口出错-suds.transport.TransportError: HTTP Error 401: Unauthori
  18. JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can‘t find profile directory
  19. 华为鲲鹏HCIA考试-练习09
  20. PIC16F887 单片机 电压检测

热门文章

  1. 报错:HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
  2. 【CSS】静态螺纹进度条和静态流程布局
  3. ‘class QFontMetrics‘ has no member named ‘horizontalAdvance‘
  4. PHP检测字数,PHP获取word文档字数的问题
  5. java获取当前时间前12个月内的年月信息
  6. iOS保存图片到相册
  7. 来自北京大学NOIP金牌选手yxc的常用代码模板2——数据结构
  8. 免费开源ETL工具KETTLE
  9. java和scala代码可以混合编写吗_Scala字符串插值的妙用,以及java+scala混合编程
  10. pip3 install XXX加快下载速度