回顾
回顾上一章介绍的一些进程调度策略:
- FIFO 先进先出调度
- SJF 短作业优先
- STCF 添加了抢占的最短完成任务优先的调度策略
- RR 时间片轮转调度
上面的这些调度策略:
- FIFO有明显的缺点,因为FIFO没有考虑进程的类型以及进程的运行特点,按照他们到达的时间进行顺序执行。
- SJF和STCF也有明显的缺点,这两种调度策略需要预先知道进程的执行情况,比如运行时间、完成时间,但系统中的进程通常并不清楚一个进程什么时候能够执行结束,所以通常操作系统很难满足这两种调度策略的要求。
- 轮转调度策略充分考虑了系统的响应时间,时间片越小,理论上响应时间就越好,但是实际要考虑进程上下文切换带来的额外开销,并且系统的周转时间通常不太好。
多级反馈队列
顾名思义,多级反馈队列由很多不同的优先级的队列组成,“反馈”体现了多级反馈队列的核心思想。
多级反馈队列考虑的问题是怎么同时优化系统的响应时间和周转时间?
多级反馈队列的核心思想就是通过进程的运行历史来预测进程后面的运行情况,进而更合理地调整进程的优先级,来改变系统进程的运行情况。
多级反馈列提出的几个规则:
- 规则一:如果A个优先级 > B,则执行A
- 规则二:如果A和B有相同的优先级,则采用轮转调度策略运行A和B,相当于A和B位于同一级队列中
- 规则三:工作刚进入系统时,优先被放在最高优先级的队列中
- 规则四:一旦任务用完了它在某一级队列中的时间比例份额,无论该任务连续放弃了多少次CPU(可能是IO型的任务),都将该任务下调至低一级的队列中
- 规则五:每经过一段时间S,就将所有的任务提高至最高优先级队列
前两条是多级反馈队列的两个基本规则,后面是为了完善该调度算法添加的规则
前两条可以保证该调度算法能够工作,从规则三开始看:
规则三:工作刚进入系统时,优先被放在最高优先级的队列中
原本的规则三是和两个规则四一起的:
- 规则3:工作进入系统时,放在最高优先级(最上层队列)。
- 规则4a:工作用完整个时间片后,降低其优先级(移入下一个队列)。
- 规则4b:如果工作在其时间片以内主动释放CPU,则优先级不变。
通过刚进来的任务的运行特点,进而做出决策是否调整该任务的优先级,这个方案是好的,但是不难想到一种情况,一些任务“故意”主动释放CPU来达到一直占用最高优先级的目的,那后面的任务将无法获得机会执行,所以才有了后面改进的规则四。或者当系统的交互型工作过多时,低优先级的进程会被“饿死”。
规则四:一旦任务用完了它在某一级队列中的时间比例份额,无论该任务连续放弃了多少次CPU(可能是IO型的任务),都将该任务下调至低一级的队列中
这个相当于在每个队列中为每个任务设置了一个计时器,无论该任务是什么类型的,只有这么多执行时间,只要把在这一级队列中的时间份额用完了,就需要降低优先级,这样不管是啥任务都有机会执行。
这样也避免了一些“恶意”的进程长时间占用最高优先级执行的情况。
规则五:每经过一段时间S,就将所有的任务提高至最高优先级队列
规则五是为了避免当交互型任务过多时,一些CPU密集型的任务会被"饿死"的情况。
由此可见,多级反馈队列的目的是尽可能优化系统的响应时间和周转时间。
多级反馈队列通过规则三来逼近SJF,因为通常短作业在被下调至更低优先级队列之前就已经执行结束了。
通过在每一级队列中采用轮转调度来优化系统的响应时间。可以说是集成了上一章中多个进程调度策略的优点。
但是通过阅读教材可以发现,多级反馈队列需要配置很多参数,比如队列应该设置多少个、轮转的时间片应该多大、每一级队列的时间份额应该怎么分配、S应该怎么设定等,这些参数的设定直接会影响该调度策略的执行效率。
设想
不知道现在的一些机器学习算法是否能用来优化操作系统的参数,通过配置文件的形式配置系统参数,随着系统的运行,动态修改该系统的调度参数,使其达到一个更好的效果。