处理机调度

一.处理机调度

在这里插入图片描述

一.基本概念

处理机调度:就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。因为在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。

二.调度的三个层次

一.高级调度

在这里插入图片描述

高级调度(作业调度):按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利。因为内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。

高级调度是辅存(外存)与内存之间的调度:每个作业只调入一次,调出一次。**作业调入时会建立相应的PCB,作业调出时才撤销PCB。**高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

二.中级调度

在这里插入图片描述

虚拟存储技术:可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。目的是为了提高内存利用率和系统吞吐量

在这里插入图片描述
暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。

在这里插入图片描述
中级调度(内存调度):就是要决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。

三.低级调度

在这里插入图片描述
低级调度(进程调度):其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。

三.进程七状态模型

在这里插入图片描述
就绪态——>就绪挂起态:处于就绪态进程,如果此时系统的负载比较高、内存空间不足,那么系统就可能暂时将该进程放入外存中,进入了就绪挂起态
就绪挂起态——>就绪态:系统内存内存空间足够了,或者即时要用该进程了,就会将该就绪挂起态的进程重新激活,调入到内存中,变成就绪态
阻塞挂起态——>就绪挂起态:事件发生,有些系统会将对应的处于阻塞挂起态的进程,会直接变成就绪挂起态
运行态——>就绪挂起态:有时候,运行态的进程处理完毕后,该进程下处理机时,会直接被放入外存中,进入就绪挂起态
创建态——>就绪挂起态:当一个创建态进程创建完毕后,有可能系统内存空间不足,就会被先放入外存,进入就绪挂起态

注意:“挂起”和“阻塞”的区别,两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因不同再把阻塞挂起进程进一步细分为多个队列。

四.三个层次调度的联系、对比

调度处理调度发生时间发生频率对进程状态的影响
高级调度(作业调度)按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程外存->内存(面向作业)最低无→创建态→就绪态
中级调度(内存调度)按照某种规则,从挂起队列中选择合适的进程将其数据调回内存外存->内存(面向进程)中等挂起态→就绪态(阻塞挂起→阻塞态)
低级调度(进程调度)按照某种规则,从就绪队列中选择一个进程为其分配处理机内存->CPU最高就绪态→运行态

二.进程调度的时机切换与过程调度方式

在这里插入图片描述

一.进程调度的时机

1.需要进程调度与切换的情况

  • 当前运行的进程主动放弃处理机,如正常终止、运行过程中发生异常而终止、主动请求阻塞
  • 当前运行的进程被动放弃处理机,如分配的时间片用完、更紧急的事需要处理(如IO中断)、有更高优先级的进程进入就绪队列

2.不能进行进程调度与切换的情况

  • 在处理中断的过程中,中断处理过程赋值,与硬件密切相关,很难做到在中断处理过程中进行进程切换
  • 进程在操作系统内核程序临界区中,内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)
  • 在原子操作过程中(原语)。原子操作不可中断,要一气呵成(如改PCB中进程状态标志,并把PCB放到相应队列)

二.进程的调度方式

1.非剥夺调度方式:又称非抢占方式,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统。

2.剥夺调度方式:又称抢占方式,当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统。

三.进程的切换与过程

“狭义的进程调度”与“进程切换”的区别:狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)。

广义的进程调度:包含选择一个进程和进程切换两个步骤。

进程切换的过程主要完成了:

  • 对原来运行进程各种数据的保存
  • 对新的进程各种数据的恢复(如,程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)

注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。

三.调度算法的评价指标

在这里插入图片描述
1.CPU利用率:CPU忙碌时间 ÷ 总时间,让CPU尽可能多地工作

2.系统吞吐量:总共完成作业量 ÷ 总时间,能用尽可能少的时间处理完尽可能多的作业

3.周转时间:作业完成时间 - 作业提交时间

包括四个部分(后三项在一个作业的整个处理过程中,可能发生多次):

  • 作业在外存后备队列上等待作业调度(高级调度)的时间
  • 进程在就绪队列上等待进程调度(低级调度)的时间
  • 进程在CPU上执行的时间
  • 进程等待IO操作完成的时间

4.平均周转时间:各作业周转时间之和 ÷ 作业数

5.带权周转时间(越小越好):作业周转时间 ÷ 作业实际运作时间 == (作业完成时间 - 作业提交时间)÷ 作业实际运行时间

6.平均带权周转时间:各作业带权周转时间之和 ÷ 作业数

7.等待时间:周转时间 - 运行时间 - IO操作等待时间,进程/作业处于等待处理机状态时间之和。

  • 对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待IO完成的期间其实进程也是在被服务的,所以不计入等待时间。
  • 对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。

8.响应时间:从用户提交请求到首次产生响应所用的时间

四.调度算法

在这里插入图片描述

一.先来先服务(FCFS)

思想:主要从“公平”的角度考虑(类似于我们生活中排队买东西的例子)

算法规则:按照作业/进程到达的先后顺序进行服务

用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列

是否可抢占:非抢占

优点:公平、算法简单

缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好,FCFS算法对长作业有利,对短作业不利

是否会饥饿:不会

一.例子

在这里插入图片描述
周转时间: P1=7-0=7,P2=11-2=9,P3=12-4=8,P4=16-5=11
带权周转时间: P1=7/7=1,P2=9/4=2.25,P3=8/1=8,P4=11/4=2.75
等待时间: P1=7-7=0,P2=9-4=5,P3=8-1=7,P4=11-4=7
平均周转时间: (7+9+8+11)/4 = 8.75
平均带权周转时间: (1+2.25+8+2.75)/4 = 3.5
平均等待时间: (0+5+7+7)/4 = 4.75

二.短作业优先(SJF)

思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间

算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)

用于作业/进程调度:既可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF,Shortest Process First)算法”

是否可抢占:SJF和SPF是非抢占式的算法。但是也有抢占式的版本,最短剩余时间优先算法(SRTN,Shortest Remaining Time Next)

优点:“最短的”平均等待时间、平均周转时间

缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先

是否会饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”

一.SJF非抢占式例子

在这里插入图片描述
周转时间: P1=7-0=7,P3=8-4=4,P2=12-2=10,P4=16-5=11
带权周转时间: P1=7/7=1,P3=4/1=4,P2=12/4=3,P4=11/4=2.75
等待时间: P1=7-7=0,P3=4-1=3,P2=12-4=8,P4=11-4=7
平均周转时间: (7+4+10+11)/4=8
平均带权周转时间: (1+4+3+2.75)/4 = 2.68
平均等待时间: (0+3+8+7)/4 = 4.5

二.最短剩余时间优先算法例子

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

在这里插入图片描述
周转时间: P1=16-0=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
平均周转时间: (16+5+1+6)/4 = 7
平均带权周转时间: (2.28+1.25+1+1.25)/4 = 1.5
平均等待时间: (9+1+0+2)/4 = 3

三.高响应比优先(HRRN)

思想:要综合考虑作业/进程的等待时间和要求服务的时间

算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务;响应比 = (等待时间+要求服务时间)÷ 要求服务时间

用于作业/进程调度:既可用于作业调度,也可用于进程调度

是否可抢占:非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比

优点:综合考虑了等待时间和运行时间(要求服务时间)

  • 等待时间相同时,要求服务时间短的优先(SJF的优点)
  • 要求服务时间相同时,等待时间长的优先(FCFS的优点)
  • 对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题

缺点:无

是否会饥饿:不会

一.例子

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

在这里插入图片描述

四.时间片轮转(RR)

思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应,一般应用于分时操作系统

算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。

用于作业/进程调度:用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)

是否可抢占:若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知CPU时间片己到

优点:公平、响应快,适用于分时操作系统

缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。

是否会饥饿:不会

一.例子

时间片轮转调度算法:轮流让就绪队列中的进程依次执行一个时间片(每次选择的都是排在就绪队列队头的进程)
在这里插入图片描述
如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大。

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

五.优先级调度算法

思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序

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

用于作业/进程调度:既可用于作业调度,也可用于进程调度。甚至,还会用于在之后会学习的IO调度中

是否可抢占:抢占式、非抢占式都有。区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。

优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。

缺点:若源源不断地有高优先级进程到来,则可能导致饥饿

是否会饥饿:会

一.非抢占式例子

非抢占式的优先级调度算法:每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。
在这里插入图片描述

二.抢占式例子

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

在这里插入图片描述

三.补充

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

  • 静态优先级:创建进程时确定,之后一直不变。
  • 动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。系统进程优先级高于用户进程、前台进程优先级高于后台进程、操作系统更偏好lO型进程(或称IO繁忙型进程)、与IO型进程相对的是计算型进程(或称CPU繁忙型进程)

动态优先级调整时机:可以从追求公平、提升资源利用率等角度考虑

  • 如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级
  • 如果某进程占用处理机运行了很长时间,则可适当降低其优先级
  • 如果发现一个进程频繁地进行I/o操作,则可适当提升其优先级

六.多级反馈队列调度算法

思想:对其他调度算法的折中权衡

算法规则

  • 1.设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
  • 2.新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
  • 3.只有第k级队列为空时,才会为k+1级队头的进程分配时间片

用于作业/进程调度:用于进程调度

是否可抢占:抢占式的算法。在k级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾。

优点

  • 对各类型进程相对公平(FCFS的优点)
  • 每个新到达的进程都可以很快就得到响应(RR的优点)
  • 短进程只用较少的时间就可完成(SPF的优点)
  • 不必实现估计进程的运行时间(避免用户作假)
  • 可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、lO密集型进程(拓展:可以将因IO而阻塞的进程重新放回原队列,这样IO型进程就可以保持较高优先级)

缺点:若源源不断的进程进入优先级高的队列,那么已经被降级的进程长期得不到处理,可能导致饥饿

是否会饥饿:会

一.例子

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

规则

  • 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片。
  • 若用完时间片进程还未结束,则进程进入下一级队列队尾。
  • 如果此时已经在最下级的队列,则重新放回最下级队列队尾
  • 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
  • 优先级高的队列有进程后,会抢占处理机,被抢占处理机的进程重新放回原队列队尾
    在这里插入图片描述
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愛沢かりん

感谢您对我的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值