并发与竞态——自旋锁

漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼? 锁的由来? 在各种书籍和面试中,我们看到很多关于互斥锁,自旋锁,信号量的东西,但是为什么有这个东西出来呢? 在《linux设备驱动程序》书籍里面有这样一个例子,给出了下面的一小段代码 if (!dptr->data[s_pos]) { dptr-& 阅读详情

Release log:

2021-05-07 五: 完成初版
2021-05-10 一: 添加自旋锁和信号量的对比

原文地址

Linux 内核中自旋锁的使用

在 Linux 内核中,要使用自旋锁需要包含的文件 <linux/spinlock.h>,锁的数据类型为 spinlock_t。

自旋锁的声明以及初始化

void spin_lock_init(spinlock_t *lock);

自旋锁的获取以及释放

void spin_lock(spinlock_t *lock);
void spin_unlock(spinlock_t *lock);

注意: 所有自旋锁等待在本质上是不可中断的

使用自旋锁的核心规则

  1. 任何拥有自旋锁的代码都必须是原子的。它不能休眠,事实上,它不能因为任何原因放弃处理器,除了服务中断以外(某些情况下此时也不能放弃处理器)
  • 内核抢占的情况由自旋锁代码本身处理。任何时候,只要内核代码拥有自旋锁,在相关处理器上的抢占就会被禁止
  • 在拥有锁的时候避免休眠有时候很难做到,当我们编写需要自旋锁下执行的代码时,必须注意每一个所调用的函数
  • 拥有锁的时间越短越好

自旋锁函数

锁定一个自旋锁的函数

void spin_lock(spinlock_t *lock);
/* 这是一个宏,获得自旋锁之前禁止中断(只在本地处理器上),而先前的中断状态保存在 flags 中 */
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);
void spin_lock_irq(spinlock_t *lock);
/* 在获得锁之前禁止软件中断,但是会让硬件中断保持打开 */
void spin_lock_bh(spinlock_t *lock);

如果我们有一个自旋锁,它可以被运行在(硬件或软件)中断上下文中的代码获得,则必须使用某个禁止中断的 spin_lock 形式

释放自旋锁的方法需要严格对应

void spin_unlock(spinlock_t *lock);
void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags);
void spin_unlock_irq(spinlock_t *lock);
void spin_unlock_bh(spinlock_t *lock);

另外,还有如下非阻塞的自旋锁操作

int spin_trylock(spinlock_t *lock);
int spin_trylock_bh(spinlock_t *lock);

读取者/写入者自旋锁

读取者/写入者锁的类型为 rwlock_t,在 <linux/spinlock.h> 中定义

自旋锁的初始化

void rwlock_init(rwlock_t *lock);

读取者对应的函数(这里没有 read_trylock 可用)

void read_lock(rwlock_t *lock);
void read_lock_irqsave(rwlock_t *lock, unsigned long flags);
void read_lock_irq(rwlock_t *lock);
void read_lock_bh(rwlock_t *lock);

void read_unlock(rwlock_t *lock);
void read_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
void read_unlock_irq(rwlock_t *lock);
void read_unlock_bh(rwlock_t *lock);

写入者对应的函数

void write_lock(rwlock_t *lock);
void write_lock_irqsave(rwlock_t *lock, unsigned long flags);
void write_lock_irq(rwlock_t *lock);
void write_lock_bh(rwlock_t *lock);
void write_trylock(rwlock_t *lock);

void write_unlock(rwlock_t *lock);
void write_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
void write_unlock_irq(rwlock_t *lock);
void write_unlock_bh(rwlock_t *lock);

和 rwsem 类似,读取者/写入者锁可能造成读取者饥饿

对比信号量与自旋锁

自旋锁可以在不能休眠的代码中使用,比如中断处理例程。自旋锁如果被其他人获得,则代码进入忙循环并重复检查这个锁,直到该锁可用为止。信号量是一种睡眠锁,如果一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。信号量不能在中断上下文中被调度

自旋锁会关闭抢占,而信号量不会

在正确使用的情况下,自旋锁通常可以提供比信号量更高的性能

需求                        建议的加锁方式
低开销加锁                  优先使用自旋锁
短期锁定                    优先使用自旋锁
中断上下文中加锁            使用自旋锁

长期加锁                    优先使用信号量
持有锁是需要睡眠、调度      使用信号量
HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化 我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注 阅读详情

相关推荐

SOC设计必看!Tessent DRC检查中最容易踩的5个坑(附解决方案)

本文针对SOC设计中Tessent DRC检查的常见问题,详细分析了5个最易忽视的陷阱,包括时钟域交叉、扫描链虚连、多电压域规则等,并提供专业解决方案。特别针对芯片设计中的DFT验证难点,分享了经过验证的调试方法和Tessent工具使用技巧,帮助工程师提升DRC检查效率。

weixin_29280657的博客 496

自旋锁与信号量

低开销加锁               优先使用自旋锁短期锁定                 优先使用自旋锁中断上下文中加锁          使用自旋锁 长期加锁                 优先使用信号量持有锁是需要睡眠、调度     使用信号量自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分。死锁:假设有一个或多个内核任务和一个或多个资源,

jgl841001的专栏 578

opencv图像去畸变

opencv图像去畸变

智能机器人产学研基地 4870

嵌入式常见面试题总结(6)

50,如何编写一个LINUX驱动?  答:一.在系统的资源文件代码中定义platform_device,里面填写对应设备的外设IO起始地址,地址长度,中断,DMA资源等信息资源信息,并把资源信息添加到系统启动初始化流程里面; 二. 通过module_init(xxx_init)和moule_exit(xxx_init)定义驱动入口和出口函数; 三.写出模块加载xxx_init()和退出的实际处理...

天泉证道 1235

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 367

面经——嵌入式常见面试题总结100题(下)

51,简述LINUX驱动中字符设备和块设备的区别? 52,试总结单片机底层开发与LINUX驱动开发有哪些异同? 53.请从网卡、USB HOST、LCD驱动器、NAND FLASH、WIFI 、音频芯片中选择一个或者2个(可以以具体的芯片为例),对下面的问题做答: 54,linux驱动分类? 55,信号量与自旋锁? 56,platform总线设备及总线设备如何编写? 57,kmalloc和vmalloc的区别? 58、module_init的级别? 59、添加驱动? 60、IIC原理? 61,kernel.

zhuguanlin121的博客 1万+

Tesla V100 在 Windows 下的驱动选择与模式切换实战

本文详细解析了Tesla V100专业计算卡在Windows系统下的驱动安装与模式切换实战。针对设备管理器识别但任务管理器“隐身”的常见问题,文章指出其默认TCC模式为纯计算设计,并指导用户正确选择数据中心或GRID驱动。核心在于通过注册表修改或驱动选择,在高效的TCC模式与便于监控的WDDM模式间切换,同时提供了nvidia-smi命令行监控与AI框架测试等稳定使用方案。

weixin_29247219的博客 1806

linux自旋锁简介

一、什么是自旋锁     自旋锁最初就是为了SMP系统设计的,实现在多处理器情况下保护临界区。自旋锁实际上是忙等待锁,它有几个重要的特性:被自旋锁保护的临界区代码执行时不能进入睡眠状态;被自旋锁保护的临界区代码执行时,内核不能被抢占。     在单cpu并且不支持内核抢占的系统上,自旋锁实际上是空操作;在单cpu并且支持内核抢占的系统上,自旋锁实际上是对内核抢占功能的打开和关闭;在SMP系统上

倚楼听风雨的博客 1787

数据分片的三种方式:哈希、一致性哈希、按照数据范围分片

数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。三种常用的数据分片方式:1. 哈希分片2. 一致性哈希分片(Consistent Hash)3. 按照数据范围分片(Range Based)数据分片的应用场景:1. 数据库扩展2. 分布式缓存对集群部署多个缓存节点,提高缓存的处理能力。

wjianwei666的专栏 1134

ROS2 - 乐动激光雷达 LD06

STL-06P 主要由激光测距核心,无线传电单元,无线通讯单元,角度测量单元、电机驱动单元和机械外壳组成。STL-06P 测距核心采用 DTOF 技术,可进行每秒 5000 次的测距。每次测距时,雷达发射出红外激光,激光遇到目标物体后被反射到单光子接收单元。

机器人控制与仿真应用 3485

信号量和自旋锁

 内核同步措施    为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。    Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到

tellyouatruth的专栏 835

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

如何读取ECU中指定内存地址的数据?图解UDS 0x23服务带你快速上手!!

车载系统攻城狮 2623

并发与竞态(自旋锁&信号量)

并发与竞态 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 并发与竞态并发与竞态前言举一个例子一、竞态发生的情形1、对称多处理器(SMP)的多个CPU2、单CPU内进程间的抢占3、中断二、解决竞态的方法1.引入库2.读入数据总结 前言 前几篇博客主要讲解了Linux驱动的基础概念以及字符型设备驱动的模板, 并且编写了一个实例证明了该模板的可用性。那么这里引

qq_16177869的博客 591

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

漫画Linux 并发、竞态、互斥锁、自旋锁、信号量

1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。 2. 什么是并发和竞态? 在早期的Linux内核中,并发源相对较少。内核不支持对称多处理器(SMP)系统,唯一导致并发问题的原因是中断。 随着处理器的C

