调度:多级反馈队列
基本规则
MLFQ有许多独立的队列,每个队列都有优先级,任何时刻,一个任务只能存在一个队列当中,而MLFQ总是执行优先级最高的队列中的任务。在同一个队列中的任务,采用轮转调度。而MLFQ会观察任务的行为,然后调整他们的优先级。
尝试1:改变优先级
工作进入系统时,放在优先级最高的队列当中,工作用完整个时间片后,降低其优先级,如果时间片没用完,主动放弃CPU,则优先级不进行变化。
按照这种方法,如果有一个很长的cpu密集型任务要执行,那么它会被慢慢降级到最低的优先级。而此时来了一个短任务,会被放在优先级最高的队列中执行,它大概率会在降到最低优先级之前处理完,这种情况下MLFQ近似于短任务优先。
存在的问题
这样设计,如果一个任务一直不把CPU时间片用完,那么他就一直可以处于优先级最高的队列当中,那么会导致一些用完时间片而导致降级的任务永远无法处理。
而且会有程序恶意放弃CPU资源而一直占用处理器,比如在时间片用完之间,执行一段I/O操作,主动放弃CPU。
尝试2:提升优先级
一个简单的设计,经过一段时间S后,就把队列中的所有任务全部放在优先级最高的队列当中。
但是这个S的值设置不合适也会导致问题,太长,会导致任务饥饿,太短的话,交互性任务达不到合适的CPU时间比例。
尝试3:更好的设计
为了防止一些恶意代码在CPU时间片用完前执行一次I/O操作来放弃处理器资源,以达到刷新时间片的目的,我们可以将时间片设计为该任务在该队列可以执行的总时间。意思就是,一个任务可以执行1s,那么无论它放弃了多少次,只要执行的总时间达到1s,他就要被降到低优先级的队列当中。
参考
《操作系统导论》