1.并发是指多个执行单元同时、并行的执行。并发的执行单元对共享资源的访问很容易导致竞态。

在 Linux 内核中,主要的竞态发生于如下几种情况:

①对称多处理器(SMP)的多个 CPU

②单CPU内进程与抢占它的进程

③中断(硬中断、软中断、Tasklet、底半部)与进程之间

2.解决竞态的方法

中断屏蔽

中断屏蔽的使用方法为:

local_irq_disable() //屏蔽中断

critical section //临界区

local_irq_enable() //开中断

原子操作:原子操作指的是在执行过程中不会被别的代码路径所中断的操作。

void atomic_set(atomic_t *v, int i); //设置原子变量的值为 i

atomic_read(atomic_t *v);//读取原子变量的值

void atomic_add(int i,atomic_t *v);//原子变量加i

void atomic_sub(int i,atomic_t *v);//原子变量减i

void atomic_inc(atomic_t *v);//自加

void atomic_dec(atomic_t *v);//自减

操作并测试

int atomic_inc_and_test(atomic_t *v);

int atomic_dec_and_test(atomic_t *v);

int atomic_sub_and_test(int i, atomic_t *v);

上述操作对原子变量执行自增、自减和减操作后(注意没有加)测试其是否为 0,为 0 则返回 true,否则返回 false。

位原子操作

void set_bit(nr,void *addr);//设置位,nr为地址的第nr位

void clear_bit(nr,void *addr);//清除位

void change_bit(nr, void *addr);//改变位

test_bit(nr, void *addr);//测试位

自旋锁:一种对临界资源进行互斥手访问的典型手段.、

spinlock_t spin;//自定义自旋锁

spin_lock_init(lock);//初始化

spin_lock(lock)//获得自旋锁、

spin_unlock(lock)//释放自旋锁

驱动工程师应谨慎使用自旋锁,而且在使用中还要特别注意 自旋锁实际上是忙等锁,自旋锁可能导致系统死锁 这两个问题.

读写自旋锁

rwlock_t lock;//定义rwlock

rwlock_init(&lock);//初始化

read_lock(&lock);//读时获取锁

read_ulock(&lock);//

write_lock_irqsave(&lock, flags);//写时获取锁
write_unlock_irqrestore(&lock, flags);

顺序锁:顺序锁(seqlock)是对读写锁的一种优化,若使用顺序锁,读执行单元绝不会被写执行单元阻塞------略

信号量的使用:与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。

struct semaphore sem;//定义信号量

void sema_init(struct semaphore *sem,int var);//初始化信号量

void down(struct semaphore * sem);//获取信号量、进入睡眠状态的进程不能被信号打断

void up(struct semaphore * sem);//释放信号量

完成量用于同步

struct completion my_completion;//定义完成量

init_completion(&my_completion);//初始化完成量

void wait_for_completion(struct completion *c);//等待完成量

void complete_all(struct completion *c);//唤醒完成量

信号量vs自旋锁

信号量是进程间用于对资源的互斥,如果竞争失败,进程进入睡眠状态

自旋锁访问时间要短,节省上下文切换的时间。CPU得不到自旋锁不停止。

11互斥体

struct mutex my_mutex;//定义

mutex_init(&my_mutex);//初始化

mutex_lock(&my_mutex); //获取 mutex、

mutex_unlock(&my_mutex); //释放 mutex

Linux设备驱动中的并发控制的更多相关文章

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

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

  2. linux设备驱动中的并发控制【转】

    转自:http://www.cnblogs.com/plinx/archive/2013/01/28/2873121.html 在linux内核中,主要的静态发生于以下几种情况: 1.对称多处理器(S ...

  3. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  4. 蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O

    今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...

  5. Linux设备驱动中的阻塞和非阻塞I/O <转载>

    Green 博客园 首页 新随笔 联系 订阅 管理 Linux设备驱动中的阻塞和非阻塞I/O   [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件 ...

  6. Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

  7. Linux设备驱动中的软件架构思想

    目录 更新记录 一.Linux驱动的软件架构 1.1 出发点 1.2 分离思想 1.3 分层思想 二.platform设备驱动 2.1 platform设备 2.2 platform驱动 2.3 pl ...

  8. Linux设备驱动中的异步通知与异步I/O

    异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...

  9. Linux设备驱动中的ioctl

    memdev.h #ifndef _MEMDEV_H #define _MEMDEV_H #define MEM_MAGIC 'm' #define MEM_RESTART _IO(MEM_MAGIC ...

随机推荐

  1. C++复现经典游戏——扫雷

    国庆小长假,当大家都去看人山人海的时候,我独自一人狂码代码.这两天想要实现的内容是Windows上的一个经典游戏——扫雷.相信90后和一些上班族对此并不陌生.然而,从win8开始,扫雷就不再是Wind ...

  2. Ubuntu 12.04安装vim和配置

    问题: ubuntu默认没有安装vim,出现: jyg@ubuntu:~$ vim test.cThe program 'vim' can be found in the following pack ...

  3. JSP-12-使用过滤器和监听器

    1 什么是过滤器及其工作方式 向Web应用程序的请求和响应添加功能的Web组建 过滤器可以统一的集中处理请求和响应 15.2 过滤器的实现 新建 filter ,注意此时是在 src中建立的(同cla ...

  4. HtmlHelper的扩展

    HtmlHelper的扩展: 注意点:扩展方法必须是静态方法,所在的类必须是静态类,所在的命名空间改成System.Web.MVC则能省略页面中必须添加命名空间的约束. //主要就是输出分页的超级链接 ...

  5. [linux系统]--Sed

    删除:d命令 $ sed ‘2d’ example—–删除example文件的第二行. $ sed ‘2,$d’ example—–删除example文件的第二行到末尾所有行. $ sed ‘$d’ ...

  6. WampServer中MySQL中文乱码解决

    1.修改mysql的my.ini文件: 在 [client] 下面增加 default-character-set=utf8 在 [mysqld] 下面增加: character_set_server ...

  7. 用webdriver+phantomjs实现无浏览器的自动化过程

    环境准备 1. 安装python: 2. 安装pip: 3. 通过pip安装selenium: 4. 下载phantomJS的包并解压缩: 1. 若在Windows系统中,将下载的phantomjs文 ...

  8. 【noip新手入门向】OpenJudge1.3-14大象喝水

    一.写在前面 我也不知道我为什么要写这个鬼畜的东西←_←才不是为了水blog量什么的(划掉),其实是为了明天给学弟学妹们传教准备. 这道题对完全对c语言没有概念的小萌新们极度友好,可以锻炼小萌新们的代 ...

  9. Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(1)

    本篇内容为,通过 I2C 配置 GY-91 MPU9250+BMP280 里面的 MPU9250 连接 AK8963 磁感应.两个办法,1)MPU9250 设置 Master Mode 通过 AUX ...

  10. HMI开发与控件

    =>控件是什么概念? 百度曰,控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者. 对于HMI开发来说,使用控件可以快速获取到用户的交互(包括按下.释放.点击.拖动 ...