优先级反转(Priority Inversion)

优先级反转:原理、危害与解决方案——以 FreeRTOS 优先级继承机制为例 优先级反转是指。 阅读详情

优先级反转 是 实时操作系统(RTOS) 和 多任务并发 里经常遇到的经典问题。 

有一个实际案例是 NASA 的 火星探路者号(Mars Pathfinder, 1997年) 就因为 优先级反转的bug 导致系统多次重启,最后NASA工程师远程上传了“优先级继承协议”补丁, 才解决问题。

一. 什么是优先级反转

现象是:

当一个  低优先级任务  正在执行, 这时 一个高优先级任务 需要马上运行。但是高优先级的任务因为必须等待 低优先级的任务释放某种资源(比如共享数据、设备等),而 低优先级任务又被一个中优先级的任务抢占,从而导致高优先级任务实际上以低优先级的速度运行,整个系统的优先级调度秩序被“反转”了的异常情况。

二. 具体例子

假设系统里有三个任务:

  • 高优先级任务 H:实时性要求高(比如传感器采样)。

  • 中优先级任务 M:普通任务(比如日志处理)。

  • 低优先级任务 L:后台任务(比如数据打包)。

场景:

  1. 任务 L 占用了一个共享资源(比如串口、互斥锁)。

  2. 任务 H 运行时也需要这个资源,于是 被阻塞,等待 L 释放。

  3. 这时任务 M 就绪,它优先级比 L 高 → CPU 把时间片给 M。

  4. 结果:L 没机会释放资源 → H 只能干等 → 系统错过实时期限。

这就是 优先级反转。

三. 解决办法

  • 优先级继承 (Priority Inheritance Protocol, PIP)    ✅ 常用

    • 当低优先级任务 L 占用资源,而高优先级任务 H 在等待时 → 临时把 L 的优先级提升到 H 的级别,直到 L 释放资源。

    • 这样 M 就不会插队。

  • 优先级上限 (Priority Ceiling Protocol, PCP)

    • 给每个资源分配一个优先级上限。

    • 占用资源的任务会自动提升到该上限,避免被中间优先级任务打断。

  • 避免共享资源 / 锁粒度太大

    • 尽量减少临界区。

    • 使用无锁算法(lock-free)、消息队列代替互斥锁。

下面是优先级继承的一个实现的示例:

在 RTOS 里,互斥锁 (mutex) 是支持优先级继承的核心。
当一个任务尝试获取 mutex 时:

  1. 如果 mutex 空闲 → 直接获取。

  2. 如果 mutex 已被低优先级任务持有 → 高优先级任务会阻塞。

  3. RTOS 检测到 高优先级任务在等待 → 临时提升持有者的优先级。

数据结构示例:

typedef struct Task {
    int base_priority;     // 任务的原始优先级
    int current_priority;  // 任务的当前优先级(可能被提升)
    bool waiting;          // 是否在等待资源
    // ... 其他任务控制块信息 (TCB)
} Task;

typedef struct Mutex {
    Task* owner;           // 当前持有该锁的任务
    Queue waiting_list;    // 等待该锁的任务队列
} Mutex;

带优先级继承的mutex加锁 和 解锁:

void mutex_lock(Mutex* m, Task* t) {
    if (m->owner == NULL) {
        // 锁空闲,直接获取
        m->owner = t;
    } else {
        // 锁被占用
        enqueue(&m->waiting_list, t);
        t->waiting = true;

        // 优先级继承逻辑
        if (t->current_priority > m->owner->current_priority) {
            m->owner->current_priority = t->current_priority;
            // 可能需要触发调度器重排任务
            scheduler_reschedule();
        }
    }
}

void mutex_unlock(Mutex* m, Task* t) {
    if (m->owner != t) {
        // 非法解锁
        return;
    }

    if (!is_empty(&m->waiting_list)) {
        // 有任务在等待
        Task* next = dequeue(&m->waiting_list);
        m->owner = next;
        next->waiting = false;
    } else {
        // 没有等待者,锁空闲
        m->owner = NULL;
    }

    // 恢复优先级
    t->current_priority = t->base_priority;
    scheduler_reschedule();
}

调度器如何配合:
调度器需要根据current_priority选任务,而不是 base_priority

