优先级反转

933 阅读2分钟

优先级反转,实时操作系统的线程调度几乎都存在这个问题,只是现在的系统内部都自动提供了解决方案,使得我们感觉不到这个问题而已。

在iOS中,OSSpinLock 和 semaphore 会存在优先级反转问题,其它的线程锁都内置了解决方案。

OSSpinLock不安全是因为高优先级线程抢占了低优先级线程CPU时间片,导致低优先级线程无法完成并释放临界资源,使得高优先级线程无法进行而忙等。此时中优先级线程因为不需要占有临界资源反先执行了,在若干个时间片后,低优先级线程完成并释放了临界资源,然后高优先级线程得以正确运行,但此时中优先级可能已经执行完成。中优先级先于高优先级完成,就可能会造成系统崩溃。

semaphore因为无法获得必要的线程信息,依然会存在优先级反转的问题,所以不建议用semaphore做线程同步,除非都处于同一优先级。

优先级反转图解

有3个任务,优先级: A < B < C,A先就绪并执行,紧接着C就绪,再然后B就绪。

优先级反转图例:

b (图片来自优先级反转那点事儿

我们期待的结果是C先执行,然后B执行,但由于高优先级必须第一时间执行这种调度算法,A抢占了CPU时间但是又无法获得临界资源,反而使得B先与C执行了,这就是优先级反转。

解决方案图例:

a

一种优先级继承方案,低优先级继承高优先级,使A正常执行并结束,就不会发生优先级反转的问题。

参考/延伸资料:

详解操作系统内核对线程的调度算法

优先级反转那点事儿

uCOS-II中的任务切换-图解多种任务调度时机与问题

不再安全的 OSSpinLock