博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
信号量优先级反转(翻转)与优先级继承
阅读量:2031 次
发布时间:2019-04-28

本文共 918 字,大约阅读时间需要 3 分钟。

《Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转》

什么是优先级反转(翻转)

优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即:

高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。-- 从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。

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

一个具体的例子:

假定一个进程中有三个线程Thread1(高)、Thread2(中)和Thread3(低),考虑下图的执行情况。

优先级反转实例图示
  • T0时刻,Thread3运行,并获得同步资源SYNCH1;
  • T1时刻,Thread2开始运行,由于优先级高于Thread3,Thread3被抢占(未释放同步资源SYNCH1),Thread2被调度执行;
  • T2时刻,Thread1抢占Thread2;
  • T3时刻,Thread1需要同步资源SYNCH1,但SYNCH1被更低优先级的Thread3所拥有,Thread1被挂起等待该资源
  • 而此时线程Thread2和Thread3都处于可运行状态,Thread2的优先级大于Thread3的优先级,Thread2被调度执行。最终的结果是高优先级的Thread1迟迟无法得到调度,而中优先级的Thread2却能抢到CPU资源。

上述现象中,优先级最高的Thread1要得到调度,不仅需要等Thread3释放同步资源(这个很正常),而且还需要等待另外一个毫不相关的中优先级线程Thread2执行完成(这个就不合理了),会导致调度的实时性就很差了。

什么是优先级继承

优先级继承就是为了解决优先级反转问题而提出的一种优化机制。其大致原理是让低优先级线程在获得同步资源的时候(如果有高优先级的线程也需要使用该同步资源时),临时提升其优先级。以前其能更快的执行并释放同步资源。释放同步资源后再恢复其原来的优先级。

 

 

 

 

 

 

 

 

转载地址:http://lvvaf.baihongyu.com/

你可能感兴趣的文章
scala函数
查看>>
Scala集合
查看>>
defer
查看>>
init函数和匿名函数
查看>>
函数参数的传递方式和变量作用域
查看>>
字符串函数
查看>>
时间和日期相关函数
查看>>
Go错误处理机制及自定义错误
查看>>
内置函数
查看>>
数组和切片4
查看>>
数组和切片1
查看>>
Scala隐式转换
查看>>
Scala函数高级操作
查看>>
Scala操作外部数据
查看>>
索引及explain
查看>>
硬盘测试
查看>>
排序和查找2
查看>>
排序和查找1
查看>>
Map1
查看>>
排序和查找3
查看>>