多级反馈队列 Multi-level Feedback Queue MLFQ
多级反馈队列 Multi-level Feedback Queue MLFQ
MLFQ中有许多独立的队列(queue),每个队列有不同的优先级(prioritylevel)。任何时刻,一个工作只能存在于一个队列中。MLFQ总是优先执行较高优先级的工作(即在较高级队列中的工作)
如果一个进程是交互型任务,比如键盘输入,MLFQ会让他保持高优先级。如果一个工作长时间占用CPU,MLFQ会将它挪动到低优先级队列。
MLFQ规则
- 规则1: 如果A的优先级 > B的优先级, 运行A(不运行B)。
- 规则2: 如果A的优先级 = B的优先级,轮转运行A和B。
- 规则3: 工作进入系统时,放在最高优先级(最上层队列)。
- 规则4: 一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次CPU),将降低其优先级(移入低一级队列)。
- 规则5: 经过一段时间S后,就将系统中所有工作重新加入最高优先级队列。
其中规则3是为了保证新加入的任务能首次获得CPU的执行权。
规则4 是为了防止有些任务故意释放CPU,然后系统保持它的优先级。
规则5是为了避免某些IO交互任务长时间频繁得到CPU,长工作永远得不到CPU。另外如果一个计算密集型的任务在某段时间表现为一个交互性的任务,它不会享受到系统中其他交互性任务的待遇。
优化
有解决的问题:
- 配置多少队列?
- 每一层队列的时间片配置多大?
- 为了避免饥饿问题以及进程行为改变,应该多久提升一次进程的优先级?
大多数MLFQ变体支持:
- 高优先级队列配置较短的时间片,比如10ms或者更少
- 低优先级配置更长的时间片。
- 通过配置,数学公式来调整优先级。比如linux 系统中nice工具