操作系统之进程调度

这周学校布置了关于操作系统的知识点论文,正好也写篇博客来好好分析一下关于进程调度的知识点。

调度的基本概念

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

调度的三个层次

高级调度

由于内存空间有限,有时无法将用户的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。

高级调度(作业调度)。按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它们获得竞争处理机的权利。高级调度使辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

中级调度

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

中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。

一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。

低级调度

低级调度(进程调度),其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。

进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。

进程调度的频率很高,一般几十毫秒一次。

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

进程调度的方式

非抢占方式

只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。

抢占方式

当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。

进程调度中的这两种方式决定了调度中时间的改变。

调度算法的评价指标

CPU利用率 = 忙碌的时间/总时间

系统吞吐量 = 总共完成了多少道作业/总共花了多少时间

周转时间 = 作业完成时间 - 作业提交时间(到达时间)

平均周转时间 = 各作业周转时间之和 / 作业数

带权周转时间 = 作业周转时间/作业实际运行的时间

平均带权周转时间 = 各作业带权周转时间之和/作业数

这些名词可以衡量一个进程调度过程中,是否能达到一个高效的过程。时间的分配是否合理。但是这些也并不是都是绝对的。因为考虑到有些进程的调度有其他因素的考虑,所以我们只是将其作为一个参考。

调度算法

先来先服务(FCFS)

先来先服务算法:主要从“公平”的角度考虑(类似于我们生活中排队买东西的例子)。一种非抢占式的算法。

它主要按照作业/进程到达的先后顺序进行服务。等待时间越久的越优先得到服务。用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列。对长作业有利,对短作业不利

进程 到达时间 运行时间
P1 0 7
P2 2 4
P3 4 1
P4 5 4

调度顺序为:P1→P2→P3→P4

在这里插入图片描述

短作业优先(SJF)

短作业优先算法:追求最少的平均等待时间,最少的平均周转时间,最少的平均带权周转时间。所谓“最短”就是要求服务时间最短。即可用于作业调度,也可用于进程调度。它具有非抢占式和抢占式。

非抢占式:每次调度时选择已到达且运行时间最短的作业/进程

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

调度顺序为:P1→P3→P2→P4
在这里插入图片描述

高响应比优先(HRRN)

**高响应比优先算法:**要综合考虑作业/进程的等待时间和要求服务的时间

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

响应比 = (等待时间 + 要求服务时间)/ 要求服务时间(响应比 >= 1)

即可作业调度也可进程调度。它是一种非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机(CPU)时,才需要调度,才需要计算响应比。调度时计算所有就绪进程的响应比,玄响应比最高的进程上处理机。看下面例子:

进程 到达时间 运行时间
P1 0 7
P2 2 4
P3 4 1
P4 5 4

0时刻:只有P1到达就绪队列,P1上处理机

7时刻(P1主动放弃CPU):就绪队列中有P2(响应比=(5+4)/4=2.25)、P3((3 + 1) / 1 =3)、P4((2 + 4)/4 = 1.5),P3的响应比高,所以P3上处理机

8时刻(P3完成):P2(2.5),p4(1.75)P2高,P2上处理机

12时刻(P2完成):就绪队列中只剩下P4.这时候P4上处理机

算法 可抢占? 优点 缺点 考虑到等待时间&运行时间 会导致饥饿?
FCFS 非抢占 实现简单 对短作业不利 1,0 不会
SJF/SPF 默认为非抢占式,但也有抢占式 最短的平均等待/周转时间 对长作业不利,可能导致饥饿;难以做到真正的短作业优先 0,1
HRRN 非抢占 上述两种算法的权衡折中,综合考虑的等待时间和运行时间 1,1 不会

注:1为考虑到,0为没有考虑到

以上这三种算法一般适合于早期的批处理系统。下面的算法适合于交互式系统的调度算法。

时间片轮转调度算法

**时间片轮转算法:**公平地、轮流地为各个进程服务,让每个进程在一定时间隔内都可以得到响应。按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms),若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。

只用于进程调度,只有作业放入内存建立了相应的进程后,才能被分配处理机时间片。该算法也属于抢占式算法,由时钟装置发出时钟中断,来通知CPU时间片已到。轮流让就绪队列中的进程依次执行一个时间片(每次选择的都是排在就绪队列队头的进程)。

进程 到达时间 运行时间
P1 0 5
P2 2 4
P3 4 1
P4 5 6

在这里插入图片描述

时间片的大小为2。

0时刻(P1(5)):0时刻只有P1到达就绪队列,让P1上处理机运行一个时间片

2时刻(P2(4)→P1(3)):2时刻P2到达就绪队列,P1运行完一个时间片,被剥夺处理机,重新放到队尾。此时P2排在队头,因此让P2上处理机。(注意:2时刻,P1下处理机,同一时刻新进程P2到达,如果在题目中遇到这种情况,默认新到达的进程先进入就绪队列)

4时刻(P1(3)→P3(1)→P2(2)):4时刻,P3到达,先插到就绪队尾,紧接着,P2下处理机也插到队尾

5时刻(P3(1)→P2(2)→P4(6)):5时刻,P4到达插到就绪队尾(注意:由于P1的时间片还没用完,因此P1重新排到就绪队列之后,等到执行)

6时刻(P3(1)→P2(2)→P4(6)→P1(1)):6时刻,P1时间片用完,下处理机,重新放回就绪队尾,发生调度

7时刻(P2(2)→P4(6)→P1(1)):虽然P3的时间片没用完,但是由于P3只需运行1个单位的时间,运行完了会主动放弃处理机,因此也会主动放弃处理机,因此也会发生调度。队头进程P2上处理机。

9时刻(P4(6)→P1(1)):进程P2时间片用完,并刚好运行完,发生调度,P4上处理机

11时刻(P1(1)→P4(4)):P4时间片用完,重新回到就绪队列,P1上处理机

12时刻(P4(4)):P1运行完,主动放弃处理机,此时就绪队列中只剩P4,P4上处理机

14时刻():就绪队列为空,因此让P4接着运行一个时间片

16时刻:所有进程运行结束

优先级调度算法

**优先级调度算法:**每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程。即可用于作业调度,也可用于进程调度。

**非抢占式:**只需在进程主动放弃处理机时进行调度即可,每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度

在这里插入图片描述

**抢占式:**需要在就绪队列变化时,检查是否会发生抢占。每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。另外,当就绪队列改变时也需要检查是否会发生抢占。
在这里插入图片描述
0时刻(P1):只有P1到达,P1上处理机

2时刻(P2):P2到达就绪队列,优先级比P1更高,发生抢占。P1回到就绪队列,P2上处理机

4时刻(P1、P3):P3到达,优先级比P2更高,P2回到就绪队列,P3抢占处理机

5时刻(P1、P2、P4):P3完成,主动释放处理机,同时,P4也到达,由于P2比P4更先进入就绪队列,因此选择P2上处理机

7时刻(P1、P4):P2完成,就绪队列只剩P1、P4,P4上处理机。

11时刻(P1):P4完成,P1上处理机。

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

以上就是关于操作系统进程调度的基本定义和算法。毕竟CPU是计算机的核心,它具有对我们的进程进行分配的一个过程。可以看作是OS中关键的部分。比如我们日常生活中又想听歌又想敲代码。这时候我们的CPU就要对我们的这个行为进行一个分配管理。通过一个学期的学习,OS让我更加对计算机和编程有了更大兴趣。也真的更加看到了自己的不足。想真正成为一个大佬还差得十万八千里呢。所以,从现在脚踏实地的做起吧。

猜你喜欢

转载自blog.csdn.net/skrskr66/article/details/85947583