Java教程

调度算法学习

本文主要是介绍调度算法学习,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

饥饿:某进程/作业长期得不到服务

非抢占式算法:对于当前正在占用处理机的进程或作业,只有进程主动放弃处理机的时候,才会进行和调度,才会用调度算法的规则选择下一个应该得到服务的进程

先来先服务(FCFS)

先来先服务调度算法:按照到达的先后顺序调度,事实上就是等待时间越久的越优先得到服务。

image-20210802081953366

调度顺序为1、2、3、4

image-20210802082038953

周转时间=完成时间-到达时间

P1=7
P2=9
P3=8
P4=11

带权周转时间=周转时间/运行时间

P1=1
P2=9/4=2.25
P3=8/1=8
P4=11/4=2.75

等待时间=周转时间-运行时间

p1=0

如果要有I/O设备输出,等待时间=周转时间-运行时间-I/O操作的时间

平均周转时间

平均带权周转时间

平均等待时间

image-20210803062612097

短作业优先(SJF)

image-20210803062750645

非抢占SPF

使用非抢占式的短作业优先调度算法(严格来说,用于进程调度应该称为短进程优先调度算法SPF)

短作业/进程优先调度算法:每次调度时选择当前已到达且运行时间最短的作业/进程

调度顺序:

P1--P3--P2--P4

image-20210803063135800

周转时间=完成时间-到达时间

p1=7
p3=8-4=4
p2=12-2=10
p4=16-5=11

带权周转时间

p1=7/7=1
p3=4/1=4
p2=1=/4=2.5
p4=11/5=2.75

等待时间

p1=7-7=0
p3=4-1=3
p2=10-4=6
p4=11-4=7

平均带权时间、带权周转时间、等待时间都比FCFS低

抢占式SRTN

使用抢占式的短作业优先调度算法(抢占式的短作业优先算法又称“最短剩余时间有限算法(SRTN)

最短剩余时间优先算法

每当有进程加入就绪队列改变时就需要调度,如果新到达的进程时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度

image-20210803064228586

image-20210803064431109

image-20210803064441913

周转时间=完成时间-到达时间

p1=16
p2=7-2=5
p3=5-4=1
p4=11-5=6

带权周转时间=周转时间/运行时间

p1=16/7=2.28
p2=5/4=1.25
p3=1/1=1
p4=6/4=1.5

等待时间=周转时间-运行时间

p1=16-7=9
p2=5-4=1
p3=1-1=0
p4=6-4=2

对比非抢占式的短作业优先算法,显然抢占式的这几个指标又要更低

小细节

对于题目未特别说明,所提到的"短作业/进程优先算法"默认是非抢占式的

在所有的进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少

在所有进程都几乎同时到达时,........

如果不加上述前提条件,则应该说"抢占式的短作业/进程优先调度算法"(最短剩余时间优先,SRNT算法)的平均等待时间、平均周转时间最少

严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(FCFS),SJF依然可以获得较少的平均等待时间、平均周转时间

如果选择题中遇到“SF算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项
是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项

image-20210803070441347

两个比较

FCFS算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务,但没有考虑到作业运行时间,因此导致了对短作业不友好

SJF算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至会造成饥饿问题

高响应比优先(HRRN)

image-20210803071106359

高响应比优先算法:

非抢占式的调度算法,只有当前运行的进程主动放弃CPU时(正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选择响应最高的进程上处理机

响应比=等待时间+要求服务时间/要求服务时间

image-20210803074217595

image-20210803074456165

P2和P4要求服务时间一样,但P2等待时间长,所以是P2响应比更大

image-20210803074615867

比较

image-20210803074659046

这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统,当然,FCFS算法也常结合其他的算法使用,在现在也扮演着很重要的角色。

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

该算法中,将一个较小时间单元定义为时间量或时间片。时间片的大小通常为 10~100ms。

就绪队列作为循环队列。CPU 调度程序循环整个就绪队列,为每个进程分配不超过一个时间片的 CPU。

时间片轮转常用于分时操作系统,更注重“响应时间”,因此此处不计算周转时间

image-20210804072818012

时间片为2时

image-20210804073358640

image-20210804073424586

image-20210804073452618

image-20210804073547015

image-20210804073602697

image-20210804073620977

image-20210804073642438

image-20210804073658678

image-20210804073714440

image-20210804073750169

image-20210804073802569

image-20210804073325295

image-20210804073826473

image-20210804073849122

image-20210804073910500

image-20210804073927287

image-20210804073947358

image-20210804073957262

image-20210804074102690

image-20210804074117358

image-20210804074125834

image-20210804074133231

时间片为5时

image-20210804074224976

image-20210804074326208

先来先服务和时间片为5的一样

image-20210804074430880

时间片太大太小有什么影响

如果时间片太大,使得每个进程都可以在一个时间片内完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大

另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少,可见时间片也不能太小

image-20210804075033437

优先级调度算法

image-20210804075234092

非抢占式的优先级调度算法:

每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发送调度

image-20210804075403444

image-20210804075506699

抢占式的优先级调度算法

每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。另外,当就绪队列发生改变时,也需要检查是否发生抢占

image-20210804075710774

image-20210804081112618

补充:

就绪队列未必只有一个,可以按照不同优先级来组织。另外,可以把优先级高的进程排在更靠近队头的位置

根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种
静态优先级:创建进程时确定,之后一直不变。
动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。

如何合理的设置各类进程的优先级

通常:

系统进程优先级高于用户进程

前台进程优先级高于后台进程

操作系统更偏好I/O型进程(或称i/o繁忙进程

注:与I/O型进程相对的是计算机进程(或称CPU繁忙进程)

I/O设备和CPU可以并行工作。如果优先让I/O繁忙型进程优先运行的话,则越有可能让I/O设备尽早地投入工作,则资源利用率、系统吞吐量都会得到提升

采用动态优先级怎么调整?

可以从追求公平、提升资源利用率等角度考虑

如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级

如果某进程占用处理机运行了很长时间,则可适当降低其优先级

果发现一个进程频繁地进行I/O操作,则可适当提升其优先级

image-20210804082900675

四种特点总结

image-20210804082957916

多级反馈队列调度算法

image-20210804083112280

设置多级就绪队列,各级队列优先级从高到低,时间片从小到大

image-20210804083609490


image-20210804083648794


image-20210804083731708


image-20210804083801093


image-20210804083839032


image-20210804083944615


image-20210804084016188


image-20210804084039767

image-20210804084050284

image-20210804084109364

image-20210804084434241

image-20210804084600960

SPF和SJF算法的区别

SJF是最短进程优先调度算法

SJF的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行;而SPF调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

这篇关于调度算法学习的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!