Linux设备驱动中的并发控制
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设备驱动中的并发控制的更多相关文章
- 蜕变成蝶~Linux设备驱动中的并发控制
并发和竞争发生在两类体系中: 对称多处理器(SMP)的多个CPU 内核可抢占的单CPU系统 访问共享资源的代码区域称为临界区(critical sections),临界区需要以某种互斥机制加以保护.在 ...
- linux设备驱动中的并发控制【转】
转自:http://www.cnblogs.com/plinx/archive/2013/01/28/2873121.html 在linux内核中,主要的静态发生于以下几种情况: 1.对称多处理器(S ...
- Linux设备驱动中的阻塞和非阻塞I/O
[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...
- 蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O
今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...
- Linux设备驱动中的阻塞和非阻塞I/O <转载>
Green 博客园 首页 新随笔 联系 订阅 管理 Linux设备驱动中的阻塞和非阻塞I/O [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件 ...
- Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】
在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...
- Linux设备驱动中的软件架构思想
目录 更新记录 一.Linux驱动的软件架构 1.1 出发点 1.2 分离思想 1.3 分层思想 二.platform设备驱动 2.1 platform设备 2.2 platform驱动 2.3 pl ...
- Linux设备驱动中的异步通知与异步I/O
异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...
- Linux设备驱动中的ioctl
memdev.h #ifndef _MEMDEV_H #define _MEMDEV_H #define MEM_MAGIC 'm' #define MEM_RESTART _IO(MEM_MAGIC ...
随机推荐
- Oracle配置本地网络服务名
Oracle安装完成后,可以使用客户端自带的的网络配置向导(Net Configuration Assistant)进行配置 1.启动Net Configuration Assistant.选择&qu ...
- SQL中插入单引号,新增修改删除
1.插入单引号如果不转化的话,字符串插入到数据库中错误的,只要在字符串中有单引号的地方在加一个单引号即可. 例如:在数据库插入'井下设备' : insert into Static_Bel ...
- spring框架IoC
IoC反转控制, 举个反例: //数据操作类 public class DataBase { //向数据库中存储数据 public void saveDB() { } } //业务逻辑类 public ...
- 一、Docker之旅
刚刚接触到docker的同事可能会一头雾水,docker到底是一个什么东西,先看看官方的定义. Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔 ...
- MYSQL #1064错误
你的给出的代码里option为MYSQL关键字,不能直接写,需要用`包括起来(它为数字键1左边的键上的字符),为: `option` varchar(50) NOT NULL default ''
- 【Spring】利用Spring最简单地使用异步方法
有时候我们想异步地调用某个方法. 比如这个场景:在业务处理完毕后,需给用户发送通知邮件.由于邮件发送需调用邮箱服务商,有可能发生阻塞,我们就可以异步调用.当然有个前提,即如果邮件发送失败,不需要提示用 ...
- R语言基础:数组&列表&向量&矩阵&因子&数据框
R语言基础:数组和列表 数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, d ...
- 第九天 内容提供者 ContentResolver
重点:理解ContentProvider 的作用和创建流程 1. 内容提供者,提供 其他数据库的访问. 特点 - 描述 : 它是android 四大组件之一,需要androidManife ...
- 读《编写可维护的JavaScript》第一章总结
第一章 基本的格式化 1.4 ① 换行 当一行长度到达了单行最大的字符限制时,就需要手动将一行拆成俩行.通常我们会在运算符后换行,下一行会增加俩个层级的缩进. // 好的做法: 在运算符后换行,第二行 ...
- 为ssh增加选项
在使用ssh的时候,可以看到ssh有很多功能,什么-o , -e等等.如下图 需求,想要给ssh增加一个参数的功能.比如说我现在的需求就是执行ssh的时候可以增加一个选项,给我每次ssh的操作搭一个标 ...