并发控制的概念

----并发指的是多个执行单元并行执行,而并发的执行单元对共享资源(硬件资源和

----软件上的全局变量、静态变量等)的访问则很容易导致竞态。

竞态发生的情况

----对称多处理器(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设备驱动中的并发控制相关推荐

  1. linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)

    本章导读 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态). Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 7.1讲解了并 ...

  2. Linux设备驱动中的并发控制总结

    并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions).   SMP是一 ...

  3. Linux设备驱动开发详解:第7章 Linux设备驱动中的并发控制

    7.1并发与竞态 (1).竞态的发生场景:CPU0的进程与CPU1的进程之间.CPU0的中断与CPU1的进程之间.CPU0的中断与CPU1的中断之间: (2).解决竞态问题的途径是保证对共享资源的互斥 ...

  4. 蜕变成蝶~Linux设备驱动中的并发控制

    并发和竞争发生在两类体系中: 对称多处理器(SMP)的多个CPU 内核可抢占的单CPU系统 访问共享资源的代码区域称为临界区(critical sections),临界区需要以某种互斥机制加以保护.在 ...

  5. Linux 设备驱动中的并发控制 小感

    为什么要控制并发, 多核心cpu 可以实现真正的并发,如果是单核心的cpu,或者双核心的cpu都是无法真正的实现,并发, 换句话说,就是串行执行的,那么控制并发的意义就在于,1.协调cpu的任务执行, ...

  6. linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O

    今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...

  7. linux write引起进程挂起,Linux设备驱动中的阻塞与非阻塞总结

    Linux设备驱动中的阻塞与非阻塞总结 阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作. 非阻塞操作的进程在不能进行设备操作时,并不挂起.被挂起的进程进入sl ...

  8. Linux设备驱动中的阻塞和非阻塞IO

    这篇文章我们来了解下Linux设备驱动中阻塞和非阻塞. 阻塞:阻塞是指执行设备操作时,如果不能获得设备资源,则挂起进程,是进程进入休眠模式,直到设备资源可以获取. 非阻塞:非阻塞是在不能获取设备资源时 ...

  9. Linux设备驱动中的阻塞与非阻塞I/O

    阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式 本例子讲述了这两者的区别 并实现I/O的等待队列机制, 并进行了用户空间的验证 基本概念: 1> ...

最新文章

  1. JavaScript 编程精解 中文第三版 零、前言
  2. netty-阻塞模式,非阻塞模式
  3. vue中computed、metfods、watch的区别
  4. 使用Apache CXF开发RESTful服务
  5. 写在校招季,谈谈机器学习岗的Offer选择问题
  6. vs2019Linux守护,Visual Studio 2019将支援Ninja显着提升Linux专案建置效率
  7. 没有bug队——加贝——Python 练习实例 15,16
  8. 干货 | 局部特征图像配准用于缺陷检测
  9. ecshop二次开发 给商品添加自定义字段【包含我自己进一步的开发实例详解】
  10. 银行数据部门如何管理跟使用数据?来围观星球中老师的答案
  11. 成年男女间存在真正的友谊吗?
  12. 为防 Android 碎片化?Google 强迫开发者使用自有开发工具!
  13. 动态绑定dropdownlist --开始拣.NET
  14. iOS底层探索之Runtime(五): 消息转发
  15. 今天看C++Primer发现的问题
  16. andriod 自定义来电界面功能
  17. java 8 api 下载_JDK8 API文档(下载)
  18. 韦东山freeRTOS系列教程之【第三章】任务管理
  19. Photoshop CS5无法卸载或卸载不干净怎么办?
  20. Python数据预处理--Gensim构建语料词典

热门文章

  1. 巧用 PHP 数组函数 1
  2. datetime的文本时间处理
  3. Cocos2d-x场景功能描述的生命周期
  4. 解读Tom介绍的Oracle Database 12c的12个新特性
  5. 陈丽琳:如何以大数据助力商场运营
  6. 定义软件定义的存储市场
  7. Ansible简介及常用模块
  8. 《Adobe Photoshop大师班:经典作品与完美技巧赏析》即将上市
  9. 论MS-Ajax导致的大对象堆碎片化问题
  10. 2018.09.17-2018.09.23