字符设备驱动基础—并发控制

一、上下文和并发场合

执行流:有开始有结束总体顺序执行的一段代码 又称上下文

应用编程:任务上下文
内核编程:

  1. 任务上下文:五状态 可阻塞
    a. 应用进程或线程运行在用户空间
    b. 应用进程或线程运行在内核空间(通过调用syscall来间接使用内核空间)
    c. 内核线程始终在内核空间
  2. 异常上下文:不可阻塞
    中断上下文

竞态:多任务并行执行时,如果在一个时刻同时操作同一个资源,会引起资源的错乱,这种错乱情形被称为竞态

共享资源:可能会被多个任务同时使用的资源

临界区:操作共享资源的代码段

为了解决竞态,需要提供一种控制机制,来避免在同一时刻使用共享资源,这种机制被称为并发控制机制

并发控制机制分类:

  1. 原子操作类
  2. 忙等待类
  3. 阻塞类

通用并发控制机制的一般使用套路:

/*互斥问题:*/
并发控制机制初始化为可用
P操作临界区V操作/*同步问题:*/
//并发控制机制初始化为不可用
//先行方:
。。。。。
V操作//后行方:
P操作
。。。。。

二、中断屏蔽(了解)

一种同步机制的辅助手段

禁止本cpu中断 使能本cpu中断
local_irq_disable(); local_irq_enable();
local_irq_save(flags); local_irq_restore(flags); 与cpu的中断位相关
local_bh_disable(); local_bh_enable(); 与中断低半部有关,关闭、打开软中断

禁止中断
临界区 //临界区代码不能占用太长时间,需要很快完成
打开中断

适用场合:中断上下文与某任务共享资源时,或多个不同优先级的中断上下文间共享资源时

三、原子变量(掌握)

原子变量:存取不可被打断的特殊整型变量
a.设置原子量的值
void atomic_set(atomic_t *v,int i); //设置原子量的值为i
atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0

v = 10;//错误

b.获取原子量的值
atomic_read(atomic_t *v); //返回原子量的值

c.原子变量加减
void atomic_add(int i,atomic_t *v);//原子变量增加i
void atomic_sub(int i,atomic_t *v);//原子变量减少i

d.原子变量自增自减
void atomic_inc(atomic_t *v);//原子变量增加1
void atomic_dec(atomic_t *v);//原子变量减少1

e.操作并测试:运算后结果为0则返回真,否则返回假
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);

原子位操作方法:
a.设置位
void set_bit(nr, void *addr); //设置addr的第nr位为1
b.清除位
void clear_bit(nr , void *addr); //清除addr的第nr位为0
c.改变位
void change_bit(nr , void *addr); //改变addr的第nr位为1
d.测试位
void test_bit(nr , void *addr); //测试addr的第nr位是否为1

适用场合:共享资源为单个整型变量的互斥场合

四、自旋锁:基于忙等待的并发控制机制

a.定义自旋锁
spinlock_t lock;

b.初始化自旋锁
spin_lock_init(spinlock_t *);

c.获得自旋锁
spin_lock(spinlock_t *); //成功获得自旋锁立即返回,否则自旋在那里直到该自旋锁的保持者释放

spin_trylock(spinlock_t *); //成功获得自旋锁立即返回真,否则返回假,而不是像上一个那样"在原地打转”

d.释放自旋锁
spin_unlock(spinlock_t *);

#include <linux/spinlock.h>
定义spinlock_t类型的变量lock
spin_lock_init(&lock)后才能正常使用spinlockspin_lock(&lock);
临界区
spin_unlock(&lock);

适用场合:

  1. 异常上下文之间或异常上下文与任务上下文之间共享资源时
  2. 任务上下文之间且临界区执行时间很短时
  3. 互斥问题

五、信号量:基于阻塞的并发控制机制

a.定义信号量
struct semaphore sem;

b.初始化信号量
void sema_init(struct semaphore *sem, int val);

c.获得信号量P
int down(struct semaphore *sem);//深度睡眠

