挑战408——操作系统(8)——典型的调度算法

通过前面的学习,我们明白了调度的时机,调度的原理及其方式,那么问题来了,怎么样对程序进行调度才能提高CPU的利用率呢?对于不同的系统而言,他们的设计目标不一样,所以调度的方式也不同,常见的调度算法有等会要介绍的几个算法。不过在此之前,得先回顾一下这篇文章:挑战408——操作系统(1)——介绍一下操作系统这个东西

先来先服务算法(FCFS)

顾名思义,也不需要那么多专业术语,就是一句话,谁先到了就把处理机给谁运行。其方式类似于数据结构中队列的原理。也是一种最简单的调度方式。它可以用于作业调度(它属于内存管理的内容,以后再说)和进程调度。
进程调度中,每次从就绪队列中选择一个最先进入该队列的进程(队头),并把处理机分给它。直到程序运行完毕或者阻塞,才让出处理机(显然这是一种不可剥夺方式)。

特点

  1. 表面上公平,但是如果某一个长作业到达,就会使的短作业长期等待。
  2. 因此,常常作为一种辅助的调度策略给其他调度策略配合使用
  3. 不利于I/O繁忙的作业。

(这里注意,所谓的CPU繁忙,是指的这项作业的CPU计算部分的时间需要占用大量的时间,很少请求I/O。对应于I/O繁忙,那就是这项作业很是频繁的请求I/O,但是真正用于计算的时间却是不多,因此可以认为CPU繁忙的作业更接近于长作业的工作方式,因为它长时间占用了CPU,I/O繁忙更接近于短作业的工作方式

短作业优先(SJF或者是SPF)调度算法

SJF算法同样可以分别用于作业调度跟进程调度。其设计目标为,改进FCFS算法,减少作业或者进程的平均周转时间。
同样顾名思义,就是从就绪队列中选择一个估计运行时间最短的进程,并将处理机分配给它,后来的短作业不能剥夺正在运行的进程(因此,也是不可剥夺的方式)。

特点

  1. 该种方式的平均等待,周转时间最短
  2. 不利于长作业,容易造成饥饿现象(不解释了)
  3. 未曾考虑到作业的紧迫程度
高响应比优先算法(HRRN算法)

HRRN算法主要用于作业调度,是FCFS算法跟SJF算法的一种综合平衡。它同时考虑每个作业的等待时间个估计的运行时间。我们定义一个名词,响应比:
在这里插入图片描述
其实也可以写为,周转时间 /运行时间。
因此,由公式我们可以知道

  • R(P)一定是> =1
  • 当作业等待时间相同的时候,要求服务的时间越短,响应比越高,此时有利于短作业。
  • 当服务时间相同,则等待时间越长,响应比越高
  • 对于长作业,当等待时间足够大的时候,响应比也就升的很高,从而获得处理机。因此它也兼顾了长作业,因此不存在饥饿现象
  • 不过这种方式的代价,就是增加了系统的开销。
优先级调度算法(priority)

为了兼顾进程的紧急程度,使得紧急的进程得以及时处理,我们可以采用 优先级调度算法他适用于作业调度和进程调度。
当采用进程调度的时候,把处理机分配给就绪队列中的若干个游侠权最高的进程,该算法对于处理机可以进行可剥夺和不可剥夺两种方式
对于优先级算法,其关键在于如何确定进程的优先级,主要分为静态和动态两种方式。
静态优先是指在进程创建时就确定该进程的优先级,并且其优先级在整个运行期间都保持不变
动态优先是指进程的优先级可以根据进程的不断推进而改变,以取得更好的性能。对于动态优先,其优先级的变化取决于进程的等待时间和占有处理机时间的时间。即随着进程等待时间的增加,该进程的优先级将以某种速率增加。这样的目的是为了让优先级较低的进程在等待足够多的时间后优先级提高,进而被调度。另一方面,当一个进程占有处理机时间不断增加时,优先级会以某种速率降低,目的在于在程序运行一段时间后,将处理机让给其他进程,以防止进程长期垄断CPU。(这里考过大题

时间片轮转算法(RR)

RR算法主要用于进程调度,且常用于分时系统(联想到分时系统的特点)。通常,操作系统将所有的就绪进程按FCFS的原则,排成一个队列,每次调度的时候,把CPU分给队首的进程,并执行一个时间片的时间,若进程不能再规定的时间内完成运行,则系统时钟发出一个中断,暂停当前程序的运行,并送到就绪队列末尾,若时间片很长,长到几乎所有进程都能完成,那么这就退化成FCFS算法。若太短,那么用户的响应时间就会变长。

特点
显然这对I/O频繁的进程非常不利,因为这些进程通常不到一个时间片就阻塞了,等好不容易等I/O完成,又要跟其他进程一样排队。

多级反馈队列算法(MFQ,集合了前几种算法的优点)

这种算法中设置了多个就绪队列,每个队列的优先级不一样,第一个最高,第二个次之,依次类推。其中优先级越高的队列,执行的时间片的时间就越短,
进程进入内存后,首先放入第一个队列中,按FCFS算法执行,若该进程在某一个时间片内完成,那么正常退出,否则调到下一个优先级较低的队列的队尾,依次类推。
操作系统在第一个队列为空的时候,才会在第二个队列中调度,(即当前面k - 1个队列为空时,才调用第k个队列)。前一个队列长期不为空的话,那么后面的队列就会产生饥饿现象

各调度算法间的比较

借用教材上的图,综合对比各类调度算法:
在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值