spin_lock_bh使用
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使用相关推荐
- spin_lock、spin_lock_bh、spin_lock_irq、spin_lock_irqsave的使用
概述 Spinlock的目的是用来同步SMP中会被多个CPU同时存取的变量.在Linux中,普通的spinlock由于不带额外的语义,用起来反而要非常小心. 在Linux kernel中执行的代码大体 ...
- spin_lock_bh()与spin_unlock_bh()
spin_lock_bh通常用在进程中,用来禁止抢断和禁止软中断. spin_lock_bh()中首先会调用local_bh_disable()禁止当前CPU的软件中断.而函数spin_unlock_ ...
- spin_lock spin_lock_irq spin_lock_irqsave、spin_lock_bh
1,为啥需要自旋锁 很多时候我们并不能采用其他的锁,比如读写锁.互斥锁.信号量等.一方面这些锁会发生上下文切换,他的时间是不可预期的,对于一些简单的.极短的临界区完全是一种性能损耗:另一方面在中断上下 ...
- 内核spinlock raw_spin_lock spin_lock_bh
使用自旋锁的场景 临界区在中断上下文中不能被调度出去的场景. 先说明下中断上下文不能被调度出来的原因. 中断上下文中唯一能打断当前中断的是更高优先级的中断.进程是不能打断中断的. 在linux的中断模 ...
- linux设备驱动第五篇:驱动中的并发与竟态
目录[-] 综述 信号量与互斥锁 Completions 机制 自旋锁 其他的一些选择 不加锁算法 原子变量与位操作 seqlock(顺序锁) 读取-拷贝-更新(RCU) 小结 综述 在上一篇介绍了l ...
- linux并发控制之自旋锁
自旋锁是一种对临界资源进行互斥访问的典型手段,其名来源于它的工作方式. 通俗的讲,自旋锁就是一个变量,该变量把一个临界区标记为"我当前在运行,请等待"或者标记为"我当前不 ...
- linux 同步方法剖析,Linux 同步方法剖析
级别: 中级 M. Tim Jones (), 顾问工程师, Emulex 2007 年 11 月 19 日在 学习 Linux® 的过程中,您也许接触过并发(concurrency).临界段(cri ...
- 华为内部面试题库---(9)
1.spinlock可通过配置选项CONFIG_DEBUG_SPINLOCK来打开内核编译选项,进行自旋锁调试,作用有(多选):(参考:Linux内核设计与实现,第二版,第9章,9.2节) A. 内核 ...
- Linux内核自旋锁使用笔记
Reference: spin_lock_bh()与spin_unlock_bh() Linux内核自旋锁 Linux自旋锁 Spinlock - Wikipedia, the free encycl ...
最新文章
- 这项X射线技术让芯片无秘密可言:纳米级还原内部构造,现已破解16nm芯片
- CNN结构:场景分割与Relation Network
- 手机(jzoj 1983)
- Quartz学习资料地址记录 、Quartz 学习的博客地址记录
- C#Const与static readonly的区别
- 别被数据分析师骗了!用数据说谎的三种办法
- 山西好点的计算机专科学校排名及分数线,2019-2020山西专科学校排名及分数线(理科+文科)...
- 2022首届(江西)功能性农业农业大健康大会暨中国农民丰收节交易会
- linux c 进程池 简单实现
- 在win中搭建IOS自动化
- 浅谈代理服务器的作用
- Java定义一个名为Square继承Shape抽象类,覆盖Shape类中的抽象方法getPerimeter()和getArea
- DialogFragment dismiss闪退异常DialogFragment何时持有FragmentManager
- macOS10.13.6及以下版本不能自动升级到更高版本的解决方案
- 利用PHP开发的一款万能、表白墙系统
- 常见PCIE X1/X4/X8/X16插槽作用与区别
- Python 调用WebService接口出错-suds.transport.TransportError: HTTP Error 401: Unauthori
- JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can‘t find profile directory
- 华为鲲鹏HCIA考试-练习09
- PIC16F887 单片机 电压检测
热门文章
- 报错:HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
- 【CSS】静态螺纹进度条和静态流程布局
- ‘class QFontMetrics‘ has no member named ‘horizontalAdvance‘
- PHP检测字数,PHP获取word文档字数的问题
- java获取当前时间前12个月内的年月信息
- iOS保存图片到相册
- 来自北京大学NOIP金牌选手yxc的常用代码模板2——数据结构
- 免费开源ETL工具KETTLE
- java和scala代码可以混合编写吗_Scala字符串插值的妙用,以及java+scala混合编程
- pip3 install XXX加快下载速度