int down_interruptible(struct semaphore *sem);//浅度睡眠

d.释放信号量V
void up(struct semaphore *sem);

#include <linux/semaphore.h>

适用场合:任务上下文之间且临界区执行时间较长时的互斥或同步问题

六、互斥锁:基于阻塞的互斥机制

a.初始化
struct mutex my_mutex;
mutex_init(&my_mutex);

b.获取互斥体
void mutex_lock(struct mutex *lock);

c.释放互斥体
void mutex_unlock(struct mutex *lock);

  1. 定义对应类型的变量
  2. 初始化对应变量

P/加锁
临界区
V/解锁

#include <linux/mutex.h>

适用场合:任务上下文之间且临界区执行时间较长时的互斥问题

七、选择并发控制机制的原则

  1. 不允许睡眠的上下文需要采用忙等待类,可以睡眠的上下文可以采用阻塞类。在异常上下文中访问的竞争资源一定采用忙等待类。
  2. 临界区操作较长的应用建议采用阻塞类,临界区很短的操作建议采用忙等待类。
  3. 中断屏蔽仅在有与中断上下文共享资源时使用。
  4. 共享资源仅是一个简单整型量时用原子变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基于轻量级卷积神经网络模型ShuffleNetv2开发构建辣椒病虫害图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

HTML5基础知识详讲

什么是网页和网站&#xff1f; ​ 在文章开始之前&#xff0c;我们先了解一下什么是网页和网站 ​ 网页是构成网站的基本元素&#xff0c;它是一个包含HTML标签的纯文本文件&#xff0c;通常是由图片&#xff1b;链接&#xff1b;视频&#xff1b;声音&#xff1b;文字等元素…

你的手机注册了多少互联网账号?赶快通过这个功能查询一下吧!

一键查询手机号绑定&#xff01;你的手机注册了多少互联网账号&#xff1f;赶快查询一下吧&#xff01; 你知道你名下的手机号绑定了多少互联网账号吗&#xff1f; 怎么查询手机号绑定了什么账号呢&#xff1f; ...... 不用担心 一键查询手机号绑定的帐号功能来了&#xff01; …

制造业企业如何建立智能工厂

今天就聊聊企业智能工厂的打造&#xff0c;企业想实现数字化转型建立智能工厂&#xff0c;就需要先建设数字化车间&#xff0c;可以说数字化车间是建设智能工厂的重要一环&#xff0c;智能工厂的基础是数字化车间。数字化车间可以实现企业生产过程中车间计划调度、工艺执行管理…

食品厂ERP有哪几种?食品厂ERP软件哪个操作简单

食品安全问题是近些年备受消费者和企业关注的行业&#xff0c;而食品安全管理涉及原材料、配方、车间、工艺、设备、包装、仓储、保质期等多个方面&#xff0c;因而各个业务部门之间的协同问题就显得颇为重要。 想要提升采购、保质期、库龄分析、财务、订单、原材料、仓储等各…

Pycharm修改文件默认打开方式 + CSV Editor插件使用

1、File —> Settings —> Editor —> File Types 然后将*csv添加到最上面 在plugins中下载插件&#xff0c;CSV Editor 备注&#xff1a;不在上一步的“File Types”中将*.csv设置为CSV格式&#xff0c;插件是不起作用的 就可以使用了

十二、FreeRTOS之FreeRTOS任务相关API函数

本节需要掌握以下内容&#xff1a; 1&#xff0c;FreeRTOS任务相关API函数介绍&#xff08;熟悉&#xff09; 2&#xff0c;任务状态查询API函数实验&#xff08;掌握&#xff09; 3&#xff0c;任务时间统计API函数实验&#xff08;掌握&#xff09; 4&#xff0c;总结 一…

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念

【Docker】从零开始&#xff1a;15.搭建亿级数据Redis集群之哈希算法概念篇 概述一般业界的3种解决方案1.哈希取余分区优点&#xff1a;缺点&#xff1a; 2.一致性哈希算法分区背景目的原理一致性哈希环节点映射key落到服务器的落键规则 优点容错性扩展性 缺点 3.哈希槽分区背景…