Android系统攻城狮 548

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。 2. 什么是并发和竞态? 在早期的Linux内核中,并发源相对较少。内核不支持对称多处理器(SMP)系统,唯一导致并发问题的原因是中断。 随着处理器的CP

Systemcall名屋 782

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

内核的并发和竞态(信号量、completion、自旋锁)

1、并发和并行 (1)并行:在同一时刻有多个线程一起运行; (2)并发:在同一时刻只有一个线程在运行,但是在一个时间段内有多个线程运行; 总结:并发是宏观的并行。因为CPU运行特别快,虽然CPU不断在切换运行的线程,但是对于人来说,根本感知不到CPU的切换过程,就好像荧光灯在不停的闪烁, 但是频率只要够快,人们就感觉不到在闪烁。 2、并发产生的原因 (1)正在运行的多个用户进程以无法预知的方式访问驱动程序代码 (2)外部设备的中断异步的发生,导致正在运行的进程或者驱动代码被中断 (3)linux的软件

weixin_42031299的博客 798

优快云日报190226——漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼? 作者:码农-嵌入式Linux 学习Linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼。在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不...

优快云 官方博客 4493

驱动开发之始,(三)并发与竞态,信号量与自旋锁

1.并发与竞态 在单处理器结构中,各个进程从宏观上看是并行的,因为处理器执行速度非常快,但从微观上看进程是串行执行,因为在一个时刻只有一个进程能被处理器运行,称为并发。换句话说,在一段时间内,处理器能够同时做多件事。举个例子,A进程先在CPU上得到执行,突然被B进程打断(硬件中断或拥有更高优先级),CPU此刻暂时放下A进程,转而为B进程服务,当B进程服务完成后,在接着执行A进程,从这一段时...

lijunnanxcx的博客 232

Linux内核的并发与竞态、信号量、互斥锁、自旋锁

/************************************************************************************ *本文为个人学习记录,如有错误,欢迎指正。 *本文参考资料: *        https://blog.youkuaiyun.com/liu_sheng_1991/article/details/52291427 *      ...

weixin_30900589的博客 131

Linux内核的竞态与并发——自旋锁实例

文章目录信号量概念实例实验步骤:     本文为 Linux内核的竞态与并发(中断屏蔽、原子操作、自旋锁、信号量、互斥体的互斥机制) 中信号量的实例 其他部分: ● Linux内核的竞态与并发——原子操作实例 信号量概念     多处理器之间设置一个全局变量V,表示锁。并定义当V=1时为锁定状态,V=0时为解锁状态自旋锁同步机制是针对多处理器设计的,属于忙等机制。     自旋锁,逻辑不允

火山上的企鹅 1407

Linux驱动---Linux系统中的并发与竞态以及解决竞态的几种方法:自旋锁,原子操作等

本文详细介绍了Linux内核中的并发控制机制,包括原子操作、自旋锁、互斥锁、信号量和完成量。主要内容包括:1.并发与竞态概念,解释共享资源访问问题;2.原子操作的原理与API实现;3.自旋锁的特点及在中断中的使用注意事项;4.互斥锁的进程级保护特性;5.信号量的PV操作机制;6.完成量的事件通知机制。通过多个代码示例展示了各同步机制的实际应用场景,并比较了它们的适用条件(如中断上下文、休眠特性等),最后总结了不同同步机制的适用场景和选择建议。

Dlrb1211的博客 248

驱动学习笔记11 内核并发和竞态,中断屏蔽,自旋锁,信号量,原子操作

11

m0_62089823的博客 505

信号量与自旋锁(1): 并发和竞态

1. 概念: 操作系统中存在大量的并发访问, 因此会导致竞态的可能性. 竞态通常由于对资源的共享所产生. 当两个执行线程对相同的数据结构(或硬件资源)进行访问时, 这种可能性就永远存在. 因此, 首要的原则是:在设计过程中, 应该尽量避免这种情况的发生. 但事实是, 这样的共享的大多数情况下是必须的, 包括硬件资源, 全局变量, 指针多向传递等等.

代威涛的主页 1518

Linux内核的竞态与并发(中断屏蔽、原子操作、自旋锁、信号量、互斥体的互斥机制)

文章目录一、基本概念:二、解决竞争状态的策略:系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 一、基本概念: ● linux内核中产生竞态的原因 SMP对称多处理器 (多核CPU) 比如都要操作LCD 进程和进程之间的抢占共享资源,进程和中断之间发生共享资源的抢占,中断和中断之间的资源抢占(中断是有优先级的) 比如:LCD 网卡 可见的内存 (文件 共享内存 全局变量)。 ● 并发 多任务同时执行,对于单核的CPU来说,宏观上并行,微观上串行。 ●

火山上的企鹅 4897
上一篇: git 知识整理
下一篇: 并发与竞态——completion
wax5798
博客等级 码龄9年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值