优先级反转

优先级翻转发生的条件:
    1、首先发生翻转需要有三个任务,它们的优先级分别是高、中、低。
    2、低优先级和高优先级都需要take同一个信号量。

优先级翻转的过程:
    1、低优先级先take到信号量。
    2、低优先级被中优先级任务抢占。(然后低优先级任务就只能等中优先级任务执行完,再继续执行之后,才能释放信号量了)
    3、高优先级需要take该信号量了,但是由于中优先级任务运行时间长,低优先级任务又霸占住信号量不放,高优先级无奈被阻塞了。(一般高优先级任务都是要快速完成一些需要及时处理的事情,被阻塞可是大事)
    这样的现象就叫优先级翻转,因为高优先级它无法抢占低的,不“高”了,当然就是翻转了。

避免优先级翻转的办法:
    使用互斥信号量,并且设置防优先级翻转参数(SEM_INVERSION_SAFE )。

防止优先级翻转的原理:
    改变在于上面的过程中的第1步,低优先级take到该信号量的时候,系统就搜索该信号量还可能被哪些任务使用,然后就把该低优先级任务的优先级调整到这些任务中最高的一个那么高。
    这样,起码低优先级运行到释放信号量,高优先级也就立即能运行了,就不会出现中优先级任务长时间运行使得高优先级任务无休止等待的情况了。
    
    注意两个前提条件:
    1、信号量持有时间尽可能短。(这是写代码过程中就要注意的,做到这一点,就可以保证高优先级不用等低优先级任务太久)
    2、高优先级任务执行非常快。(这也是任务设计的要求,高优先级应该只处理那些紧急而且快速的事情。)

所以不会出现中优先级抢占,但无法抢占而带来问题。因为上述两点决定了它们耽误的时间非常短,不会对中优先级造成影响。

时间: 2024-10-13 00:50:43

优先级反转的相关文章

ucos互斥信号量解决优先级反转问题

在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. 我们假设有三个任务a,b,c,a优先级高于b,b优先级高于c,a和c都需要访问一个共享资源s,保护该资源的信号量为互斥信号量, 假设当前任务c申请了信号量访问s,还没有释放,此时任务a开始运行,那么a就会剥夺c的运行而运行a,当a去访问资源s的时候,因为得不到信号量,所以必须释放以等待信号量,任务c

操作系统进程调度,优先级反转,调度策略

转载请注明:http://blog.csdn.net/guo8113/article/details/39645041 在多进程.多线程并发的环境里,从概念上看,有多个进程或者多个线程在同时执行,具体到单个CPU级别,实际上任何时刻只能有一个进程或者线程处于执行状态:因此OS需要决定哪个进程执行,哪些进程等待,也就是进程的调度. 一.调度的目标 1.首先要区分程序使用CPU的三种模式:IO密集型.计算密集型和平衡型.对于IO密集型程序来说,响应时间非常重要:对于CPU密集型来说,CPU的周转时间

Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)

死锁(deadlock) 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. 虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件. 1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用.如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放. 2)请

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

Lock Convoy(锁封护) [1]Lock Convoy是在多线程并发环境下由于锁的使用而引起的性能退化问题.当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lock convoy问题,一般而言,lock convoy并不会像deadlock或livelock那样造成应用逻辑停止不前,相反地,遭受lock convoy的系统或应用程序仍然往前运行,但是,由于线程们频繁地争抢锁而导致过多的线程环境切换,从而使得系统的运行效率大为降低,而且,若存在同等优先级下不参与锁争抢的线程,则它们可以

多进程多线程优先级理解--优先级反转【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14161061 1. 优先级反转(Priority Inversion)    由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃.这就是所谓的优先级反转(Priority Inversion). 2. 产生原因      其实,优先级反转是在高优级(假设为A)的任务要访问一个被低优先级任务(假设为C)占有的资源时,

优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】

RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_sem_t sem; rt_uint32_t t1_count = 0,t2_count = 0,worker_count = 0; rt_thread_t t1,t2,worker ; void pri1_entry(void *parameter) { rt_err_t result; while(

iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等

iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等 线程 使用Instruments的CPU strategy view查看代码如何在多核CPU中执行.创建线程可以使用POSIX 线程API,或者NSThread(封装POSIX 线程API).下面是并发4个线程在一百万个数字中找最小值和最大值的pthread例子: #import

多线程编程之优先级翻转问题

一.什么是优先级翻转问题 所谓优先级翻转问题(Priority Inversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任务抢先,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证. 例如:有优先级为A.B和C三个任务,优先级A>B>C,任务A,B处于挂起状态,等待某一事件发生,任务C正在运行,此时任务C开始使用某一共享资源S.在使用中,任务A等待事件到来,任务A转为就绪

交互式系统中采用的调度算法

1.轮转调度 (1)时间片轮转调度算法 CPU的时间分成一段一段的,每一段就是一个时间片,进程轮流使用时间片.示意图如下: (2)虚拟轮转法 时间片轮转调度算法对IO型进程不公平:对于CPU型进程,该进程获得CPU时间片后总是会用完整个时间片:但是对于IO型,它经常是运行一部分时间片后就去等待IO事件,总是用不完自己的时间片.为了解决这个问题,提出了虚拟轮转法,该算法的示意图如下: 虚拟轮转调度算法的思想是:进程用完时间片后,回到就绪队列:而进程因为等待某个事件放弃CPU,该进程等待的事件发生后