当前位置: 首页 > news >正文

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

一、上下文和并发场合

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

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

  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. 共享资源仅是一个简单整型量时用原子变量

相关文章:

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

一、上下文和并发场合 执行流&#xff1a;有开始有结束总体顺序执行的一段代码 又称上下文 应用编程&#xff1a;任务上下文 内核编程&#xff1a; 任务上下文&#xff1a;五状态 可阻塞 a. 应用进程或线程运行在用户空间 b. 应用进程或线程运行在内核空间&#xff08;通过调…...

5-Tornado入门、程序的原理图、tornado不能使用同步代码的演示

安装 pip install tornado第一个程序 from tornado import web from tornado import ioloop class IndexHandler(web.RequestHandler):def get(self):self.write(Hello Tornado!!123)if __name__ __main__:# 1.创建了app对象&#xff0c;设置路由,并开启debug模式app web.A…...

mysql原理--InnoDB记录结构

1.InnoDB行格式 我们平时是以记录为单位来向表中插入数据的&#xff0c;这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 设计 InnoDB 存储引擎的大叔们到现在为止设计了4种不同类型的 行格式 &#xff0c;分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行…...

ES6基础语法

目录 一、解构 数组解构 对象解构 字符串解构 数值解构 布尔值解构 二、箭头函数 和普通函数区别? 三、拓展运算符 ... 一、解构 给右侧值匹配对应的变量 等号两侧模式一定要匹配 数组解构 /*** 解构&#xff1a;从数组或者对象中提取值&#xff0c;给变量进行赋值操作就…...

java8 常用code

文章目录 前言一、lambda1. 排序1.1 按照对象属性排序&#xff1a;1.2 字符串List排序&#xff1a;1.3 数据库排序jpa 2. 聚合2.1 基本聚合&#xff08;返回对象list&#xff09;2.2 多字段组合聚合&#xff08;直接返回对象list数量&#xff09; 二、基础语法2.1 List2.1.1 数…...

docker 镜像管理

搜索镜像&#xff1a;这种方法只能用于官方镜像库搜索基于 centos 操作系统的镜像# docker search centos ​按星级搜索镜像&#xff1a; 查找 star 数至少为 100 的镜像&#xff0c;默认不加 s 选项找出所有相关 ubuntu 镜像&#xff1a; # docker search ubun…...

Jira 中如何修改时间为绝对时间

问题描述 在使用Jira的时候&#xff0c;有一些时间显示的是相对时间&#xff0c;如&#xff1a;2天前&#xff0c;3个小时前等&#xff0c;有些用户不习惯这样的显示方式&#xff0c;希望使用绝对的时间格式&#xff0c;如&#xff1a;2022年2月22日 22:22 应该怎样修改 解…...

班级查分软件制作教程:老师必备技能!

首先&#xff0c;你需要选择一个合适的软件平台来制作班级查分软件。推荐使用群发成绩&#xff0c;因为它是一个功能强大且易于使用的在线查询系统&#xff0c;可以帮助你快速高效地制作班级查分软件​。 在制作班级查分软件之前&#xff0c;你需要准备好学生的成绩数据。这可以…...

Linux 的性能调优的思路

Linux操作系统是一个开源产品&#xff0c;也是一个开源软件的实践和应用平台&#xff0c;在这个平台下有无数的开源软件支撑&#xff0c;我们常见的apache、tomcat、mysql等。 开源软件的最大理念是自由、开放&#xff0c;那么Linux作为一个开源平台&#xff0c;最终要实现的是…...

如何通过webdriver禁用浏览器定位功能

今天碰到一个小问题&#xff0c;在使用了代理ip的情况下访问某些站点&#xff0c;但是还是显示本地的ip地址&#xff0c;这个是什么问题呢&#xff0c;原来是谷歌浏览器默认打开了定位功能 那么问题来了&#xff0c;如何在使用webdriver的时候关闭浏览器的定位功能呢&#xff1…...

网卡bonding绑定

目录 一、概念 1、概述&#xff1a; 二、实验 1、绑定案例&#xff1a; 一、概念 1、概述&#xff1a; 将多个物理网卡进行排列组合&#xff0c;形成逻辑网卡&#xff0c;网卡的高可用 绑定模式 mode0&#xff08;平衡负载模式&#xff09;&#xff1a;平时两块网卡均工…...

flink运行报Exception in thread “main“ java.lang.IllegalStateException

问题描述 运行flink程序时报异常&#xff0c;异常信息如下&#xff1a; Exception in thread "main" java.lang.IllegalStateException: No ExecutorFactory found to execute the application.at org.apache.flink.core.execution.DefaultExecutorServiceLoader.g…...

易点易动设备管理系统--提升设备备品备件管理效率的工具

设备备品备件管理是市场推广人员关注的重要问题之一。为了帮助市场推广人员提升设备备品备件管理效率&#xff0c;易点易动设备管理系统应运而生。本文将详细介绍易点易动设备管理系统的功能和优势&#xff0c;以及如何借助该系统提高设备备品备件管理效率&#xff0c;提升企业…...

第二十一章——网络通信

一.网络程序设计基础 1.局域网与互联网 2.网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。 1.1 TCP/IP层次结构 2.TCP与UDP协议 TCP可保证数据从一端送至另一端时&#xff0c;能够确实送达&#xff0c;而且抵达的数据的排列顺序和送出时的顺序相…...

Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206]

Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206] 1.python uf函数1.1 NXOpen.UF.Part.Open1.2 NXOpen.UF.Part.LoadStatus1.3 NXOpen.UF.Part.Close1.4 NXOpen.UF.Part.AskUnits 2.示例代码3.运行结果3.1 内部模式3.2 外部模式 1.python uf函数 1.1 NXOpen.UF.P…...

2015年五一杯数学建模C题生态文明建设评价问题解题全过程文档及程序

2015年五一杯数学建模 C题 生态文明建设评价问题 原题再现 随着我国经济的迅速发展&#xff0c;生态文明越来越重要&#xff0c;生态文明建设被提到了一个前所未有的高度。党的十八大报告明确提出要大力推进生态文明建设&#xff0c;报告指出“建设生态文明&#xff0c;是关系…...

java:slf4j、log4j、log4j2、logback日志框架的区别与示例

文章目录 背景SLF4J - 简单日志门面:Log4j - 强大而古老的日志框架:Log4j2 - Log4j的升级版:Logback - Log4j的继任者:比较Springboot集成slf4j、log4j2参考 背景 在Java开发中&#xff0c;日志记录是一个不可或缺的组成部分。为了满足不同的需求&#xff0c;Java社区涌现出多…...

Mysql学习查缺补漏----02 mysql之DCL 数据控制语言

查看数据库里都有哪些用户。 使用root任何一个用户都可以登录。 本机登录。 也可以这样登录其他的机器。 、 修改user表。 刷新权限&#xff1a; 现在我们看到了只有本机才能登陆。 我们这样就可以限制这个mysql指定某台服务器登录。 详解忘记密码以及如何修改用户密码 我们…...

【Flink基础】-- 延迟数据的处理

目录 ​一、关于延迟的一些概念 1、什么是延迟? 2、什么导致互联网延迟?...

通过keepalived+nginx实现 k8s apiserver节点高可用

一、环境准备 K8s 主机配置&#xff1a; 配置&#xff1a; 4Gib 内存/4vCPU/60G 硬盘 网络&#xff1a;机器相互可以通信 k8s 实验环境网络规划&#xff1a; podSubnet&#xff08;pod 网段&#xff09; 10.244.0.0/16 serviceSubnet&#xff08;service 网段&#xff09;: 1…...

深入解析MiniAGI:如何用GPT-4构建自主决策智能体系统

深入解析MiniAGI&#xff1a;如何用GPT-4构建自主决策智能体系统 【免费下载链接】mini-agi MiniAGI is a minimal general-purpose autonomous agent based on GPT-3.5 / GPT-4. Can analyze stock prices, perform network security tests, create art, and order pizza. 项…...

超越序列:让AI以“面向对象”的方式理解与规划物理世界

从下一个token预测到下一个对象预测,我们如何重新思考AI生成与机器人控制 引言:大模型的“顺序陷阱” 在人工智能领域,以GPT为代表的大语言模型通过预测下一个token(文本片段)的方式,展现了令人惊叹的文本理解和生成能力。然而,这种自回归生成范式本质上是一种顺序处理…...

new AbortController()

new AbortController() 是 JavaScript 中用于‌创建一个 AbortController 实例‌的构造函数&#xff0c;该实例可用于‌控制或取消异步操作‌&#xff08;如网络请求、事件监听、定时任务等&#xff09;。...

TongWeb8.0支持JBoss Weld‌

JBoss Weld‌ 是 CDI&#xff08;Contexts and Dependency Injection&#xff0c;JSR 299/346/365&#xff09;的官方参考实现&#xff08;RI&#xff09;&#xff0c;用于在 Java EE / Jakarta EE 应用中提供依赖注入和上下文管理功能。它不仅内置于 WildFly、GlassFish 等应用…...

2026年6款AI驱动的人力系统测评:谁更适合科技企业

科技企业的人力系统选型&#xff0c;最怕两件事&#xff1a;一是业务长得太快&#xff0c;招聘、组织、薪酬、考勤各自上系统却连不起来&#xff1b;二是管理想用AI提效&#xff0c;最后只落成了几个零散功能。红海云、Moka、肯耐珂萨 KNX、钉钉、飞书、Workday覆盖了从招聘专精…...

Xamarin.Macios实战教程:10个技巧提升你的开发效率

Xamarin.Macios实战教程&#xff1a;10个技巧提升你的开发效率 【免费下载链接】xamarin-macios .NET for iOS, Mac Catalyst, macOS, and tvOS provide open-source bindings of the Apple SDKs for use with .NET managed languages such as C# 项目地址: https://gitcode.…...

yolov8 mobilev3轻量级 注意力机制感兴趣的话点“我想要”和我私聊吧~

yolov8 mobilev3轻量级 注意力机制 感兴趣的话点“我想要”和我私聊吧&#xff5e;...

全文降AI和分段降AI效果差这么多?原因解释清楚

全文降AI和分段降AI效果差这么多&#xff1f;原因解释清楚 先说数据&#xff1a;同一篇论文&#xff08;初始48%&#xff09;&#xff0c;分段处理后AI率降到31%&#xff0c;全文处理后AI率降到9%。 差距22个百分点&#xff0c;不是小数目。 为什么会差这么多&#xff1f;这…...

HsMod:55+创新功能重新定义炉石传说体验

HsMod&#xff1a;55创新功能重新定义炉石传说体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod &#x1f31f; 项目核心价值概述 HsMod作为基于BepInEx框架的炉石传说模改插件&#xf…...

解锁B站直播自由:第三方推流工具深度技术解析

解锁B站直播自由&#xff1a;第三方推流工具深度技术解析 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码&#xff0c;以便可以绕开哔哩哔哩直播姬&#xff0c;直接在如OBS等软件中进行直播&#xff0c;软件同时提供定义直播分区和标题功能 项…...