怎么理解优先级翻转

简介: 怎么理解优先级翻转

使用信号量会导致的另一个潜在问题是线程优先级翻转问题。

1. 优先级翻转的概念

所谓优先级翻转,即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,实时性难以得到保证。

 

如下图所示:有优先级为 A、B 和 C 的三个线程,优先级 A> B > C。

1)线程 A,B 处于挂起状态,等待某一事件触发,线程 C 正在运行,此时线程 C 开始使用某一共享资源 M。

2)在使用过程中,线程 A 等待的事件到来,线程 A 转为就绪态,因为它比线程 C 优先级高,所以立即执行。但是当线程 A 要使用共享资源 M 时,由于其正在被线程 C 使用,因此线程 A 被挂起切换到线程 C 运行。

3)如果此时线程 B 等待的事件到来,则线程 B 转为就绪态。由于线程 B 的优先级比线程 C 高,同时线程B不需要去访问共享资源M,因此线程 B 开始运行,直到其运行完毕,线程 C 才开始运行。

4)只有当线程 C 释放共享资源 M 后,线程 A 才得以执行。在这种情况下,优先级发生了翻转:线程 B 先于线程 A 运行。这样便不能保证高优先级线程的响应时间。

 

2. RT-Thread中用互斥量的方式解决优先级翻转问题

在 RT-Thread 操作系统中,互斥量可以解决优先级翻转问题,实现的是优先级继承算法。

优先级继承是通过在线程 A 尝试获取共享资源而被挂起的期间内,将线程 C 的优先级提升到线程 A 的优先级别,从而解决优先级翻转引起的问题。这样能够防止 C(间接地防止 A)被 B 抢占,如下图所示。优先级继承是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。

相关文章
|
9月前
|
Web App开发
奇怪的间隙和垂直对齐问题
奇怪的间隙和垂直对齐问题
31 2
|
9月前
|
C语言
C语言第四十四弹---调整奇偶数顺序
C语言第四十四弹---调整奇偶数顺序
|
编译器
【逻辑位移和算数位移】
【逻辑位移和算数位移】
121 0
|
算法
为什么我们总是习惯采用:向下调整来建堆?(向上建堆和向下建堆的区别)
为什么我们总是习惯采用:向下调整来建堆?(向上建堆和向下建堆的区别)
166 0
如何解决代码在IE6下的双倍边距问题?底层原理是什么?
如何解决代码在IE6下的双倍边距问题?底层原理是什么?
112 0
翻转单词顺序(简单难度)
翻转单词顺序(简单难度)
92 0
翻转单词顺序(简单难度)
|
前端开发
伪类选择器设置奇偶数标签(1+X Web前端开发 例题)
伪类用于定义元素的特殊状态。 例如,它可以用于:设置鼠标悬停在元素上时的样式,为已访问和未访问链接设置不同的样式,设置元素获得焦点时的样式
255 0
伪类选择器设置奇偶数标签(1+X Web前端开发 例题)
7-59 翻转单词顺序 (20 分)
7-59 翻转单词顺序 (20 分)
85 0
|
算法
【刷算法】孩子们的游戏(圆圈中最后剩下的数)
【刷算法】孩子们的游戏(圆圈中最后剩下的数)
114 0
|
算法
【刷算法】调整数组顺序使奇数位于偶数
【刷算法】调整数组顺序使奇数位于偶数