【操作系统】常用的调度算法


前言

在操作系统中,进程或作业调度的实质是进行资源分配,而这主要涉及CPU的分配与调度。CPU的调度算法就是根据该系统的资源分配策略设计出来的一个资源分配算法,常用的调度算法有:先来先服务调度算法、短作业/短进程优先算法、时间片轮转调度算法、高响应比优先调度算法、优先级调度算法和多级反馈队列调度算法等6种,接下来围绕着这6种算法进行讲解。

先来先服务调度算法(FCFS)

先来先服务调度算法(first come first service)算法是一种最简单的调度算法,可以用于高级调度(作业调度)也可以用于低级调度(进程调度)。FCFS算法按照作业进入后备作业队列的先后顺序选择作业进入内存,为该作业分配所需要的资源。在低级调度中,同样会选择先进入就绪队列的进程/线程,然后将CPU分配给它并使其运行。
该算法是一种非抢占式调度算法,当某一个线程/进程占用了CPU后就一直运行,直到该进程/线程运行结束后放弃了CPU,或者运行过程中发送进程阻塞而放弃CPU。
优点:

  • 根据进程请求访问磁盘的先后次序进行调度,使得调度算法公平简单。
  • 并且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。

缺点:

  • 未对寻道进行优化,平均寻道距离较大,致使平均寻道时间可能较长。仅适用于请求磁盘I/O的进程数目较少的场合。
  • 有可能磁头长期在一个磁道附近进行访问,这会产生磁臂粘着现象。
    在这里插入图片描述

该算法现在已经很少作为主要的调度算法单独使用,尤其在分时操作系统和实时操作系统中,通常是与其他调度算法结合使用。

短作业/短进程优先算法(SJF/SPF)

短作业优先算法(short job first)每次从后备队列中选择估计运行时间最短的作业进入内存,并创建相应的进程。SJF应用于低级调度时被称为短进程优先调度算法(short process first)。
SJF/SPF调度算法是一种非抢占式调度算法,某一个作业一旦获得了CPU,就一直运行到该进程完成或者因发生阻塞而放弃CPU,所以该算法不适合分时系统或者实时操作系统。
优点:

  • 减短平均周转时间和平均带权周转时间。
  • 有效降低作业/进程的平均等待时间。

缺点:

  • 不公平,没有考虑到长作业或运行时间长的进程。
  • 会产生饥饿现象。

在这里插入图片描述

时间片轮转调度算法(RR)

时间片轮转调度算法(Round Robin)主要用于低级调度。采用该算法的系统中,进程/线程就绪队列总是按进程/线程到达系统时间的先后次序进行排队,然后再按照先来先服务原则,选择第一个到达的进程/线程并将CPU分配给它执行。当时间到后,就会剥夺该进程/线程的CPU使用权,并将该进程/线程加入就绪队列末尾,然后调用下一个进程进行运行。在进程/线程执行的过程中,如果因为发生某一个事件导致该进程/线程发生阻塞,那么就会将该进程/线程挂起,将它加入到阻塞队列,只有等到它除了CPU之外的所有资源满足时,才会将该进程/线程加入就绪队列。最后再从就绪队列取出第一个进程/线程然后分配CPU资源。
时间片轮转调度算法是一个基于时钟的抢占式调度算法。在使用该算法的系统中,系统周期性地产生时钟中断。当时钟中断发生时,运行进程/线程使用的CPU被剥夺,并且重新回到就绪队列的队尾。
优点:

  • 兼顾长短作业。

缺点:

  • 平均等待时间长,上下文切换较费时。

高响应比优先调度算法(HRRF)

高响应比优先调度算法(highest response ratio first)实际上是一种基于动态优先数的非抢占式调度算法,可以应用于作业调度,也可以应用于进程/线程调度。按照高响应比优先调度算法,每一个作业或者进程/线程都拥有一个动态优先数。该优先数不仅是作业或进程/线程运行时间的函数,也是其等待时间的函数。高响应比优先调度算法中的优先数通常称为响应比Rp,定义为:

请添加图片描述

高响应比优先调度算法在每次调度作业/进程运行时,都要计算后备作业队列中每个作业的响应比,或者计算进程就绪队列的每一个进程的响应比,然后选择最高响应比的作业/进程投入运行。当然,初始时短作业/短进程的响应比一定比长作业/长进程的响应比高,但随着等待时间的增加,长作业/长进程的响应比会随之提高,只要等待一定时间,就会投入运行。
优点:

  • 既照顾了短作业/短进程,也照顾了长作业/长进程。

缺点:

  • 需要估计每个作业/进程的运行时间。
  • 每次调度都要耗费不少CPU的时间。

优先级调度算法(PSA)

优先级调度算法即可用于高级调度也可以用于低级调度,还可以用于实时系统。每次从后备队列中选择优先级最高的作业/进程进行实行。如果有多个优先级最高的作业/进程,则可以结合先来先服务或短作业/短进程优先调度算法。优先级调度算法分静态优先级和动态优先级。该算法又分为抢占式优先级调度非抢占式优先级调度

静态优先级

作业/进程进入系统或创建时被赋予一个优先级,该优先级一点确定在其生命周期内不会再改变。优先级主要由进程类型、资源需求、时间需求和用户需求决定。
优点:

  • 比较简单,开销小。

缺点:

  • 不够公平也不太灵活,有可能出现优先级低的作业/进程长时间得不到调度的情况。

动态优先级

作业/进程进入系统或创建时被赋予一个优先级,但随着时间的推进,不同调度对象的优先级不断地进行动态调整,避免资源浪费。优先级会随着等待时间地变长而提高,随着使用CPU的时间变长而降低。
优点:

  • 公平性好,灵活,资源利用率高。

多级反馈队列调度算法(MLFQ)

多级反馈队列调度算法为就绪状态的进程设置多个队列。第一级队列优先级最高但时间片最少,以下各级队列的优先级逐次降低但时间片逐次增加,通常向下一级增加一倍。各级队列按先来先服务原则排序。
调度方法:

  • 设置多个进程就绪队列,每一个进程就绪队列对应一个优先级,且按队列逐级降低。每一个队列执行的时间片长度也不同,原则是优先级越低时间片越长。
  • 新进程进入内存后,先放入进程就绪队列的队尾。运行按时间片轮转法调度,若按照队列设置的时间片未能运行完,则放到下一个进程就绪队列的末尾,以此类推,直到完成。
  • 仅当前面较高优先级的队列均为空时,才能调度后面较低优先级队列中进程运行。如果进程运行中有新进程进入更高优先级的队列,则新进程将抢占CPU,原进程回到原队列的末尾。

优点:

  • 短进程能得到优先处理。
  • 系统开销不大。
  • 适用于同时支持分时、实时和批处理的通用操作系统。

缺点:

  • 由于高优先级队列一直不为空,则优先级低队列的进程长时间得不到运行,会产生饥饿现象。

总结

参考:
[1] 操作系统原理 胡元义、黑新宏 主编 中国工信出版集团。

猜你喜欢

转载自blog.csdn.net/weixin_45893787/article/details/125997024