并发与竞态——信号量与互斥体

临界区,互斥量,信号量,事件,四种进程或线程同步互斥的控制方法在不同恶意软件中的应用 在不同恶意软件中的应用APT样本分析中遇到的区别前人之轮作者: JuKevin互斥量(Mutex)信号量互斥量和信号量的区别 APT样本分析中遇到的区别 一般木马都是通过互斥锁(CreateMutex),蔓灵花的ArtraDownloader用的是信号锁(CreateSemaphoreA),StrongPity等多组件协作完成攻击链类,用CreateEvent 前人之轮 作者: JuKevin 互斥量(Mutex) 互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号, 阅读详情

Release log:

2021-04-27 二: 完成初版

原文地址

说明

前一段时间学习了《LINUX 设备驱动程序》中的“并发与竞态”章节,没过多久在阅读代码时,看到了 spin_lock_bh 这个函数,然后一脸瞢逼,这个函数后缀有啥意义来着?所以决定对这一章节做一个简单整理,一是为了加深印象,二是为了后续的快速回顾以及查找

资源共享的规则

  1. 只要可能,就应该避免资源的共享。如果我们将资源放在多个线程都会找到的地方,则必须有足够的理由
  2. 在单个执行线程之外共享硬件或软件资源的任何时候,因为另外一个线程可能产生对该资源的不一致观察,因此必须显式地管理对该资源的访问
  3. 当内核代码创建了一个可能和其他内核部分共享的对象时,该对象必须在还有其他组件引用自己时保持存在(并正确工作)

信号量和互斥体

在计算机科学中,信号量是一个众所周知的概念。一个信号量本质上是一个整数值,它和一对函数联合使用,这一对函数通常称为 P 和 V。希望进入临界区的进程将在相关信号量上调用 P;如果信号量的值大于零,则该值减小一,而进程可以继续。相反,如果信号量的值为零(或更小),进程必须等待直到其他人释放该信号量。对信号量的解锁通常调用 V 完成;该函数增加信号量的值,并在必要时唤醒等待的进程

当信号量用于互斥时(即避免多个进程同时在一个临界区中运行),信号量的值应初始化为 1

Linux 内核中信号量的使用

在 Linux 内核中,要使用信号量需要包含头文件 <linux/semaphore.h>,相关的类型为 struct semaphore

信号量的声明以及初始化函数

DECLARE_MUTEX(name);
void sema_init(struct semaphore *sem, int val);
void init_MUTEX(struct semaphore *sem);

Linux 中,P 函数被称为 down,下面是他的几个版本:

void down(struct semaphore *sem); // 非可中断操作,用于建立不可杀进程(ps 输出中的 "D state")
int down_interruptible(struct semaphore *sem); // 可中断,被中断时返回非零值,调用者未拥有该信号量
int down_killable(struct semaphore *sem); // 可以被 fatal signal 打断
int down_trylock(struct semaphore *sem); // 不会休眠,如果信号量在调用时不可获取,立即返回非零值
int down_timeout(struct semaphore *sem, long timeout); // timeout 是以 jiffies 计数

Linux 中,等价与 V 的函数是 up

void up(struct semaphore *sem);

读取者/写入者信号量

读取者/写入者信号量被称为 rwsem,使用时需要包含 <linux/rwsem.h>,相关的数据类型为 struct rw_semaphore。

rwsem 的初始化函数如下

void init_rwsem(struct rw_semaphore *sem);

rwsem 用于只读访问的操作如下

void down_read(struct rw_semaphore *sem); // 可能将进程至于不可中断的休眠中
int down_read_trylock(struct rw_semaphore *sem); // 成功返回 1,否则返回 0
void up_read(struct rw_semaphore *sem);

rwsem 用于写入者的操作如下

void down_write(struct rw_semaphore *sem);
int down_write_trylock(struct rw_semaphore *sem);
void up_write(struct rw_semaphore *sem);
void downgrade_write(struct rw_semaphore *sem); // 将写入者降级为读取者

写入者具有更高优先级,如果大量写入者竞争一个信号量,这种实现会导致读取者“饿死”

Linux驱动开发(18):linux驱动并发与竞态 原子操作分为整型原子操作和位原子操作。使用方法非常类似,本小节介绍分别 介绍整型原子操作和位原子操作的函数(确切的说某些是宏定义)。测试实验仅 用整型原子操作,读者可自行使用位原子操作实现,实验源码位于“//atomic_t类型结构体} atomic_t;参数i: 设置整型原子变量的初始值atomic_t类型: 暂且称为“整型原子类型”,我们用它定义整型原子变量。//返回增加后的结果//返回减少后的结果参数v:要设置的整型原子变量的指针(地址)。i: 要进行加/减操作的大小返回值。 阅读详情

相关推荐

信号量、互斥体和自旋锁的区别

本文章是关于信号量、互斥体和自旋锁的区别。

Linux线程同步对象:互斥体、信号量、条件变量、读写锁

因为某次操作系统唤醒pthread_cond_wait()时tasks.empty()可能仍为true,即操作系统可能在某些情况下唤醒条件变量,也就是说存在没有其他线程向条件变量发送信号,但等待此条件变量的线程有可能醒来的情形。信号量代表一定的资源数量,可以根据当前资源的数量按需唤醒指定数量的资源消费者线程,资源消费者线程一旦获取信号量,就会让资源减少指定的数量,如果减少为0,则消费者线程将全部处于挂起状态;broadcast唤醒所有调用pthread_cond_wait()等待的线程,相当于广播。....

Sauron7i的博客 575

自动驾驶轨迹规划算法——Apollo EM Planner

Apollo EM Planner 是百度自动驾驶系统中的轨迹规划算法,采用期望-最大化(EM)迭代优化思想。其核心是将轨迹规划分解为路径优化(E-Step)和速度优化(M-Step)两个子问题,在Frenet坐标系下交替求解。算法先通过动态规划(DP)搜索粗路径,再使用二次规划(QP)进行平滑优化,并结合障碍物信息生成安全走廊。相较Lattice、Hybrid A*等规划器,EM Planner具有更好的实时性、动态障碍物处理能力和轨迹平滑性,适用于城市道路、高速公路等复杂场景。该算法通过解耦路径与速度优

swaggytiger的博客 2666

【极速理解】内核中解决竞态的方法之 信号量、互斥体、原子操作

​ 当一个进程获取到了信号量之后,信号量的值会减为 0 ,如果另外一个进程想获取信号量,会无法获取到值为 0 的信号量资源...

Catalystinvincib的博客 388

Pixhawk变砖自救指南:从DFU模式到固件重刷全流程(附2.4.8实测)

本文详细介绍了Pixhawk飞控变砖后的自救方法,从DFU模式进入、固件重刷到高级恢复技巧全流程。特别针对国产版本boot0引脚未引出的特殊情况提供了解决方案,帮助用户通过QGC或Mission Planner地面站工具恢复飞控功能,适用于2.4.8等常见固件版本。

weixin_29168813的博客 337

用Python+Charles搞定小程序付费短剧下载(附完整代码与避坑点)

本文详细介绍了如何利用Python和Charles抓包工具实现小程序付费短剧的自动化下载。通过分析小程序视频接口、破解请求参数,并编写Python脚本,读者可以轻松获取并保存短剧内容。文章还提供了完整的代码示例和常见问题的解决方案,特别适合对视频采集和抓包技术感兴趣的开发者。

weixin_28731231的博客 1188

Linux系统中的信号量(semphore)与互斥体(mutex)

Linux系统中的信号量(semphore)与互斥体(mutex) http://www.embexperts.com/viewthread.php?tid=31 两者最大区别:信号量可以允许多个线程进入临界区,而互斥体只允许一个线程进入临界区。本贴将描述信号量与互斥体之间的细微区别以及在实际的代码设计中如何使用它们。 信号量在2.6.26中的定义如下:struct semaphore { spinlock_t lock; unsign...

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 824

LeRobot 官方论文:一个用于端到端机器人学习的开源库

本文介绍了一个名为LeRobot的开源库,旨在解决机器人学习领域的碎片化问题。该库提供了端到端的技术栈,包括统一的机器人中间件API、标准化的数据集格式(LeRobotDataset)、优化的推理栈以及多种最先进机器人学习算法的实现。LeRobot支持多种低成本开源机器人平台(如SO-10X、ALOHA-2等),通过共享中间件实现便捷的遥操作和数据收集。其数据集格式已广泛应用于社区,截至2025年9月已有16,000多个数据集公开共享。该库还支持流式处理大规模数据,降低了研究门槛。在模型方面,LeRobot

2506_90492529的博客 905

驱动程序开发:原子操作、自旋锁、信号量、互斥体详细讲解

驱动程序开发:原子操作、自旋锁、信号量、互斥体详细讲解

morecrazylove的博客 1191

29、高速低功耗采样保持放大器设计

本文详细介绍了适用于低功耗模数转换器的高速低电压采样保持放大器(SHA)的设计技术,包括传统SHA的局限性、采样技术分类以及全NPN型和BiCMOS型SHA的具体设计实现。同时,文章深入探讨了优化输入电容、采样开关驱动及低功耗设计等具体措施,并提供了10位ADC前端和无线通信应用中的实例分析,为相关领域的工程师提供有价值的参考。

weixin_30600615的博客 424

20、Citrix 云桌面常见VDA注册问题汇总

本文总结了与 VDA 中出现的 VDA 会话断开连接、注册、会话卡住以及挂起/崩溃相关的主要支持文章。

我在Citrix、VMware、Veeam、微软和NVIDIA等领域拥有丰富经验的专业人士,专注于设计和维护虚拟化基础设施、实施备份与灾难恢复策略,致力于优化企业的IT环境。 943

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

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

火山上的企鹅 4897

彻底解决tplink路由器无法访问部分https网站

彻底解决tplink无法访问部分https网站

renkai721的专栏 8762

【Linux】Linux驱动开发:并发与竞态(原子操作、自旋锁、信号量、互斥体)

/配合 atomic_dec_and_test 使用//定义并初始化原子变量//配合 atomic_inc_and_test 使用//定义并初始化原子变量。

W__winter的博客 1858

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

linux 信号量_《Linux设备驱动程序》(六)——并发与竞态相关概念

之前的scull字符设备驱动实例中,我说过还有许多不完善的地方。考虑如下状态:当读取的数据量比较大或者比较耗时,此时有其他的线程在我们的数据区域中写入新的数据,那此时我们读到的数据会是什么情况呢?本节以介绍一些概念为主,主要学习以下内容:竞态和并发的概念;避免出现竞态的一些手段介绍(信号量、互斥体、自旋锁、completion等)并发与竞态的概念并发是指系统试图一次完成多个任务。竞态是指对于共享数...

weixin_39939530的博客 166

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux 驱动编程___竞态/并发问题___信号量和互斥体

信号量和互斥体 几个相关概念 休眠:当一个linux进程到达某个时间点,此时它不能进行任何处理时,它将进入休眠(或阻塞),这将把处理器让给其它进程,知道将来它能够继续完成自己的处理为止。 为了让临界区正确工作,我们选择使用的锁定原语必须在其它拥有这个锁并休眠的情况下工作。 信号量: 实质上是一个整数, 与 P 和 V 函数联合使用 进入临界区, 调用 P 函数 信号量 > 0: 进程可以继续, 信号量减一 信号量 struct semaphore 声明和初始化 直接创建信号量: voi

yichao81523的专栏 842

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

linux内核并发和竟态 (解决竟态的5种方式屏蔽中断,原子操作,自旋锁,信号量,互斥体,)

linux内核并发和竟态 : 并发(Concurrency) 指的是多个执行单元同时、 并行被执行, 而并发的执行单元对共享资源(硬件资源和软件上的全局变量、 静态变量等) 的访问则很容易导致竞态(Race Conditions) 引起竟态的方式: 1对称多处理器(SMP) 的多个CPU ...

yilongdashi的博客 1962

并发与竞态及解决途径

并发与竞态及解决途径 并发(concurrency)是指多个执行单元同时、并行的被执行,而并发执行单元对共享资源的访问很容导致竞态(race condition)。 并发与竞态发生的条件:对称多处理器(SMP)的多个CPU;单CPU内进程与抢占它的进程;中断与进程之间。 解决并发与竞态的途径 访问共享资源的代码区域称为临界区域(critical section),解决竞态的根本途径就是

xiejinyingaaa的专栏 1368

Linux内核中并发和竞态的解决方法

自旋锁:当一个进程获取到自旋锁之后,如果此时另外一个进程也想获取这把锁,后一个进程就处于自旋状态,自旋锁又叫忙等锁。信号量:当一个进程获取到信号量之后,如果此时另外一个进程也想获取这个信号量,后一个进程处于休眠状态。互斥体:当一个进程获取到互斥体之后,如果此时另外一个进程也想获取这个互斥体,后一个进程处于休眠状态。互斥体又叫排它锁。

weixin_45192798的博客 371

什么是竞态 什么是竞态分析

什么是竞态 什么是竞态分析

云满笔记 848

linux内核的并发与竞态的理解

一、概念理解 1.概述 对于我们的驱动程序,或一个代码片段,是可以被两个独立的进程同时执行。驱动程序,或者代码片段对cpu来说就是机器指令,显然指令是可以同时发出的。但是共享资源却不能同时使用,不然就没法统计了。 2.竞态 多个进程同时执行某一代码段,或者调用同一个驱动程序;而这一代码段涉及到对内存的分配,或者驱动程序对硬件进行访问;由于内存或者硬件资源对系统来说都是共享的,那么就容易出问题。比如...

Qinus的博客 610

linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)

本章导读Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态)。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。7.1讲解了并发和竞态的概念及发生场合。7.2讲解了编译乱序、执行乱序的问题,以及内存屏障。7.3~7.8分别讲解了中断屏蔽、原子操作、自旋锁、信号量和互斥体等并发控制机制。7.1 并发与竞态并发是多个执行单元同时、并行...

weixin_30162121的博客 239

浅析解决并发和竞态技术问题研究

文章目录1. 并发与竞态1.1 对称多处理器SMP的多个CPU1.2 单CPU内进程与抢占它的进程1.3中断与进程之间2. 解决竞态问题2.1中断屏蔽2.2自旋锁2.3信号量2.4互斥体3.互斥体使用3.1驱动加上互斥体3.2互斥体简单测试3.3测试过程错误处理 1. 并发与竞态 并发指的是多个执行单元同时,并行被执行比如当设备被一个程序打开时,存在被另一个程序打开的可能,如果两个或多个程序同时对设备文件进行写操作,这就是说我们的设备资源同时被多个进程使用,对共享资源(硬件资源、和软件上的全局变量、静态变量

weixin_44316996的博客 1320
上一篇: 问题记录: 在内核模块中拦截报文并保存到文件
下一篇: git 知识整理
wax5798
博客等级 码龄9年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值