驱动的并发和竞争

news2024/9/22 1:39:08

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、什么是并发?
    • 并发
    • 并行
    • 并发+并行模式
  • 二、什么是竞争
  • 三、如何解决竞争
    • 1、原子操作
      • 整形原子操作:
      • 原子位操作
    • 2.自旋锁
    • 3.信号量
    • 4.互斥锁
    • 5.如何选择哪种方式
  • 总结


前言

在Linux驱动开发中我们经常要考虑的一个问题就是并发和竞争,因为现在的SOC基本都是多核CPU,那么必然会存在争夺资源的问题,所以本小节就来介绍一下驱动中的并发和竞争。


一、什么是并发?

并发

所谓并发,就是通过算法将 CPU 资源合理地分配给多个任务,当一个任务执行 I/O 操作时,CPU 可以转而执行其它的任务,等到 I/O 操作完成以后,或者新的任务遇到 I/O 操作时,CPU 再回到原来的任务继续执行。
举个例子:
假设现在是有两个任务,那么当任务1执行的时候,CPU就会切换到任务2,这样任务2执行一定时间后又切换回任务1,这样两个任务看起来就是同时进行,也就是所谓的并发。

肯定还有人听过并行,并发和并行通常是面试的高频考点,所以这里也解释下什么是并行:

并行

并发是针对单核 CPU 提出的,而并行则是针对多核 CPU 提出的。和单核 CPU 不同,多核 CPU 真正实现了“同时执行多个任务”。多核 CPU 的每个核心都可以独立地执行一个任务,而且多个核心之间不会相互干扰。在不同核心上执行的多个任务,是真正地同时运行,这种状态就叫做并行。双核 CPU 的工作状态如下图(图 19-2)所示:
在这里插入图片描述
双核 CPU 执行两个任务时,每个核心各自执行一个任务,和单核 CPU 在两个任务之间不断切换相比,它的执行效率更高
我们的开发板RK3568是A55架构是4核的芯片,可以看出瑞芯微的这款芯片还是非常强大的。

虽然我们的芯片是4核,也就是说如果只是按照并行的任务的话,那同时也就只能4个任务,可是我们一个系统怎么可能同时只能是4个任务呢,所以在真实的工作中,通常是并行+并发模式

并发+并行模式

同时存在并发和并行两种情况,即所有核心在并行工作的同时,每个核心还要并发工作
例如一个双核 CPU 要执行四个任务,它的工作状态如下图(图 19-3)所示:
在这里插入图片描述
并发可以看作是并行的理想状态,为了便于讲解和避免产生歧义,之后的章节无论是并发
还是并行,都会统称为并发


二、什么是竞争

上面介绍到我们的系统是并发进行的,那么并发进行就会存在着对资源的竞争
举个简单的例子:
在多线程中,多个线程都对同一个全局变量进行了访问,假设在线程A中还没读取这个变量的值就被打断,变量被线程B修改,那么这个线程A最终访问到的变量自然不是我们要访问的结果,这个变量就是资源,多线程之间就存在着竞争。

一般产生竞争的原因有以下几点:

(1)多线程的并发访问。由于 Linux 是多任务操作系统,所以多线程访问是竞争产生的
基本原因。
(2)中断程序的并发访问。中断任务产生后,CPU 会立刻停止当前工作,从而去执行中
断中的任务,如果中断任务对共享资源进行了修改,就会产生竞争。
(3)抢占式并发访问。linux2.6 及更高版本引入了抢占式内核,高优先级的任务可以打断低优先级的任务。在线程访问共享资源的时候,另一个线程打断了现在正在访问共享资源的线程同时也对共享资源进行操作,从而造成了竞争。
(4)多处理器(SMP)并发访问。多核处理器之间存在核间并发访问。

三、如何解决竞争

在 Linux 内核中,提供了四种处理并发与竞争的常见方法,分别是原子操作、自旋锁、信号量、互斥体

1、原子操作

在 Linux 内核中的原子操作可以理解为“不可被拆分的操作”,就是不能被更高等级中断抢夺优先的操作
原子操作又可以进一步细分为“整型原子操作”和“位原子操作”

整形原子操作:

