看到一张比较好的解释优先级反转的示意图如下:
当优先级比较低的C任务获取到信号量运行时,优先级为高的A任务因为条件触发需要执行,但是需要的信号量此时被c获得,所以只能等待。
CPU回到任务C继续运行,但是如果此时优先级为中的任务B因为条件出发需要执行,则CPU会切换到任务B,运行完成之后再回到任务C,一直到任务C运行结束释放信号量,此时任务A才能开始运行。
此种情况导致了优先级为中的B任务占用CPU早于优先级为高的A任务。所以称为优先级反转。
解决:
一般使用的方法有两种:优先级天花板及优先级继承,两者理念其实差不多。
优先级天花板是指,当任务C获取完共享资源之后,把任务C的优先级提升到最高优先级,可以保证中间不会被打断,尽早释放资源。
优先级继承是指:当任务C获得资源运行是,高优先级任务A尝试获取资源,此时发现自已被C占用,则比较C与A的优先级高低,若C的优先级低,则把C的优先级提升至A同样等级。