【C# 线程】优先级反转与优先级继承

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了【C# 线程】优先级反转与优先级继承脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

【C# 线程】优先级反转与优先级继承

    T0时刻,Thread1运行,并获得同步资源SYNCH1;    T1时刻,Thread2开始运行,由于优先级高于Thread1,Thread1被抢占(未释放同步资源SYNCH1),Thread2被调度执行;    T2时刻,Thread3抢占Thread2;    T3时刻,Thread3需要同步资源SYNCH1,但SYNCH1被更低优先级的Thread1所拥有,Thread3被挂起等待该资源    而此时线程Thread2和Thread1都处于可运行状态,Thread2的优先级大于Thread1的优先级,Thread2被调度执行。最终的结果是高优先级的Thread3迟迟无法得到调度,而中优先级的Thread2却能抢到CPU资源。上述现象中,优先级最高的Thread3要得到调度,不仅需要等Thread1释放同步资源(这个很正常),而且还需要等待另外一个毫不相关的中优先级线程Thread2执行完成(这个就不合理了),会导致调度的实时性就很差了。什么是优先级继承优先级继承就是为了解决优先级反转问题而提出的一种优化机制。其大致原理是让低优先级线程在获得同步资源的时候(如果有高优先级的线程也需要使用该同步资源时),临时提升其优先级。以前其能更快的执行并释放同步资源。释放同步资源后再恢复其原来的优先级。

【C# 线程】优先级反转与优先级继承

 与上图相比,到了T3时刻,Thread3需要Thread1占用的同步资源SYNCH1,操作系统检测到这种情况后,就把 Thread1的优先级提高到Thread3的优先级。此时处于可运行状态的线程Thread2和Thread1中,Thread1的优先级大于Thread2的优先级,Thread1被调度执行。Thread1执行到T4时刻,释放了同步资源SYNCH1,操作系统恢复了Thread1的优先级,Thread3获得了同步资源SYNCH1,重新进入可执行队列。处于可运行状态的线程Thread3和Thread2中,Thread3的优先级大于Thread2的优先级,所以Thread3被调度执行。    通过优先级继承机制,可以有效解决优先级反转问题,使优先级最高的Thread3获得执行的时机提前。

现实举例:

1.当年火星探路者号(Mars Pathfinder),就由于,此处所说的,优先级反转,而导致了内部执行逻辑出错的bug:

在1997年7月4号发射后,在开始搜集气象数据之后没几天,系统(无故)重启了。

后来,当然,被相关技术人员找到问题根源,就是,这个优先级反转所导致的,然后修复了此bug。

脚本宝典总结

以上是脚本宝典为你收集整理的【C# 线程】优先级反转与优先级继承全部内容,希望文章能够帮你解决【C# 线程】优先级反转与优先级继承所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: