调度算法

调度算法评价指标

image-20240318115504302

CPU利用率

由于早期的CPU造价极其昂贵,因此人们会希望让CPU尽可能多地工作

CPU利用率:指CPU“忙碌”的时间占总时间的比例。

image-20240318115532004

Eg:某计算机只支持单道程序,某个作业刚开始需要在CPU上运行5秒,再用打印机打印输出5秒,之后再执行5秒,才能结束。在此过程中,CPU利用率、打印机利用率分别是多少?

image-20240318115542858

系统吞吐量

对于计算机来说,希望能用尽可能少的时间处理完尽可能多的作业

image-20240318115606798

即平均每秒可以完成多少道作业?

image-20240318115629867

周转时间

对于计算机的用户来说,他很关心自己的作业从提交到完成花了多少时间。

周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。

它包括四个部分:

  • 作业在外存后备队列上等待作业调度(高级调度)的时间、

  • 进程在就绪队列上等待进程调度(低级调度)的时间、

  • 进程在CPU上执行的时间、

  • 进程等待I/O操作完成的时间。

后三项在一个作业的整个处理过程中,可能发生多次。

image-20240318153130446

image-20240318153138061

对于用户来说,更关心自己的单个作业的周转时间

对于操作系统来说,更关心系统的整体表现,因此更关心所有作业周转时间的平均值

思考:有的作业运行时间短,有的作业运行时间长,因此在周转时间相同的情况下,运行时间不同的作业,给用户的感觉肯定是不一样的

带权周转时间

image-20240318153253429

对于周转时间相同的两个作业,实际运行时间长的作业在相同时间内被服务的时间更多,带权周转时间更小,用户满意度更高。

对于实际运行时间相同的两个作业,周转时间短的带权周转时间更小,用户满意度更高。

带权周转时间必然≥1

带权周转时间与周转时间都是越小越好

image-20240318153431830

等待时间

计算机的用户希望自己的作业尽可能少的等待处理机

等待时间,指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。

作业调入内存后,建立对应的进程。这个进程会被CPU服务、会被I/O设备服务,当然也会有等待被服务的时候

  • 对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,但是在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。

  • 对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间

一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业/进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。

响应时间

对于计算机用户来说,会希望自己的提交的请求(比如通过键盘输入了一个调试命令)尽早地开始被系统服务、回应。

  • 响应时间,指从用户提交请求到首次产生响应所用的时间。

image-20240318154523093

调度算法(早期批处理)

image-20240318154801205

Tips:各种调度算法的学习思路

  1. 算法思想

  2. 算法规则

  3. 这种调度算法是用于作业调度还是进程调度?

  4. 抢占式?非抢占式?

  5. 优点和缺点

  6. 是否会导致饥饿(某进程/作业长期得不到服务)

先来先服务FCFS

image-20240318155724881

image-20240318155018794

image-20240318155024335

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

image-20240318155210703

周转时间

image-20240318155232797

带权周转时间

image-20240318155238849

等待时间

image-20240318155333645

注意:本例中的进程都是纯计算型的进程,一个进程到达后要么在等待,要么在运行。如果是又有计算、又有1/0操作的进程,其等待时间就是周转时间-运行时间1/0操作的时间

平均周转时间/带权周转时间/平均等待时间

image-20240318155617112

短作业优先SJF

image-20240318170826280

image-20240318170118013

严格来说,用于进程调度应该称为短进程优先调度算法(SPF)

image-20240318170133356

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

image-20240318170157003

注意,不是运行时间最短就先走,要先看到没到达!!!

指标计算

image-20240318170222301

对比FCFS算法的结果,显然SPF算法的平均等待/周转/带权周转时间都要更低

抢占式版本:最短剩余时间优先算法:

每当有进程加入就绪队列改变时就需要调度,

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

需要注意的是,当有新进程到达时就绪队列就会改变,就要按照上述规则进行检查。以下P, (m)表示当前P,进程剩余时间为m。各个时刻的情况如下:

image-20240318170503379

image-20240318170519311

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

指标计算

image-20240318170607597

提醒

  1. 如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式

  2. 很多书上都会说"SJF调度算法的平均等待时间、平均周转时间最少”严格来说,这个表述是错误的,不严谨的。

    之前的例子表明,最短剩余时间优先算法得到的平均等待时间、平均周转时间还要更少应该加上一个条件“在所有进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少”;

    或者说“在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少”

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

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

FCFS vs SJF

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

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

高响应比优先HRRN

image-20240318170935601

算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务

image-20240318171007622

image-20240318171020147

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

image-20240318171053934

image-20240318171141454

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

image-20240318171213768

对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题

image-20240318171257988

image-20240318171305637

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

调度算法(交互式系统)

image-20240318171411331

Tips:各种调度算法的学习思路

  1. 算法思想
  2. 算法规则
  3. 这种调度算法是用于作业调度还是进程调度?
  4. 抢占式?非抢占式?
  5. 优点和缺点
  6. 是否会导致饥饿

时间片轮转RR

image-20240318172256834

image-20240318171611180

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

时间片轮转调度算法:轮流让就绪队列中的进程依次执行一个时间片(每次选择的都是排在就绪队列队头的进程)

时间片大小为2

(注:以下括号内表示当前时刻就绪队列中的进程、进程的剩余运行时间)

image-20240318171802219

image-20240318171905737

image-20240318171926724

时间片大小为5

image-20240318172048198

image-20240318172059702

↑与FCFS差不多哦

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

比如:系统中有10个进程在并发执行,如果时间片为1秒,则一个进程被响应可能需要等9秒…也就是说,如果用户在自己进程的时间片外通过键盘发出调试命令,可能需要等待9秒才能被系统响应

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

优先级调度算法

算法规则:每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程

image-20240318172832051

非抢占式优先级调度

image-20240318172343827

image-20240318172349570

image-20240318172358235

image-20240318172426592

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

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

另外,当就绪队列发生改变时也需要检查是会发生抢占。

image-20240318172523802

image-20240318172613228

补充

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

根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种。

静态优先级:创建进程时确定,之后一直不变。

动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。

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

image-20240318172719453

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

如果采用的是动态优先级,什么时候应该调整?

多级反馈队列调度算法

image-20240318175104183

image-20240318175822548

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

image-20240318175201318

image-20240318175210003

image-20240318175214676

新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片。

用完时间片进程还未结束,则进程进入下一级队列队尾。

如果此时已经在最下级的队列,则重新放回最下级队列队尾

image-20240318175314715

只有第 k 级队列为空时,才会为 k+1 级队头的进程分配时间片:

image-20240318175353452

执行两个时间片,但是还没执行完。继续放到第三级队列!

image-20240318175426272

但是这个时候P3进入第一级队列,此时p2还没运行完。被抢占处理机的进程重新放回原队列队尾,p3抢占

image-20240318175541675

image-20240318175702250

image-20240318175710434

没有其他进程了,P1会一直在第三级队列。

image-20240318175833177

注:比起早期的批处理操作系统来说,由于计算机造价大幅降低,因此之后出现的交互式操作系统(包括分时操作系统、实时操作系统等)更注重系统的响应时间、公平性、平衡性等指标。而这几种算法恰好也能较好地满足交互式系统的需求。因此这三种算法适合用于交互式系统。(比如UNIX使用的就是多级反馈队列调度算法)

多级队列调度算法

系统中按进程类型设置多个队列,进程创建成功后插入某个队列

image-20240318175959583

image-20240318180006702

image-20240318180013078

posted @ 2024-04-07 17:52  晓梦ペ  阅读(41)  评论(0)    收藏  举报