天下无伤 发表于 2013-4-20 08:03:27

任务优先级反转现象

在可剥夺型内核(可抢占)中,当任务以独占方式使用共享资源时。会出现低优先级任务先于高优先级任务而被运行的现象,这种现象叫做任务优先级反转。在一般情况下是不允许出现这种任务优先级反转现象的。下面就对优先级的反转现象进行一个详细分析:

      假设有三个任务A、B、C三个任务的运行情况。其中,任务A的优先级别高于任务B,任务B的优先级别高于任务C。任务A和C都要使用同一个共享资源S,而用于保护该资源的信号量在同一时间只能允许一个任务以独占的方式对该资源进行访问,即这个信号量是一个互斥型信号量。

      现在,假如任务A和任务B就在等待与各自任务相关的事件发生而处于等待状态,而任务C则正在运行,且在t1时刻取得了信号量并开始访问共享资源S。

      如果在任务C使用共享资源S过程中的t2时刻,任务A等待的事件已经到来,那么由于任务A的优先级别高于任务C的优先级别,所以任务A就剥夺任务C的CPU使用权而进入运行状态,而使任务C中止运行,这样任务C就失去了释放信号量的机会。如果任务A在运行的t3时刻又要访问共享资源S,但由于任务C还未释放信号量,因此任务A在运行的t3时刻又要访问共享资源S,但由于任务C还未释放信号量,因此任务A只好等待,以使任务C可继续使用共享资源S。

   这些都是正常的,但是意外的是,如果任务C继续使用共享资源S的过程中的t4时刻,任务B所等待的事件也到来,由于任务B的优先级别高于C的优先级别,任务B当然要剥夺任务C的CPU使用权而进入运行状态,而任务C则只好等待,这样任务A只有当任务B运行结束,并使任务C继续运行且释放了信号量的t6时刻之后,才能获得信号量而得以重新运行。

   综上所述,任务优先级别低的任务B反而优先于任务优先级高的任务A运行了,换句话说,从实际运行的结果来看,似乎任务B的优先级别高于任务A,系统中的这种现象叫做任务优先级反转。

jinyi7016 发表于 2013-5-26 22:53:58

书上说用互斥信号号可以避免,没有试过,也刚学,打算在STM32上跑跑
页: [1]
查看完整版本: 任务优先级反转现象