Priority Inversion [优先级反转]
Priority inversion[优先级反转,或者优先级翻转],单从字面理解可能会认为是CPU调度线程的时候,两个线程的优先级互换,这个理解也是我第一次听到这个词的想法,但是和真实意思相去甚远,写在这里,也是提醒自己凡事不要想当然。
首先priority inversion涉及三个线程而不是两个。线程调度的时候一般会考虑每个线程的优先级[当然在不考虑优先级的调度方法中,也就不存在priority inversion问题了],优先级高的往往先执行。假设现在我们有A,B,C三个线程,其优先级为A>B>C。根据优先级,A会被CPU激活并优先被执行,但是在执行时发现A需要的一个共享资源[或者叫临界资源]已经被低优先级的C占用,如此高优先级就会被阻塞,为了让A继续执行[也就是获得需要的共享资源],必须让C获得执行权。但是在A被阻塞,C执行之前,如果拥有中等优先级的B已经处于就绪状态,那么根据优先级高的线程先执行的原则,B将会执行。所以总结说来就是,当高优先级的线程A,由于所需资源被占用而挂起,然后中优先级的任务B,由于比[本来打算去调度执行的]低优先级线程C的优先级高,所以被调度执行,然后B去一直执行,直到结束。 这种情况就是,一个具有中等优先级的线程[B],却比一个更高优先级的线程[A]先执行,这就是priority inversion
这种情况在最初设计线程调度的时候,应该是经常发生,但是随之而来的问题是就算出现priority inversion又怎么样的,在OS中,大不了就是等B执行完了再执行A就可以了,似乎并不是个大问题。
其实所有问题不应该独立来看,要放回到它产生的地方。priority inversion的问题出现在实时系统[real time system]。实时系统对于事件执行的逻辑顺序和完成时间一般都有比较严格的规定,也就是说如果逻辑顺序规定是A先执行B再执行,那么priority inversion就破坏了这样的逻辑,对于实时系统这就是重大错误。同时priority inversion会彻底影响事件的执行时间,破坏实时系统的实时性。
那么如何解决,对于这种经典问题,必然有众多经典解法,因为自己的Research不是这个方向,这里就抛砖引玉一下。Priority Ceiling[优先级天花板],就是当线程申请某资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。这种方法简单易行,不必进行复杂的判断, 不管任务是否阻塞了高优先级任务的运行,只要任务访问共享资源都会提升任务的优先级。