在 Linux 内核中使用 atomic_tatomic64_t 结构体分别来完成 32 位系统和 64 位系统的整形数据原子操作,两个结构体定义在“内核源码/include/linux/types.h”文件中,具体定义如下:

typedef struct {
int counter;
} atomic_t;

#ifdef CONFIG_64BIT
typedef struct {
long counter;
} atomic64_t;
#endif

操作原子的API
在成功定义原子变量之后,必然要对原子变量进行读取、加减等动作,原子操作的部分常
用 API 函数如下所示,定义在“内核源码/include/linux/atomic.h”文件中
在这里插入图片描述
有了内核提供的这些原子API函数我们可以轻松对某个整形变量进行原子操作,可以看出操作还是非常简单的。

原子位操作

原子位操作没有 atomic_t 的数据结构,原子位操作是直接对内存进行操作,原子位操作相关 API 函数如下(图表 20-2)所示:
在这里插入图片描述

举个编写原子操作的代码:

static atomic64_t v = ATOMIC_INIT(1);//初始化原子类型变量 v,并设置为 1
static int open_test(struct inode *inode,struct file *file)
{
if(atomic64_read(&v) != 1){//读取原子类型变量 v 的值并判断是否等于 1
return -EBUSY;
}
atomic64_set(&v,0);//将原子类型变量 v 的值设置为 0
//printk("\nthis is open_test \n");
return 0;
}

static int release_test(struct inode *inode,struct file *file)
{
//printk("\nthis is release_test \n");
atomic64_set(&v,1);//将原子类型变量 v 的值赋 1
return 0;
}


这样的一个驱动,表明,只有第一个应用打开该文件时才有效,,因为当第一个应用打开该文件后的原子变量就被设置为0,那么其他应用程序再进来的时候该变量为0就会打开失败。

2.自旋锁

3.信号量

4.互斥锁

5.如何选择哪种方式


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

mysql批量更新方法

mysql批量更新方法 实验mysql版本为5.7.20 隔离级别为rr,加锁场景的问题在mysql8.0.18中为复现 方法一 replace into 批量更新 原理:replace into table (col1,col2) values (x1,x2), 操作本质是对重复的记录先delete 后insert 缺点:1、如…

特斯拉Model S及Model X 2023上半年交付,1月6日公布售价

特斯拉Model S及Model X终于快要交付了。 2022年12月30日,广州国际车展盛大开幕。众多车企带来了旗舰车型,让观众直呼太过瘾,其中,人流量爆火的莫过于特斯拉展台。此次,特斯拉携旗下S3XY家族重磅出击,全新车…

【C++基础】08:模板

模板 OVERVIEW模板一、函数模板1.func template基本使用:2.func template案例:数组排序3.函数与函数模板的区别&调用规则:4.func template的局限性:二、类模板1.类模板基本使用:2.类模板与函数模板的区别&#xff…

