linux设备驱动中的并发控制
并发控制的概念
----并发指的是多个执行单元并行执行,而并发的执行单元对共享资源(硬件资源和
----软件上的全局变量、静态变量等)的访问则很容易导致竞态。
竞态发生的情况
----对称多处理器(SMP)的多个CPU
----单CPU内进程与抢占它的进程
----中断(硬中断、软中断、Tasklet、底半部)与进程之间
解决竞态问题的途径
----保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,
----其他的执行单元被禁止访问。
----访问共享资源的代码称为临界区,临界区需要被以某种互斥机制加以保护。
互斥机制
----中断屏蔽
----原子操作
----自旋锁
----信号量
中断屏蔽
----local_irq_disable() //屏蔽中断
----/*临界区*/
----local_irq_enable() //开中断
----这种方式并不能解决SMP多CPU引发的竞态
原子操作
----实现方法:
----头文件asm/atomic.h
----atomic_t v=ATOMIC_INIT(1); //定义原子变量v并初始化为1
----if(! atomic_dec_and_test(v)) //自减1测试
----{ atomic_inc(&v); return –EBUSY; } //设备忙返回错误码
---- …… //临界区代码
----atomic_inc(&c); //释放设备
自旋锁
----spinlock_t lock; //定义自旋锁
----spin_lock_init(&lock); //初始化自旋锁
----spin_lock(&lock); //获得自旋锁
----…… //临界区代码
----spin_unlock(&lock); //释放自旋锁
----一个例子:
static int cdev_open(struct inode*inode, struct file *file)
{
spin_lock(&lock);
if(flag== 1){
flag--;
spin_unlock(&lock);
printk(KERN_INFO"cdev_open !\n"); //临界区代码
return0;
}else{
spin_unlock(&lock);
return-EBUSY;
}
return0;
}
static int cdev_release(struct inode*inode, struct file *file)
{
flag++;
return 0;
}
----说明:自旋锁是一种忙等待锁,中间不能有可引起睡眠的操作;临界区不能太长;自旋
----锁可用在中断上下文中
信号量
----需要头文件linux/semaphore.h
----struct semaphore sem; //定义信号量
----sema_init(&sem,1); //初始化信号量
----down_interruptible(&sem); //获取信号量
----…… //临界区代码
----up(&sem); //释放信号量
----说明:信号量不同于自旋锁,他是一种睡眠锁,不能用在中断上下文中。
----一种简单的使用方法:
----if(down_trylock(&sem)) //尝试打开锁
----return –EBUSY; //设备忙
----…… //临界区代码
----up(&sem); //释放打开的锁
linux设备驱动中的并发控制相关推荐
- linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)
本章导读 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态). Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 7.1讲解了并 ...
- Linux设备驱动中的并发控制总结
并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions). SMP是一 ...
- Linux设备驱动开发详解:第7章 Linux设备驱动中的并发控制
7.1并发与竞态 (1).竞态的发生场景:CPU0的进程与CPU1的进程之间.CPU0的中断与CPU1的进程之间.CPU0的中断与CPU1的中断之间: (2).解决竞态问题的途径是保证对共享资源的互斥 ...
- 蜕变成蝶~Linux设备驱动中的并发控制
并发和竞争发生在两类体系中: 对称多处理器(SMP)的多个CPU 内核可抢占的单CPU系统 访问共享资源的代码区域称为临界区(critical sections),临界区需要以某种互斥机制加以保护.在 ...
- Linux 设备驱动中的并发控制 小感
为什么要控制并发, 多核心cpu 可以实现真正的并发,如果是单核心的cpu,或者双核心的cpu都是无法真正的实现,并发, 换句话说,就是串行执行的,那么控制并发的意义就在于,1.协调cpu的任务执行, ...
- linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O
今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...
- linux write引起进程挂起,Linux设备驱动中的阻塞与非阻塞总结
Linux设备驱动中的阻塞与非阻塞总结 阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作. 非阻塞操作的进程在不能进行设备操作时,并不挂起.被挂起的进程进入sl ...
- Linux设备驱动中的阻塞和非阻塞IO
这篇文章我们来了解下Linux设备驱动中阻塞和非阻塞. 阻塞:阻塞是指执行设备操作时,如果不能获得设备资源,则挂起进程,是进程进入休眠模式,直到设备资源可以获取. 非阻塞:非阻塞是在不能获取设备资源时 ...
- Linux设备驱动中的阻塞与非阻塞I/O
阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式 本例子讲述了这两者的区别 并实现I/O的等待队列机制, 并进行了用户空间的验证 基本概念: 1> ...
最新文章
- JavaScript 编程精解 中文第三版 零、前言
- netty-阻塞模式,非阻塞模式
- vue中computed、metfods、watch的区别
- 使用Apache CXF开发RESTful服务
- 写在校招季,谈谈机器学习岗的Offer选择问题
- vs2019Linux守护,Visual Studio 2019将支援Ninja显着提升Linux专案建置效率
- 没有bug队——加贝——Python 练习实例 15,16
- 干货 | 局部特征图像配准用于缺陷检测
- ecshop二次开发 给商品添加自定义字段【包含我自己进一步的开发实例详解】
- 银行数据部门如何管理跟使用数据?来围观星球中老师的答案
- 成年男女间存在真正的友谊吗?
- 为防 Android 碎片化?Google 强迫开发者使用自有开发工具!
- 动态绑定dropdownlist --开始拣.NET
- iOS底层探索之Runtime(五): 消息转发
- 今天看C++Primer发现的问题
- andriod 自定义来电界面功能
- java 8 api 下载_JDK8 API文档(下载)
- 韦东山freeRTOS系列教程之【第三章】任务管理
- Photoshop CS5无法卸载或卸载不干净怎么办?
- Python数据预处理--Gensim构建语料词典