调度:多级反馈队列(Multi-level Feedback Queue,MLFQ)
MLFQ需要解决的问题:
优化周转时间且降低响应时间
MLFQ的规则
(1)A的优先级>B的优先级,运行A
(2)A的优先级=B,轮转运行
存在的问题:低优先级的进程永无机会运行。
改变优先级:
(3)工作进入系统时,放入最高优先级
(4a)工作用完整个时间片后,降低优先级
(4b)若工作在其时间片内主动释放CPU,其优先级不变
针对:
占用CPU时间长,响应时间不重要的长时间计算密集型工作。
运行时间短,频繁放弃CPU的交互型工作。
eg.
长时间工作在运行2个10ms的时间片后进入最低优先级队列。
交互型工作(灰色)在CPU密集工作一段时间后进入,连续运行完两个时间片后结束,继续运行黑色工作。
若有I/O,则不会降低优先级。
eg.
4a和4b存在的问题
1.饥饿(starvation)问题:若存在太多的交互型工作,长工作就永远无法得到CPU,被“饿死”了。
2.愚弄调度程序(game the scheduler):进程在时间片快用完时调用I/O,保持在高优先级,占用更多的CPU时间。
3.一个程序在不同时间表现不同,计算密集的进程在另一个时间可能表现为交互型,用当前的方法,它不会享受交互型的待遇。
(5)经过一段时间S,提升所有工作到最高优先级
解决了1、3问题。
eg.
关于S:
S被称为“巫毒常量(voo-doo constant)”,要合理设置S。
若S设置太高,长工作会饥饿;太低,交互型工作得不到合适的时间比例。
(4)一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次CPU),就降低其优先级
解决了愚弄问题。
设计MLFQ时需考虑:
就绪队列的数量
就绪队列的优先级
各就绪队列的调度算法
进程在队列间的迁移条件