嵌入式开发学习日志53——互斥量

互斥信号量,也成为互斥量,是一种特殊的二值信号量。也就是说,在创建时互斥量有且只有一个,一般它会被用于临界资源的保护。

何为临界资源?通俗点说,就是有且只有一个的资源,一旦它被某个任务占据,其他任务就需要等待这个资源被释放后才能使用,而这又可以称作互斥访问。

互斥量正适合于这样的场合。由于互斥量仅有一个,那么对于那些想要使用某个临界资源的任务来说,只有最高优先级的会被分配到互斥量,此时其他任务由于没有互斥量,所以只能进入阻塞状态,等待该任务释放资源。

那么有人要问了,既然都是一个,为什么不直接用二值信号量来保护临界资源呢?

前面就说了,互斥量是一种特殊的二值信号量,这个特殊之处,就是互斥量脱颖而出的关键所在------它具有优先级继承机制

但是谈论优先级继承之前,还需要了解一个概念,叫做**优先级翻转。**这名字一听就知道不是什么好东西,而事实也确实如此。很多情况下,有的资源被设置为仅有一份,而此时若一个低优先级任务正在使用该资源,那么不好意思,即使你优先级再高的任务也得在后面给我乖乖排队,只有低优先级任务释放资源后,高优先级任务才能使用。

更糟糕的是,若在高优先级任务阻塞期间,有一个中优先级任务就绪,而这个任务还不需要用到这个资源,那么不好意思,这个低优先级任务要被打断,将CPU使用权交给中优先级任务。等中优先级任务执行完后,低优先级任务继续执行,直到资源释放给高优先级任务,此时高优先级任务等待时间将会更长。

而我们知道,优先级这东西在一开始就已经定好,越重要越紧急的任务往往优先级就会越高,往往也会优先执行。那么此时一个不那么重要的任务打断了本该执行的高优先级任务,使得阻塞时间过长,这对系统会是一个灾难。

而优先级继承机制将这个翻转的危害降到了最低(并非完全解决)。它的机制就是将占据某种资源的低优先级任务的优先级暂时抬高,提高到等待这个资源的高优先级任务的优先级,这样即使中途有中优先级任务就绪也无法抢占CPU,而当这个任务执行完释放资源后,优先级又会恢复到一开始的级别,此时高优先级任务就可以使用了。这种机制极大缩短了高优先级任务的阻塞时间。

经过上述历程可以看出,互斥量十分适合应用于多任务环境下对于临界资源的保护,而多任务也是操作系统的灵魂。

相关推荐
Harm灬小海2 分钟前
【云计算学习之路】学习Centos7系统:Linux磁盘管理
linux·运维·服务器·学习·云计算
三品吉他手会点灯5 分钟前
C语言学习笔记 - 41.数据类型 - scanf函数核心知识点复习
c语言·开发语言·笔记·学习
存在的五月雨10 分钟前
JVM 入门学习笔记(内存模型 / GC / 类加载机制)
jvm·笔记·学习
什么半岛铁盒12 分钟前
LangChain常用组件学习
学习·microsoft·langchain
安生生申14 分钟前
uni-app 连接 JDY-31 蓝牙串口模块实践
c语言·前端·javascript·stm32·单片机·嵌入式硬件·uni-app
happymaker062615 分钟前
SpringBoot学习日记——DAY04(整合junit,myBatis)
spring boot·学习·junit
Restart-AHTCM19 分钟前
LangChain学习之模型 I/O 与输出解析器 (Output Parsers)(3/8)
前端·学习·langchain
windawdaysss19 分钟前
离线学习SQL和数据库的工具及其部署
数据库·sql·学习
番茄灭世神21 分钟前
Vscode开发/调试ARM单片机最新教程
c语言·arm开发·vscode·stm32·嵌入式·gd32
吃好睡好便好9 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab