搜索
bottom↓
回复: 13

mutex(互斥锁)不为人知的设计秘密

[复制链接]

出0入0汤圆

发表于 2013-12-22 21:17:06 | 显示全部楼层 |阅读模式
本帖最后由 lulu爱 于 2013-12-22 21:51 编辑

了解下面的内容必须事先已经理解了优先级反转,以及如何解决优先级反转的理念,不然下面理论将无法理解。

先看一个例子,假设有task 1, task 2,task 3,优先级分别为5, 20, 25, 数字越小代表任务优先级越高。假设采用一些现有的rtos的优先级继承的方式解决优先级反转。
下面的例子中涉及到的锁有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 会在(9)处得到mutex_2, 当task 3运行到(10)处的时候,任务task2被中断唤醒,然后中断退出后开始运行task2,task 2 在(4)处获得mutex_1, 当task 2运行到(5)处时因为得不到mutex_2会被阻塞,按照ucos 3理念,为了解决优先级反转,task 3的优先级被task2 从25拉升到20。task 2阻塞的时候,接着task1被中断或者其它任务唤醒,然后task 1 开始运行,当task1 运行到(1)处的时候因为得不到mutex_1所以会被阻塞,按照一些现有的rtos理念,为了解决优先级反转,task2的优先级被task1 从20拉升到5。然后继续返回task3运行(10)处。

这个时候我们来分析一下各个任务的优先级情况,task 1 为5,task2为5, task 3为20。这一切貌似都天衣无缝,有的读者已经想到有点什么不对头了。task 3在(10)处继续运行的时候会被其他任意优先级为5-19的任务可以随便抢占,如果有一个task 4优先级为15,可以随时打断task 3 的运行,到时再返回task 3运行到(11)处的时候,task 1和task 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运行。

这个问题主要的原因出现在task 2 的设计这边,task2 在占有了task 1的共享资源的同时在没有释放的前提下又去霸占task 3 的共享资源,间接地导致task1和task3扯到一起了。

解决方式一:

task 2 的设计方式可以如下:
void  task2()
{
        mutex_1_get();
                    
        /*do something*/
        mutex_1_free();                     

        mutex_2_get();                     

        /*do something*/                    

        mutex_2_free();                     

}

以上的设计避免了同时获得多块共享资源,直接解决了问题。

如果task 2 必须是之前的顺序,那该如何?

解决方式2:
既然task 2 牵扯到了task 1以及task 3, 那大家一起加同样的大锁mutex_1。
task 3 的代码如下:

void task3()
{
        mutex_1_get();

        mutex_2_get();                     

        /*do something*/                    

mutex_2_free();  

mutex_1_free();                     

}

通过以上的代码也彻底解决了这样的问题。

让我们来总结下,出问题的原因,当一个任务获得了临界区资源的锁,在没有释放这个锁的前提下又去获得另外一块临界区资源,这个时候就要引起足够的注意了,设计成败在于你是否彻底理解了之前的问题。

很多时候这种问题防不胜防,因为加锁的过程是在底层一个公用函数里面实现的,这个时候对于系统任务的设计要求就相当高了。有的人可能会说,这种出现的概率太低了,可以无视,但是对于一个系统设计者来说,这样的问题是头等的大事,无论如何必须要去解决,因为无法闭着眼睛不去正视这样的问题。

raw-os这边解决了此类问题,但是也会付出一定的代价,内核内部采用递归的方式来解决这个问题,对于上面的问题,内核会递归2层,会消耗100字节的栈。递归一层会消耗50个字节的资源。栈空间普遍设置是1K以上。如果在非常恶劣的情况下,假设10个任务会牵连出10个这样不同的锁,那递归深度就会到10层,会消耗栈500字节的代价。但是问题是这样的设计除非是人为刻意的,遇到这种10层递归的概率是0。即使遇到,500个字节的栈空间损耗也是能扛得住的,所以可以忽略此问题。

但是归根到底这样的问题还是要求用户在设计阶段去避免,一个系统不可能是万能的,正确的设计才是最重要的。

www.raw-os.org

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-12-22 21:45:32 | 显示全部楼层
这是沙发么

出0入0汤圆

 楼主| 发表于 2013-12-22 21:54:00 | 显示全部楼层
是沙发,恭喜你了。

出0入0汤圆

发表于 2013-12-22 21:54:26 | 显示全部楼层
楼主是raw os作者吗

出0入0汤圆

 楼主| 发表于 2013-12-22 22:02:53 | 显示全部楼层
是raw-os爱好者。

出0入0汤圆

发表于 2013-12-23 00:20:43 | 显示全部楼层
嗯,楼主想问题很全面啊。这个问题倒是没意识到,标记一下吧。

出0入0汤圆

发表于 2013-12-28 10:02:36 来自手机 | 显示全部楼层
楼主总结的不错,学习了

出0入0汤圆

发表于 2013-12-28 10:06:38 | 显示全部楼层
学习学习。
      
      

出0入0汤圆

发表于 2013-12-28 11:04:50 | 显示全部楼层
本帖最后由 twitter 于 2013-12-28 11:05 编辑

在内核里搞递归不是个好事,这种还是用一个公用的锁来实现优先级继承,在效率和空间占用上最好。
写RTOS应用的,本来就对编程者要求不低的。

出0入0汤圆

发表于 2013-12-28 16:02:12 | 显示全部楼层
学习了,谢谢分享         

出0入0汤圆

发表于 2013-12-28 20:34:41 | 显示全部楼层
用过,没有详细看原理。

出0入0汤圆

发表于 2013-12-28 23:31:30 来自手机 | 显示全部楼层
先马再看,对不起拖延症又犯了

出0入0汤圆

发表于 2016-4-1 09:12:38 | 显示全部楼层
总结不错

出0入10汤圆

发表于 2016-4-1 09:35:57 | 显示全部楼层
写得很好,其实这些问题才是应该注意的,因为这些问题出现的概率低,并且不容易排查。
最近也有种预感自己程序出现的bug可能是因为这个原因。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 02:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表