5267|10

420

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

mutex(互斥锁)不为人知的秘密 [复制链接]

读此篇文章之前必须事先已经理解了优先级反转,以及如何解决优先级反转的理念,不然下面理论无法理解。
先看一个例子,假设有task 1, task 2task 3,优先级分别为5, 20, 25, 数字越小代表任务优先级越高。假设采用ucos 3的优先级继承的方式解决优先级反转。
下面的例子中涉及到的锁有mutex_1以及mutex_2
void task1()
{
       mutex_1_get();                      (1)
       /*do something*/                   (2)
       mutex_1_free();                     (3)
}
void task2()
{
       mutex_1_get();                      (4)
       mutex_2_get();                      (5)
       /*do something*/                    (6)
       mutex_2_free();                      (7)
       mutex_1_free();                     (8)
}
void task3()
{
       mutex_2_get();                      (9)
       /*do something*/                    (10)
      mutex_2_free();                      (11)
}


假设task 1以及task 2处于等待事件状态,处于阻塞状态。task 3 会首先运行,当task 3运行到(10)处的时候,任务task2被中断唤醒,然后接着运行task2task 2 (4)处获得mutex_1, task 2运行到(5)处时因为得不到mutex_2会被阻塞,按照ucos 3理念,为了解决优先级反转,task 3的优先级被task2 25拉升到20task 2阻塞的时候,接着task1 被中断唤醒然后task 1 开始运行,当task1 运行到(1)处的时候因为得不到mutex_1所以会被阻塞,按照ucos 3理念,为了解决优先级反转,task2的优先级被task1 20拉升到5。然后继续返回task3运行(10)处。


这个时候我们来分析一下各个任务的优先级情况,task 1 5task25 task 320。这一切貌似都天衣无缝,有的读者已经想到有点什么不对头了。task 3(10)处继续运行的时候会被其他任意优先级为5-19的任务可以随便抢占,如果有一个task 4优先级为15,可以随时打断task 3 的运行,到时再返回task 3运行到(11)处的时候,task 1task 2 的等的黄花菜都凉了,本质上这个还是一个优先级反转的问题。


目前的rtos大部分都存在此类问题,包括当家花旦ucos 3。那应该怎么解决问题呢?解决方式只有在task 1处因为得不到mutex_1会被阻塞的时候,task 1除了要拉升task 2的优先级为5还要拉升task 3 的优先级到5 !此处是关键!只有task 3 被拉升到优先级5了才能保证不被任意优先级为5-19的任务抢占,能够最快的让task 2以及task 1运行。
上面的例子使用raw-os能够复现此问题,而且能很好地解决这个问题。Ucos 3 mutex锁还有更多的问题,此处省略1000字。


[ 本帖最后由 jorya_txj 于 2013-12-19 12:01 编辑 ]

最新回复

分析的真不错哦{:soso_e142:}  详情 回复 发表于 2014-1-14 08:29
点赞 关注(1)

回复
举报

272

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
顶。。。。    很不错
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
文章改了几次。看懂的人还是不少的。

点评

楼主确实好文章。赞一个先。:carnation: 所以优先级和资源竞争的问题,更多的需要在设计上进行合理的规划,力求避免这样的问题发生。 话说回来,其实很多时候,优先级反转还是只算个理论问题,发生在理论研究  详情 回复 发表于 2013-12-20 10:25
 
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

4
 
好呢谢‘
 
 
 

回复

603

帖子

1

TA的资源

纯净的硅(中级)

5
 

回复 板凳jorya_txj 的帖子

楼主确实好文章。赞一个先。:carnation:

所以优先级和资源竞争的问题,更多的需要在设计上进行合理的规划,力求避免这样的问题发生。

话说回来,其实很多时候,优先级反转还是只算个理论问题,发生在理论研究下对于实际应用意义不是太大的场景。实际真实应用的时候,通常应选择禁止低优先级任务霸占高优先级的资源,从设计上绕开此问题,以避免反转的危机。
例如楼主的例子,Task2做了一件错事,那就是它先霸占了高优先级的资源,然后去请求低优先级的资源,真正应用时,至少应当把这个过程改正过来,这样Task3就不会卡住Task1了。如果确实因为某些原因必须用这样的顺序获取资源,那也需要通过一些设计来调整两个资源请求的耦合关系,避免因为低优先级的事件而耽误高优先级的任务。

教科书上经常引用诸如锅炉爆炸的事情说事,实际上锅炉从警戒压力到爆炸压力,一定不会是瞬间的事(给锅炉规定警戒压力时肯定要考虑这个问题,不会把警戒压力规定成比爆炸压力小一点点点的值),就是这样的时间差,往往要保证即使我们有一点点点的动作迟延,也不会有任何的危害。我们要做的就是,即使有优先级反转的问题,也要能够及时的自我恢复而不影响大局,这就是实时的意义,实时其实给你时间纠正错误,而不是完全不允许犯错。

最近看了好多宇宙旅行的电影……反倒是空间旅行的时候由于速度太快(谁知道怎么搞的),给你纠正错误的时间会很短暂,否则很容易就坐过站了,不知道能不能来得及纠正错误呢……
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

6
 
楼上说的很对,99%的错误都是设计阶段引入的,引导用户正确的去设计基于rtos,是重中之重。
 
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

7
 
谢谢分享~
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

8
 
很有价值的讨论
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
xianxuexil
 
 
 

回复

1972

帖子

0

TA的资源

五彩晶圆(初级)

10
 
看得一知半解,任务优先级的分配真的很重要哇
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(初级)

11
 
分析的真不错哦{:soso_e142:}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表