Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335168
  • 博文数量: 106
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-10 08:32
文章分类

全部博文(106)

文章存档

2016年(11)

2015年(93)

2013年(2)

分类: LINUX

2015-12-04 08:48:54

结论:使用信号量的任务是否能够运行是受任务的优先级别以及是否占用信号量这两个条件约束的,而信号量的约束高于优先级别的约束

      互斥信号是一个二值信号,它可以使任务以独占方式使用共享资源。

1 任务优先级反转现象

     当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这就是所谓的任务优先级反转。

   

互斥型信号量和任务优先级反转 - engineerdream - engineerdream
    上面描述了A,B,C三个任务的运行情况。其中A的优先级>B的优先级>C的优先级。任务A和任务C都要使用一个共享资源S(注意:这里B并没有使用)。而用于保护该资源的信号量在同一时间只允许一个任务以独占的方式对该资源进行访问,即这个信号量是一个互斥型信号量。
      现假设在任务C使用共享资源S过程中的t2时刻,任务A等待的事件已经到来,那么由于任务A的优先级高于任务C的优先级,所以任务A就剥夺了任务C的CPU使用权而进入运行状态,而使任务C中止运行,这样任务C就失去了释放信号量的机会。如果任务A在运行中的t3时刻又要访问共享资源S,但由于任务C还未释放信号量,因此任务A只好等待,以使任务C可以继续使用共享资源S。
 问题是这样的:如果在任务C继续使用共享资源S中的t4时刻,任务B所等待的事件也来临,由于B的优先级别高于C的优先级别,任务B当然要剥夺任务C的CPU使用权而进入运行状态,而任务C只好等待。这样任务A只有当任务B运行结束,并使任务C继续运行且释放了信号量的t0时刻之后,才能获得信号量而得以重新运行。
    综上所述,任务优先级低的任务B反而先于任务优先级高的任务A运行了。换句话说,从实际的运行结果来看,似乎任务B的优先级高于任务A了。这就叫作优先级反转。
   之所以出现了上述的优先级反转现象,是因为一个优先级别较低的任务在获得了信号量使用共享资源期间,被具有较高优先级别的任务所打断而不能释放信号量,从而使正在等待这个信号量的更高级别的任务因的不到信号量而被迫处于等待状态,在这个等待期间,就让优先级别低于它(如A)而高于占据信号量的任务(如C)即B先运行了
 
 
 
任哲书146程序分析 在HerTask中
 
互斥型信号量和任务优先级反转 - engineerdream - engineerdream
 
     使用信号量的任务是否能够运行是受任务的优先级别以及是否占用信号量两个条件约束的。并且信号量的约束高于优先级别的约束。于是,当出现低优先级别的任务与高优先级别的任务使用同一个信号量时,而系统中还存在其他中等优先级别的任务时,如果地优先级别的任务先获得了信号量,就会使高优先级别的任务处于等待状态;而那些不使用该信号量的中等优先级别的任务却可以剥夺低优先级别的任务的CPU使用权而先于高优先级别的任务而运行了。
 
解决方案:(互斥信号量采用的思想)
    使获得信号量的任务的优先级别在使用共享资源期间暂时提升到所有任务最高优先级的高一个级别上,以使该任务不被其他任务所打断,从而能尽快的使用完共享资源并释放信号量,然后在释放信号量之后,再恢复该任务原来的优先级别。
阅读(3147) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~