当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象
具体解释为:在原本的调度算法设计中,高优先级进程可以抢占低优先级的CPU资源,先执行高优先级任务。但是存在某种情况下会出现高优先级的进程无法完成需要等低优先级的进程完成后才可以执行,这样的现象在实时系统当中很危险有很大的坏处所以我们要避免它的出现。
这种情况是怎么形成的呢,假如有三个完全独立的进程P1,P2,P3。P1的优先级最高依次减小,P3优先级最低。P1和P3两者共用一个临界资源。当P3先执行的时候只是进行了P操作未进行V操作将临界资源释放但是P2这时候把P3的处理机抢占了这时P3无法执行。当P1要执行的时候虽然可以将P2占有的处理机抢占但是无法把P3占用的临界资源进行得到。所以需要等待P2执行结束再P3执行结束释放临界资源这时候P1才可以进行执行。
通俗来讲:
优先级反转最坏的一种情况就是,一个高优先级任务很紧急,但其资源已经被一个低优先级任务占有,且该低优先级任务前还有很多个耗时很长的中优先级任务。
对于针对任务的紧急重要程度而设计的优先级调度机制,优先级反转导致的这种情况是对优先级调度本身的践踏,
其公平,无错,循规蹈矩,但后果恶劣。
解决优先级倒置的方法有:优先级继承方法。
优先级继承方法是有效解决优先级反转问题的一种方法,其“继承”的思路其实不复杂。简言之,优先级继承就是临时把低优先级任务的优先级升高,让CPU优先并尽快执行完该低优先级任务,执行完时将其优先级再降至原优先级,并释放资源,原本的高优先级任务拿到资源后则可以抢占CPU并执行。
死锁问题
死锁问题的定义:在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占用的资源.或者说每个进程所等待的事件是该组中其他进程释放所占有的资源。
如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
产生死锁的四个必要条件:
1.互斥条件:进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求资源,则该请求进程只能等待,直至该资源的进程用毕释放。
2.请求保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被堵塞,但对自己已获得的资源保持不放。
3.不可抢占条件:进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完之后自己释放
4.循环等待条件:在发生死锁的时,必然存在一个进程—资源的循环链。
例如:进程 P1 已经分得了两个 R1 资源,并又请求一个 R2 资源;进程 P2 分得了一个 R1 和一个 R2 资源,并又请求一个 R1 资源。