zoukankan      html  css  js  c++  java
  • 多级反馈队列 Multilevel 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。另外如果一个计算密集型的任务在某段时间表现为一个交互性的任务,它不会享受到系统中其他交互性任务的待遇。

    优化

    有解决的问题:

    1. 配置多少队列?
    2. 每一层队列的时间片配置多大?
    3. 为了避免饥饿问题以及进程行为改变,应该多久提升一次进程的优先级?

    大多数MLFQ变体支持:

    • 高优先级队列配置较短的时间片,比如10ms或者更少
    • 低优先级配置更长的时间片。
    • 通过配置,数学公式来调整优先级。比如linux 系统中nice工具
  • 相关阅读:
    iOS中的事件传递和响应者链条
    iOS多线程--NSOperation
    Objective-C—— @Property详解
    iOS网络——NSURLCache设置网络请求缓存
    Objective-C—— Block
    iOS多线程——GCD篇
    Objective-C设计模式——中介者Mediator(对象去耦)
    Objective-C设计模式——外观Faced(接口适配)
    Objective-C设计模式——桥接Bridge(接口适配)
    Objective-C设计模式——适配器Adapter(接口适配)
  • 原文地址:https://www.cnblogs.com/linyihai/p/15706496.html
Copyright © 2011-2022 走看看