优先级反转
复制本地路径 | 在线编辑
场景
- 背景1: 进程切换的时候,优先选择就绪队列中优先级高的进程
-
背景2: 有三个进程A,B,C(优先级从高到低),A和C共享信号量S
-
时间1: 进程C进入内存,开始执行,获得信号量S
- 时间2: 进程A进入内存,进程C因为某种事件挂起(备注1),选择就绪队列中优先级最高的进程,即进程A开始执行
- 时间3: 进程A执行,还没有进行到获取S的时刻,此时进程B进入内存,插入就绪队列
- 时间4: 进程A要求获取S,从而产生阻塞,进程开始切换,此时选择B开始执行
- 时间5: 进程B一路通畅执行完毕,此时可以看到明明B的优先级比A低,却比A结束的早
备注1: (比如系统执行抢占式优先级调度,所以要A执行;再比如可能因为等待另一个被别的进程占用的信号量而产生阻塞)
解决方法
- 优先级继承
- 解释: 进程A看到S被进程C占用,即看到我要的东西被比我低级的人占用时,此时把进程C的优先级调到和进程A一样,当进程C释放S后再恢复原来优先级
-
场景: 可以看到当进程A申请S时,把进程C优先级提高了,对应时间4,此时进程C的优先级比进程B的优先级高了,所以进程C会比B先执行,进程C释放S后回到原来的优先级,则导致进程A又开始执行了,所以A就愉快地拿到了S,而且此时进程B还没有执行
-
优先级天花板
- 解释: 进程C(注意是C)成功拿到S时,立刻把自己的优先级设置为S的天花板数,资源S的天花板数指的是比如操作系统事先知道有进程ACD抢夺S,天花板数设置为ACD中最高的优先级数
- 场景: 进程C拿到S,进程C调整自己的优先级(S的天花板数为A的优先级数),对于时间2,此时进程A进入内存,并不会导致进程C退出CPU(AC优先级现在一样),所以进程C会一直运行,直到释放掉S