Task* scheduler_pick_next() {
    // 在就绪队列中找 current_priority 最高的任务
    Task* best = find_highest_priority_task(ready_queue);
    return best;
}

执行过程示例:

  1. 低优先级 L 获取了 mutex。

    owner = L,L 的 current_priority = 1。
  2. 高优先级 H 试图获取 mutex,被阻塞。

    • H 进入 waiting_list。

    • 检查:H.priority (3) > L.priority (1) → 提升 L.current_priority = 3。

  3. 调度器运行 → L(临时优先级=3)继续运行 → 完成任务并释放 mutex。

  4. 解锁时 → H 被唤醒,L 恢复 base_priority=1。

四. 优先级继承总结

  • 互斥锁记录拥有者。

  • 当高优先级任务等待时,提升持有者优先级。

  • 调度器依据 current_priority 运行任务。

  • 释放锁后恢复优先级。

优先级反转问题及解决办法 优先级反转,是指在多线程的环境下,并且使用了信号量时,可能会出现的这样一种不合理的现象,即:高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。具体来说:当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行类似死锁的情形发生。 阅读详情

相关推荐

【RTOS面试题】什么是优先级反转

如果任务 B 持有一个资源锁,而任务 C 需要这个锁,这时任务 C 就会等待任务 B 释放锁。此时,如果更高优先级的任务 A 启动并准备运行,但由于任务 B 持有着资源锁,任务 A 无法获取这个锁,因此也无法执行,这就导致了优先级反转——即高优先级的任务 A 被较低优先级的任务 B 阻塞了。这个问题通常发生在多个任务共享一个资源(如一个互斥锁或信号量)时,低优先级的任务意外地阻塞了高优先级的任务。通过合理的设计和选择合适的解决方案,可以有效避免这个问题的发生,保证系统的稳定性和可靠性。

小超嵌入式笔记 1007

什么是优先级反转及解决方法

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

动感超人_Crush 2万+

【iOS】优先级反转

什么是优先级反转?优先级反转指的是一个低优先级的任务持有了一个共享资源的锁,而高优先级的任务获取锁的时候被阻塞,此时中间优先级的任务运行并抢占了CPU执行,导致高优先级的任务被反转到中间优先级的任务之后运行。iOS中如何避免或解决优先级反转问题?优先级继承:确保持有锁的低优先级任务提升到高优先级任务的级别,知道锁被释放,然后恢复到原来的级别。(记录了锁的持有者的api都可以自动避免优先级的反转,系统会通过提高线程的优先级来解决反转问题,如dispatch_sync)

2501_91546205的博客 254

【整理】什么是优先级反转+有何危害+如何避免和解决

背景 很早之前,学习操作系统原理时,在进程调度时,就听说过: 优先级反转 后来在了解ucOS/II时,又遇到过。 之前,也大概了解过,但是基本上是半懂不懂的。 最后又看到这个优先级反转。 所以打算去整理一下 什么是优先级反转 优先级反转,英文是priority inversion,也有其他叫法: 优先级倒置 优先级逆转 优先级翻转 先要明白背景知识: 1.操作系统的任务调度 操作系统有多个任务 任务之间谁可以得到执行,是通过任务调度来完成的 2.任务调度有多种方法(..

u014426028的博客 1万+

oVirt 4.4.10超详细安装指南:从零搭建企业级虚拟化环境(附常见错误排查)

本文提供了oVirt 4.4.10企业级虚拟化平台的超详细安装指南,涵盖环境规划、系统准备、Engine安装配置、计算节点部署、存储系统集成及高级运维技巧。通过实战操作手册和常见错误排查方法,帮助用户从零搭建稳定高效的虚拟化环境,特别适合企业IT管理员参考实施。

wasm7browser的博客 351

搞定安卓11+抓包难题:用Kitsune Mask、magic_overlayfs和LSPosed三件套绕过SSL Pinning(保姆级教程)

本文详细解析了安卓11+系统中抓包面临的核心挑战,包括SSL Pinning和Root检测机制,并提供了使用Kitsune Mask、magic_overlayfs和LSPosed三件套的完整解决方案。通过动态分区技术解析和工具链配置,帮助开发者绕过安全限制,实现高效抓包分析。

weixin_42665255的博客 442

优先级反转

简介 优先级反转 英文名叫做 Priority Inversion,一句话概括它的意思:低优先级任务要比高优先级任务先执行。 先明白一些背景知识 1.操作系统是多任务的 2.任务之间谁都可以得到执行,是通过任务调度来完成 3.任务调度有多种算法,常见的有: 罗宾环调度算法:Round-robin scheduling algorithm 基于优先级的调度算法:Priority-controll...

VictorZhang 2757

从0到1:.NET 9 OpenAPI全攻略!Swagger vs Scalar UI谁更强?

OpenAPI:.NET 9的智能文档革命 本文深入解析.NET 9的OpenAPI支持,对比Swagger UI与Scalar UI的优劣,提供实战代码示例: 一键生成:AddOpenApi()+MapOpenApi()快速生成标准文档 UI工具对决: Swagger UI功能全面但复杂 Scalar UI简约现代,原生支持cURL/HTTPie 进阶技巧: XML注释增强文档可读性 自定义Transformer实现文档动态修改 🔥核心价值:.NET 9的OpenAPI方案显著降低API文档维护成本,开

java专栏 1428

什么是的优先级反转(Priority Inversion) 和 优先级继承(Priority Inheritance)?

摘要:优先级反转(Priority Inversion)指高优先级线程因中优先级任务抢占锁持有者(低优先级线程)而被阻塞。**优先级继承(Priority Inheritance)**通过临时提升低优先级线程的优先级,确保其快速释放锁,避免高优先级线程无限等待。对比案例显示,该机制将高优先级线程等待时间从35单位缩短至15单位。适用于实时系统,但存在链式反转风险和内核依赖。核心思想是通过动态优先级调整平衡确定性与性能。

qq_33775774的博客 537

EfficientNet中的MBConv模块详解:为什么它能如此高效?

本文深度解析了EfficientNet中的MBConv模块,详细介绍了其核心设计理念、效率优化技术和复合缩放理论。MBConv通过深度可分离卷积、倒残差结构和注意力机制三大关键技术,实现了计算效率与模型性能的平衡,成为高效网络结构设计的典范。

tcp8optimizer的博客 352

【Bug已解决】Codex 切换 model_provider 后历史会话消失的解决方案

方案适用场景推荐指数切回原 provider 验证排查的第一步,确认数据是否真的丢失⭐⭐⭐⭐⭐查看本地会话文件进一步确认数据完整性⭐⭐⭐⭐⭐查阅跨 provider 恢复命令官方是否提供了对应功能⭐⭐⭐使用社区辅助工具需要频繁切换 provider 的场景⭐⭐⭐定期备份配置目录任何场景下的通用保险措施⭐⭐⭐⭐切换后历史会话"消失"的本质是客户端的会话列表展示逻辑受当前活跃 provider 状态过滤,而不是原始数据文件被真正删除。

一键难忘的博客 6001

Android性能分析优先级反转Priority Inversion

主线程 / UI Thread优先级高,应该优先获得 CPU主线程↓发起后台低优任务↓主线程同步等待结果↓后台任务因为优先级低抢不到 CPU↓后台任务迟迟不返回↓主线程一直阻塞↓前台应用卡顿 / 掉帧 / ANR高优先级的主线程,被一个低优先级后台任务反向卡住。这就是典型的。

Zhang Phil 228

美团mtgsig 1.2算法分析

mtgsig1.2的一些算法总结

记录一些web逆向的过程 3502

线程优先级反转与继承(priority inversion and priority inheritance)

简而言之,优先级反转是线程访问内存资源时出现的一种问题,而优先级继承是其一种解决方法。 下面以一个实例进行说明: 如上图所示:假设我们有一个高优先级的任务和一个低优先级的任务,两个任务都需要访问临界区(critical section),当低优先级任务已经在临界区并上锁,并且需要获得cpu资源,而此时高优先级也需要访问临界区,需要等待低优先级任务退出临界区。 如果高优先级任务在等待的时候,有一个中优先级任务将低优先级任务的cpu资源剥夺了,则低优先级任务必须等待中优先级任务释放cpu资源才能.

Stay hungry,stay young 893

Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图

其中,阵列方向图是评价阵列性能的重要参数之一。均匀面阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个圆盘。均匀线阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个矩形。本文将采用Matlab进行仿真,分别实现均匀面阵方向图、均匀线阵方向图和均匀圆阵方向图,并对三种阵列进行比较分析。通过以上代码仿真,我们可以对均匀面阵、均匀线阵和均匀圆阵进行方向图的绘制,进一步分析不同阵列在天线性能方面的差异。Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图。

2301_79326857的博客 3436

15、z/OS 优化配置与迁移实践

本文详细探讨了z/OS环境的优化配置与迁移实践,涵盖DASD存储库管理、用户目录更新、环境更新意义以及不同场景下的迁移案例。通过单笔记本系统和服务器级机器的实例,展示了迁移流程和关键要点,包括DASD文件创建、设备映射更新、系统重启初始化以及数据备份等步骤。文章还总结了迁移过程中的注意事项,并展望了未来z/OS优化的发展趋势,为z/OS系统的稳定运行和高效管理提供了实用指导。

zzz56的博客 129

线程调度的问题:Lock Convoy(锁封护)与Priority Inversion(优先级反转)

Lock Convoy(锁封护)   [1]Lock Convoy是在多线程并发环境下由于锁的使用而引起的性能退化问题。当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lock convoy问题,一般而言,lock convoy并不会像deadlock或livelock那样造成应用逻辑停止不前,相反地,遭受lock convoy的系统或应用程序仍然往前运行,但是,由于线程们频繁...

bandilan2400的博客 522

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

4.1 阻塞与优先级反转

在提供的文件中给出的例子中,出现了一个情况:低优先级任务(任务Z)锁定了资源,然后高优先级任务(任务A)准备运行并立即抢占了任务Z。中间优先级任务占用处理器:由于高优先级任务正在等待资源释放,这时如果有一个或多个中等优先级的任务准备运行,它们将获得处理器的控制权,因为它们的优先级高于低优先级任务,但低于正在等待的高优先级任务。任务Y是次低优先级任务,每800毫秒运行一次,总共运行100毫秒,而任务X是第三低优先级任务,周期为500毫秒,执行时间为80毫秒。当任务Y运行时,任务X准备运行并抢占任务Y。

ChatCoding的博客 18

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Priority Inversion - 优先级翻转

英文: Priority Inversion 中文: 优先级翻转、优先级倒置、优先级逆转 介绍: 即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任务抢先,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。 什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优...

Mr.Phoebe的专栏 1004

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

vxworks优先级反转问题以及解决方法

假设目前系统有三个任务,分别是high,medium和low,它们的优先级依次从高到低排列。如果没有竞争资源的话,系统会按照优先级的顺序执行三个任务,这也是我们最希望看到的情况。 存在以下情况的时候,就出现优先级反转问题: high任务等待信号量sem,目前任务阻塞;medium任务在不停的执行;low任务只有信号量sem,但是由于优先级低于medium无法获得系统调度。 这时就

passion_yi的专栏 5485

priority inversion

priority inversion, 也就是优先级反转的意思,当低优先级的线程阻塞高优先级的线程的现象就成为优先级反转。 假设有三个线程:线程0( 低优先级)线程1(中等优先级)线程2(高优先级)   线程0 和线程2需要共享一段critical section。线程0先进入critical section,在没有离开的时候,线程1抢占了线程0. 当优先级最高的线程2需要抢占的时候,由于线

freshmanjq的博客 1023

Threadx-Priority Inversion

Undesirable situations can occur when two threads with different priorities share a common resource. Priority inversion is one such situation; it arises when a higher-priority thread is suspended beca...

天使之翼 274

RTOS介绍------九、Priority Inversion

Concepts 优先级反转是一个bug,表现为 高优先级的task被低优先级的task间接抢占。例如,低优先级的task占用着某个mutex,高优先级的task就必须等待 才能继续执行。 简单case:高优先级的task(Task H)会被阻塞,只要低优先级的task(Task L)拿着lock。这被称作“有界优先级反转”,因为优先级反转的时长 和低优先级task在临界区(hold the lock)的时长 相关。 上图可以看出,只要Task L 拿着lock,Task H 就会一直被阻塞 。tasks

cesare20的博客 875
上一篇: 工厂模式(Factory Pattern)
下一篇: C++中的深拷贝(Deep Copy) 和 浅拷贝(Shallow Copy)
Monkey Ji
博客等级 码龄9年 113粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值