AOA估计中的MUSIC算法(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 随着阵列信号处理技术的不断发展,到达角估计(Angle Of Arrival)的研究在移动通信系统中具有重要意义。通过分析经典MUSIC算法,…

golang 自定义命令行flag包简单使用

一、为什么需要使用golang自定义命令行 不恰当的比喻,当我们写了一个服务代码后,按照简单的思维,我们会在业务代码中将要连接的数据库 用户名、主机名、端口号、密码写死。 那么也就意味着我们启动该服务后都只能固定连接某一个数据库&#x…

etcd快速入门

etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。 etcd作为服务发现系统,有以下的特点: 1.简单&#…

分享67个PHP源码,总有一款适合您

链接:https://pan.baidu.com/s/1MzKN0bLDRv0i290R2erMHQ?pwdbo2i 提取码:bo2i PHP源码 分享67个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载…

寒假每日一题W1D3——上课睡觉

题目描述 有 N 堆石子,每堆的石子数量分别为 a1,a2,…,aN。 你可以对石子堆进行合并操作,将两个相邻的石子堆合并为一个石子堆,例如,如果 a[1,2,3,4,5],合并第 2,3 堆石子,则石子堆集合变为 a[1,5,4,5]。…

【学习】backdoor attacks、Adversarial Attack on Images、Adversarial Attack on Audio

文章目录一、后门攻击backdoor attacks1、data poisoning2、backdoored PLM3、defenseONION4、后门攻击:绕过ONION防御5、摘要二、Adversarial Attack on Imagesone pixel attackdifferential evolution三、Adversarial Attack on Audio一、后门攻击backdoor attacks 什么是后…

进程的终止和等待

目录 进程终止 如何获取退出码呢? 进程退出方法有哪些? 对于进程退出,内核OS做了什么? 进程等待 为什么要进行进程等待? 如何进行进程等待? 什么是阻塞和非阻塞等待? 进程终止 对于进程…

飞依诺冲刺科创板上市:上半年出现亏损,因商业秘密纠纷被起诉

近日,飞依诺科技股份有限公司(下称“飞依诺”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,飞依诺计划募资11.22亿元,将用于生产基地升级项目、新产品研发与总部基地建设项目、营销网络建设…

【Linux】一文掌握Linux基本指令(下)

本章命令大致总结命令功能cat打印文件内容echo打印文件内容> 输出重定向 >>追加重定向< 输入重定向 more 查看文本内容 less等价于morehead打印文本前n行tail 打印文本后n行 |管道date时间相关cal日历sort文本排序uniq相邻文本降重zip打包压缩unzip解包tar打包/解包…

蓝桥杯寒假集训第四天(全球变暖DFS)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 有一个正方形区域&#xff0c;里面有大陆和海洋&#xff0c;暂且用‘.’表示海洋&#xff0c;用‘#’表示大陆。我们把上下左右都连在一起的大陆称之为岛屿。但是随着气温…

07 来自于网友的 retrieveFileStream 的一个问题, 导致系统程序异常

前言 可以先参考前面一篇文章 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题 这里的问题 主要是来自于 某 qq 交流群的网友 呵呵 当然 这里测试用例代码…

新鲜速递:Spring Data JPA 3.0快速入门、进阶到精通

第一章、安装Spring Data JPA 第一步&#xff0c;先确保你使用的是Spring Boot 3.0或以上环境&#xff0c;可以在pom.xml里加入Spring Data JPA依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-…

【ROS】—— ROS通信机制——话题通信(二)

文章目录前言1. 话题通信1.1 话题通讯理论模型1.2 话题通信基本操作&#xff08;C&#xff09;1.2.1 简单发布框架的实现1.2.2 发布逻辑的实现1.2.3 订阅方的实现1.3 话题通信基本操作&#xff08;python&#xff09;1.3.1 发布的实现1.3.2 订阅的实现1.4 话题通信自定义msg1.4…

五问补盲(五)| 想要长得好看又好用,补盲激光雷达应该怎么做?

上期&#xff0c;我们聊了好用的补盲激光雷达&#xff0c;得满足哪些条件&#xff1f; 好用是必备素质&#xff0c;属于补盲激光雷达的底线。好用之外&#xff0c;补盲激光雷达还有一种更直观的竞争力&#xff0c;那就是——外型。 有句话说的好&#xff0c;很多时候&#xff0…

2022跟学尚硅谷Maven入门(二)IDEA操作

2022跟学尚硅谷Maven入门二 IDEA操作第四章 使用Maven&#xff1a;IDEA环境第一节 创建父工程1.创建 Project2.开启自动导入第二节 配置 Maven 信息第三节 创建 Java 模块工程第四节 创建Web模块工程1.创建模块2.修改打包方式3.Web 设定4.借助IDEA生成web.xml5.设置 Web 资源的…

数据库,计算机网络、操作系统刷题笔记21

数据库&#xff0c;计算机网络、操作系统刷题笔记21 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

基于thinkphp6搭建的 admin后台管理基础框架,方便快速进行二次开发

小牛Admin v2.1 完整代码下载地址&#xff1a;基于thinkphp6搭建的 admin后台管理基础框架 使用thinkphp6 layui 搭建的 admin后台管理基础框架&#xff0c;方便快速进行二次开发 该项目是在 http://www.xnadmin.cn/ 小牛Admin 开源项目的基础上进行个人优化的产物 运行环境…