第3节:Vue3 v-bind指令

实例&#xff1a; <template><div><button v-bind:disabled"isButtonDisabled">点击我</button></div> </template><script> import { ref } from vue;export default {setup() {const isButtonDisabled ref(false);ret…

MySQL基本概念和基础语法

指定条件下更新数据 update student a, score b SET b.stuscore 100 WHERE a.stuidb.stuid and a.stuname‘赵雷’ and b.courseid0002 #单表删除 delete from score where stuscore 64 and courseid0001 and stuid0001 多表删除 delete a, b from student as a LEFT J…

家用超声波清洗机哪个牌子好?一起来看、值得推荐超声波清洗机

家用超声波清洗机可以干嘛呢&#xff1f;最常见的就是来清洗眼镜。眼镜党朋友应该经常接触超声波清洗机&#xff0c;它常出现在眼镜店中&#xff0c;眼镜店老板帮顾客清洗眼镜&#xff1b;也会出现在工业领域、医疗领域等&#xff0c;超声波清洗机使用范围还是挺广的&#xff0…

微信小程序 分享的两种方式:菜单级和按钮级

按钮级 在使用微信小程序的时候&#xff0c;我们可能会设计到一些视频的一些分享等&#xff0c;那么视频分享也分为两种方式,例如下图&#xff0c;当我们点击的时候&#xff0c;进行一个转发分享的一个操作 那么在原先代码的基础上&#xff0c;我们需要在原先代码的基础上butt…

Java并行计算实例:使用并发框架解决实际问题

引言&#xff1a; 在当今信息时代&#xff0c;数据的处理速度和效率成为了各行各业的关注焦点。为了提高计算机程序的执行速度&#xff0c;我们需要利用计算机的多核处理能力&#xff0c;实现并行计算。Java作为一门广泛应用于企业级应用开发的编程语言&#xff0c;提供了丰富的…

微信小程序中 不同页面如何传递参数

在开发项目中&#xff0c;避免不了不同页面之间传递数据等&#xff0c;那么就需要进行不同页面之间的一个数据传递 直接传递一个对象时&#xff1a; 页面A gotoDetail(e){const music e.currentTarget.dataset.music;// 在小程序中&#xff0c;不同页面之间如何进行参数传递…

树模型与深度模型对比

表格型数据为什么那么神奇&#xff0c;能让树模型在各种真实场景的表格数据中都战胜深度学习呢&#xff1f;作者认为有以下三种可能&#xff1a; 神经网络倾向于得到过于平滑的解冗余无信息的特征更容易影响神经网络 所以一定程度的特征交叉是不是必要的&#xff0c;因为one-ho…

Unity中动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提&#xff0c;但是如果是材质实例的话&#xff0c;则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader&#xff0c;来测试动态合批1、我们选择模型的 Mesh…

电商API接口开发和接入说明{包含淘宝/京东/拼多多/抖音}

“为什么改了这个没告诉我” “实际功能和文档上说的不一样啊”。 这些话大家在进行电商API接口开发时&#xff0c;想必耳朵都听出老茧了。 真不是故意的&#xff0c;有时候任务比较急&#xff0c;就先改了代码&#xff0c;想着以后再同步文档&#xff0c;然后就给忘了。 项…

k8s项目部署流程

K8s项目部署流程如下&#xff1a; 安装Kubernetes集群&#xff1a;首先需要安装Kubernetes集群&#xff0c;以便部署应用程序。您可以使用Minikube&#xff08;用于本地开发和测试&#xff09;或使用云提供商如AWS、GCP等提供的Kubernetes服务。 创建命名空间&#xff1a;命名…

在Pycharm中使用GitHub的方法步骤

文章目录 前言一、配置Pycharm二、建立远程仓库并提交代码三、在github中查看上传的新仓库四、使用pycharm克隆github仓库五、在pycharm内进行git的相关操作关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源…

【C++】三大特性 --- 继承的详细讲解

目录 1.继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚…