信号量与优先级翻转的分析

二值信号量、计数型信号量与互斥量 信号量(Semaphore),是在多任务环境下使用的一种机制,是可以用来保证两个或多个关键代码段不被并发调用。信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以用来表示资源的数量, 阅读详情

1965年,荷兰学者Dijkstra提出了利用信号量机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号量机制被广泛的用于单处理机和多处理机系统以及计算机网络中。

信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。

Dijkstra同时提出了对信号量操作的PV原语。

P原语操作的动作是:

  (1)S减1;
  (2)若S减1后仍大于或等于零,则进程继续执行;

  (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

V原语操作的动作是:

  (1)S加1;
  (2)若相加结果大于零,则进程继续执行;

  (3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。

PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。


互斥信号量和二进制信号量的区别:1)互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效,同一个任务可以递归申请。2)二进制信号量,一个任务申请成功后,可以由另一个任务释放。

二进制信号量实现任务互斥:打印机资源只有一个,abc三个任务共享,当a取得使用权后,为了防止其他任务错误地释放了信号量(),必须将打印机房的门关起来(进入临界段),用完后,释放信号量,再把门打开(出临界段),其他任务再进去打印。(而互斥型信号量由于必须由取得信号量的那个任务释放,故不会出现其他任务错误地释放了信号量的情况出现,故不需要有临界段。互斥型信号量是二进制信号量的子集。)
二进制信号量实现任务同步:a任务一直等待信号量,b任务定时释放信号量,完成同步功能。

互斥量(Mutex) :互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。

Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。Mutex可以被抽象为四个操作: - 创建 Create- 加锁 Lock- 解锁 Unlock- 销毁 Destroy。

Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。


操作系统的优先级反转:如果任务之间由于有共享资源出现了竞争或者死锁,是会严重影响系统安全的。因此uC/OS对共享资源提供了保护机制。一般情况下使用的是信号量方法。创建一个信号量并对他进行初始化,当一个任务需要使用一个共享资源时,他必须先申请得到这个信号量。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到信号量,也不能使用该资源。在uC/OS中称为优先级反转。简单地说,就是高优先级任务必须等待低优先级任务的完成。


互斥信号量解决任务优先级反转:使获得信号量的任务的优先级别在使用共享资源期间暂时提升到所有任务最高优先级的高一个级别上,以使该任务不被其他任务所打断,从而能尽快的使用完共享资源并释放信号量,然后在释放信号量之后,再恢复该任务原来的优先级别。(可以通过线程的属性来动态的修改线程的优先级)


优先级反转+解决方案 
1. 优先级反转(Priority Inversion): 由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。

2. 产生原因: 其实,优先级反转是在高优级(假设为A)的任务要访问一个被低优先级任务(假设为C)占有的资源时,被阻塞.而此时又有优先级高于占有资源的任务(C)而低于被阻塞的任务(A)的优先级的任务(假设为B)时,于是,占有资源的任务就被挂起(占有的资源仍为它占有),因为占有资源的任务优先级很低,所以,它可能一直被另外的任务挂起.而它占有的资源也就一直不能释放,这样,引起任务A一直没办法执行.而比它优先低的任务却可以执行。所以,一个解决办法就是提高占有资源任务的优先级,让它正常执行,然后释放资源,以让任务A能正常获取资源而得以执行。


3. 解决方案 ( 优先级继承 / 优先级天花板 ):目前解决优先级反转有许多种方法。其中普遍使用的有2种方法:一种被称作优先级继承(priority inheritance);另一种被称作优先级极限(priority ceilings)。

A. 优先级继承(priority inheritance) :优先级继承是指将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级.当高优先级任务由于等待资源而被阻塞时,此时资源的拥有者的优先级将会自动被提升。

B. 优先级天花板(priority ceilings):  优先级天花板是指将申请某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级.(这个优先级称为该资源的优先级天花板) 。

A 和B的区别: 优先级继承,只有当占有资源的低优先级的任务被阻塞时,才会提高占有资源任务的优先级,而优先级天花板,不论是否发生阻塞,都提升。

(可以通过线程的属性来动态的修改线程的优先级)

FreeRTOS优先级翻转原理与信号量实战分析 在实时操作系统中,优先级翻转是一种由任务调度策略与共享资源竞争共同引发的确定性延迟现象,其本质是高优先级任务因等待临界资源而被低优先级任务阻塞,期间反被中优先级任务抢占,破坏时间可预测性。该现象广泛存在于STM32、ARM Cortex-M等嵌入式平台,尤其在工业控制、飞控、传感器融合等对响应确定性敏感的场景中影响显著。FreeRTOS通过二值信号量暴露原始调度行为,而互斥量则借助优先级继承机制缓解该问题。理解其触发条件、时序演化及硬件支撑(如SysTick中断、USART日志保真)是构建高可靠实时系统的基 阅读详情

相关推荐

FreeRTOS信号量_优先级翻转_互斥信号量

实际开发过程中,确实不小心就会出现优先级反转,一调就费时很久,所以需要特别注意这个“神奇”的机制。

moon2shine的博客 336

信号量机制 优先级翻转 解决

1965年,荷兰学者Dijkstra提出了利用信号量机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号量机制被广泛的用于单处理机和多处理机系统以及计算机网络中。 信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。 Dijkstra同时提出了对信号量操作的PV原语。 P原语操作的动作是:   (1)S减1;

弹-room 2458

linux实时信号量优先级翻转和优先级继承

描述解决线程优先级翻转的优先级继承协议实现

二值信号量反复释放特性解析

二值信号量可以反复释放,但状态不会超过1。这种特性使其在同步和资源管理中非常有用。

kivenx的博客 384

Agent框架系列:1-低代码智能体平台深度解析Dify、Coze、n8n

Dify、Coze 和 n8n 是三大主流低代码智能体平台,各有侧重。Dify 适合企业级 AI 应用,具备强大的 RAG 和知识库管理能力,技术栈为 Python + React。Coze 由字节推出,主打零代码和快速原型开发,集成 60+ 插件,极适合非技术用户。n8n 以工作流自动化和系统集成为核心,支持 400+ 外部应用,基于 Node.js + Vue,扩展性极强。选择建议:非技术团队选 Coze,AI 应用选 Dify,复杂自动化与集成选 n8n。可根据实际需求混合使用,最大化平台优势。

3086

基于cat12搞定SBM的ROI的统计分析——vertex水平和ROI水平的双样本T检验

前言 一、Atlas皮层图谱介绍 二、SBM分析——主要以皮层四种常用指标中的厚度(thickness)和沟深(depth)为主

Sophia2023的博客 8753

信号量优先级反转(翻转)与优先级继承

什么是优先级反转(翻转) 优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即: 高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。-- 从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。 具体来说:当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行类似死锁的情形发生

RToax 2259

Moltemplate建模----水盒子data文件

1功能介绍 Moltemplate是LAMMPS官方支持的建模工具之一,适用于LAMMPS建模。该程序创建了一种简单的文件格式来存储分子定义和力场,即模板LT。LT文件包含与特定分子有关的所有文本(包括坐标,键拓扑,角度,力场参数,约束,组和修复)。 Moltemplate可以复制分子,对其进行自定义,然后用它作为构建更大、更复杂分子的基础。构建后,可以自定义...

元素魔方科研服务 2596

什么是优先级反转及解决方法

当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行类似死锁的情形发生。

动感超人_Crush 2万+

STM32项目分享:智能家居语音系统

(资料分享见文末)基于STM32的智能家居语音系统温湿度采集:系统通过DHT11模块采集温湿度烟雾监测:通过MQ-2模块采集环境中烟雾浓度光照强度采集:通过BH1750传感器采集环境光照强度窗帘控制:通过步进电机转动模拟窗帘控制风扇控制:通过继电器和指示灯模拟风扇驱动照明控制:通过继电器和指示灯模拟照明驱动蜂鸣器报警:环境烟雾异常情况下蜂鸣器报警OLED显示:显示温湿度、光照强度和烟雾浓度APP功能:使用机智云APP,包括功能有控制照明灯和风扇开关、显示当前温湿度信息。

qq_44016222的博客 4146

SVPWM分析、各个扇区详细计算以及Matlab仿真

SVPWM分析以及各个扇区详细计算以及Matlab仿真说明目的两电平逆变器拓扑空间矢量扇区判断扇区内如何发波?矢量作用时间计算矢量切换时间的计算Simulink仿真/基于Matlab-R2014a版本 说明 第一次发文章,不太会用Markdown,word编辑的公式复制过来有些是乱码,因此都贴图了。 另外,本文公式和图片比较多,编辑工作量比较大,比较辛苦,转载的话,请注明出处,谢谢。 目的 由于在...

michaelf的博客 12万+

freeRTOS — 信号量 与 优先级反转

在操作系统系统中,信号量通常用于控制对共享资源的访问和任务之间进行同步,信号量在操作系统中是很常用的,也是学习freeRTOS操作系统必须要掌握的。

weixin_43866583的博客 1310

新年美食鉴赏——基于注意力机制CBAM的美食101分类

新年美食鉴赏——基于注意力机制CBAM的美食101分类一、数据预处理1.数据集介绍2.读取标签3.统一命名4.整理图片路径5.划分训练集与验证集6.定义美食数据集二、注意力机制1.简介2.卷积块注意力网络——CBAM通道注意力模块CAM空间注意力模块SAM3.将通道、空间注意力模块合并三、基于卷积块注意力模块的ResNet-CBAM1.代码实现2.模型测试3.查看网络结构4.模型训练5.模型预测四、总结与升华个人简介 春节是一年当中最隆重、最盛大的节日,吃得最好的一餐可能就是年夜饭了,想想就很激动呢!随着新

zbp_12138的博客 1万+

FreeRTOS互斥信号量解决优先级翻转实战教程

通过本文的实践,我们清晰地看到了互斥信号量是如何通过优先级继承机制解决优先级翻转问题的。当高优先级任务等待低优先级任务持有的资源时,低优先级任务的优先级被临时提升,以防止中优先级任务抢占执行权。

Despacito0o的博客 1298

ESP32Servo库驱动SG90舵机:从入门到精准控制

本文详细介绍了如何使用ESP32Servo库驱动SG90舵机,从硬件连接到软件环境搭建,再到编写示例程序实现精准控制。内容涵盖库安装、基础驱动代码解析、舵机校准方法以及平滑运动控制,帮助开发者快速掌握ESP32控制舵机的核心技能,并提供了电源管理、信号抗干扰等实用避坑指南。

ik678901的博客 899

内存越界一定会导致程序崩溃吗?详解内存越界

本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。

dvlinker的技术专栏 2万+

二进制信号量和计数信号量源码分析

二进制信号量和计数信号量源码分析

weixin_72238916的博客 458

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

信号量导致优先级翻转的问题(以linux和RT-Thread为例)

今天在公司使用RT-Thread时发现它的信号量会导致优先级翻转的问题。所以根据官网的提醒,尽可能的使用互斥量。 因为下一个项目是linux的肯定会用到多线程,所以赶紧分析下是否linux的信号量会出现这个问题吗? 打开我用的linux版本linux-4.15中的linux-4.15\linux-4.15\kernel\locking...

qq_35570735的博客 1083

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

FreeRTOS笔记——14信号量

信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问当计数值大于0,代表有信号量资源;当释放信号量,信号量计数值(资源数)加1;当获取信号量,信号量计数值(资源数)减1;(信号量的计数值都有限制:限定最大值。如果最大值被限定为1,那么它就是二值信号量;如果最大值不是1,它就是计数型信号量。

m0_74375685的博客 903

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

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

FreeRTOS—优先级翻转问题

优先级翻转顾名思义就是:高优先级的任务变成最后执行,低优先级的任务反而优先执行。优先级翻转在抢占式内核中是很常见的问题,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破环任务的预期顺序,可能会导致未知的严重后果。在使用二值信号量的时候,经常会遇到优先级翻转问题。

m0_75103637的博客 696

FreeRTOS_信号量之互斥信号量

意思就是说:低优先级的任务获得互斥信号量,此时高优先级的任务无法访问获得互斥信号量,其他中等优先级的任务也无法获得互斥信号量,这样一来,低优先级任务就不能被中等优先级任务所打断,高优先级任务只需要等待低优先级任务释放互斥信号量即可,不用担心被其他的中等任务所打断;:低优先级任务正在使用互斥信号量,而高优先级任务请求使用互斥信号量,此时会临时的将低优先级任务的优先级提高到和高优先级任务一个层次,这时被提升上来的任务就不会被其他优先级任务所打断,最大程度保证高优先级任务尽快获得互斥信号量,提高系统的响应性能。

light_2025的博客 1821

FreeRTOS学习记录-优先级翻转

摘要:本文探讨了实时操作系统中使用二值信号量时出现的优先级翻转现象。当高、中、低优先级任务共享信号量时,低优先级任务长时间占用信号量会导致高优先级任务阻塞,而中优先级任务持续运行,形成优先级倒置。实验通过创建二值信号量和不同优先级任务,验证了这一现象:当中优先级任务运行时,低优先级任务被剥夺CPU使用权,直到释放信号量后高优先级任务才能执行,从而违背了预期的任务优先级顺序。

qq_45631231的博客 282

二值信号量和互斥锁到底有什么区别?

原文链接:https://www.cnblogs.com/codescrew/p/8970514.html 在说明之前我先抛出结论:互斥锁和二值信号量在使用上非常相似,但是互斥锁解决了优先级翻转的问题 假定我们现在有三个任务,task1,task2,task3,任务优先级task1最高,然后依次降低。我们知道在系统调度的时候当两个任务同时处于就绪态的时候,系统会优先执行优先级高的任...

zxh2075的专栏 1674

UCOS-III笔记(七)信号量

本文介绍了UCOS-III中的信号量机制,包括二值信号量、计数型信号量和互斥信号量。二值信号量用于同步问题,计数型信号量适用于事件计数和资源管理,而互斥信号量通过优先级继承解决优先级翻转问题。文章详细说明了各信号量的特点、使用流程和相关API函数,如OSSemCreate()、OSSemPost()、OSSemPend()等,并指出互斥信号量不能用于中断服务函数。通过具体示例解释了优先级翻转现象及其影响,帮助读者理解信号量的应用场景和实现方法。

道阻其长,未来可期。笔耕不辍,行则将至! 1693

FreeRTOS--信号量

在前面说过,FreeRTOS中说过信号量是基于队列实现的,所以二值信号量的本质是一个队列长度为 1 的队列 ,该队列就只有空和满两种情况。二值信号量通常用于互斥访问或任务同步, 与互斥信号量比较类似,但是二值信号量有可能会导致优先级翻转的问题 ,所以二值信号量更适合用于同步!2. API函数函数描述()使用动态方式创建二值信号量()使用静态方式创建二值信号量()释放信号量()在中断中释放信号量()获取信号量()在中断中获取信号量计数型信号量相当于队列长度大于1 的队列。

2301_80394926的博客 1307
上一篇: mos管GS之间的电阻的作用?
下一篇: 关于信号量的使用总结
wtbcx2012
博客等级 码龄14年 26粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值