zoukankan      html  css  js  c++  java
  • 任务调度算法汇总

    先来先服务算法

    最简单的一种调度算法是先来先服务算法(First Come First Served,FCFS),也叫做先进先出算法(First In First Out,FIFO)。

    优点:简单,易于理解和实现。
    缺点:一批任务的平均周转时间取决于各个任务到达的顺序,如果短任务位于长任务之后,那么将增大平均周转时间。


    短作业优先算法

    为了改进FCFS算法,减少平均周转时间,人们提出了短作业优先算法(Shortest Job First,SJF)。SJF算法的基本思路是:各个任务在开始执行之前,必须事先预计好它的执行时间,然后调度器将根据这些时间,从中选择用时较短的任务优先执行。
    SJF算法有两种:不可抢占方式和可抢占方式。其中可抢占方式又叫最短剩余时间优先算法(Shortest Remaining Time First,SRTF)。

    时间片轮转算法

    时间片轮转算法(Round Robin,RR)的基本思路是:把系统当中的所有就绪任务按照先来先服务的原则,排成一个队列,然后再每次调度的时候,把处理器分派给队列当中的第一个任务,让它去执行一小段CPU时间(即时间片,time slice)。当这个时间片结束时,如果任务还没有执行完成的话,将会发生时钟中断,在时钟中断里面,调度器将会暂停当前任务的执行,并把它送到就绪队列的末尾,然后执行当前的队首任务。反之,如果一个任务在它的时间片用完之前就已经结束了或者阻塞了,那么它就会立即让出CPU给其他任务。

    图3-25所示是时间片轮转法的示意图。图a表示初始状态,总共有四个任务位于就绪队列中,先后顺序是B、C、D、A,其中任务B位于队列之首。当CPU空闲时,调度器就会选择B去执行。假设当B运行完一个时间片后,即没有结束也没有被阻塞,这时操作系统就会通过时钟中断来中止它的运行,并把它送到就绪队列的末尾。于是就成了图b的状态,此时,C位于队列之首,C就被调度执行。当C时间片用完后也会送到队列末尾,以此内推。当某个任务运行结束了,就会退出就绪队列,或者某任务被阻塞也也会退出,并加入阻塞队列中去。

    优点:公平性,各个就绪任务能得到相同的时间片;活动性,每个就绪任务能一直保持活动。
    缺点:时间片的大小q要适当选取,如果选择不当,将会影响到系统的性能和效率。如果q太大,每个任务都在一个时间片内完成,这就退化为先来先服务算法了。如果q太小,每个任务需要更多的时间片才能运行结束,这就使任务之间的切换次数增加,从而增大了系统的管理开销,降低了CPU的使用效率。一般来说,q值选取在20ms~50ms比较合适。

    另,时间片轮转算法属于可抢占式调度。

    优先级算法

    优先级调度算法(priority)的基本思路是:给每个任务都设置一个优先级,然后在任务调度的时候,在所有处于就绪状态的任务中选择优先级最高的任务去运行。上文提到的短作业优先算法其实也是一种优先级算法,每个任务的优先级就是它的运行时间,运行时间越短,优先级越高。

    优先级算法可以分为可抢占方式和不可抢占方式。区别在于,一个任务正在运行时,如果来了一个优先级更高的任务,可抢占方式则会立即抢占CPU去运行高优先级的任务,不可抢占方式则会等当前任务运行结束后再执行。

    在任务优先级的确定方式上,可以分为静态方式和动态方式。

    静态优先级方式:在创建任务的时候就确定任务的优先级,并且一直保持不变直到任务结束。
    动态优先级方式:任务的优先级在任务运行过程中可以动态改变。

    在优先级算法中,高优先级的任务将抢占低优先级的任务,但如果两个任务的优先级相同,又该如何处理呢?通常的做法是把任务按照不同的优先级进行分组,然后在不同组之间使用优先级算法,在同一组的各个任务之间使用时间片轮转法。(如图)

     参考资料:《嵌入式系统设计师》3.3.4章节 任务的调度

    转自:https://blog.csdn.net/yannanxiu/java/article/details/52738580

  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/13066145.html
Copyright © 2011-2022 走看看