作业调度
- 引入
- 先来先服务调度算法
- 短作业优先调度算法
- 非抢占式
- 抢占式
- 高响应比优先调度算法
引入
用一道题目来引出这个知识点
进程 | 到达时间 | 服务时间 |
---|---|---|
A | 0 | 3 |
B | 2 | 6 |
C | 4 | 4 |
D | 6 | 5 |
E | 8 | 2 |
用目录中的四种调度算法分别求出相对应的平均带权周转时间
- 先用通俗的语言描述一下周转时间,用这道题目做例子, A A A到达时间为0,服务时间为3,如果系统立刻处理 A A A,那么它的周转时间就是 3 − 0 = 3 3-0=3 3−0=3,当然事情并不是这么简单的,如果说 A A A到达了,但是它不能够被立刻处理,那么它就需要等待,等待的这段时间也是周转时间,如果 A A A的到达时间为 a a a,服务时间为 b b b,完成时间为 c c c,那么周转时间为 c − a c-a c−a,和 b b b无关,这样应该能够理解, b b b相当于权重,影响平均带权周转时间,在后面给出公式
- 关于周转时间的定义,它指的是从作业被提交给系统开始到作业完成为止这段时间间隔叫做作业的周转时间,那么它包括哪些部分呢?请看下面这道题目
某作业在外存后备队列上等待调度的时间为T1,进程在就绪队列上等待进程调度的时间为T2,进程在CPU上执行的时间为T3,进程等待I/O操作完成的时间为T4,那么作业的周转时间是指:
A、T1+T2+T3
B、T1+T2+T4
C、T2+T3+T4
D、T1+T2+T3+T4
- 这道题选择 D D D选项,作业周转时间就包括这四部分,书上原话是这样说的:它包括四部分时间,作业在外存后备队列上等待(作业)调度的时间,进程在就绪队列上等待进程调度的时间,进程在 C P U CPU CPU上执行的时间,以及进程等待 I / O I/O I/O操作完成的时间。其中的后三项在一个作业的整个处理过程中,可能发生多次
关于平均和平均带权周转时间,如果说设第 i i i个系统的周转时间为 T i T_i Ti,那么平均周转时间 T T T的表达式为 T = 1 n × ∑ i = 1 n T i T=\frac{1}{n}\times \sum_{i=1}^nT_i T=n1×i=1∑nTi设系统为第 i i i个作业提供服务的时间为 T i s T_{is} Tis,那么平均带权周转时间为 W = 1 n ∑ i = 1 n T i T i s W=\frac{1}{n}\sum_{i=1}^{n}\frac{T_i}{T_{is}} W=n1i=1∑nTisTi
- 虽然看起来不好理解但是为了简便,没办法只能这么写,在后面的算法计算中可以深入理解和巩固
先来先服务调度算法
- 先来先服务 ( f i r s t − c o m e f i r s t − s e r v e d ) (first-come \ first-served) (first−come first−served),简写为 F C F S FCFS FCFS调度算法,很简单,就是按照到达时间按照顺序排列,先到的先服务,那么对于开始的那个例子,我们计算出进程完成时间和任务周转时间列出表格如下
进程 | 到达时间 | 服务时间 | 完成时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|
A | 0 | 3 | 3 | 3 | 1 |
B | 2 | 6 | 9 | 7 | 1.17 |
C | 4 | 4 | 13 | 9 | 2.25 |
D | 6 | 5 | 18 | 12 | 2.4 |
E | 8 | 2 | 20 | 12 | 6 |
平均周转时间为
3
+
7
+
9
+
12
+
12
5
=
8.6
\frac{3+7+9+12+12}{5}=8.6
53+7+9+12+12=8.6
平均带权周转时间为
1
+
1.17
+
2.25
+
2.4
+
6
5
≈
2.56
\frac{1+1.17+2.25+2.4+6}{5}\approx 2.56
51+1.17+2.25+2.4+6≈2.56
- 简单说一下完成时间的计算,以 B B B为例,因为 A A A是第一个接下来就是 B B B, A A A完成时间为3,那么B的开始时间就是3,所以完成时间是 3 + 6 = 9 3+6=9 3+6=9
短作业优先调度算法
短作业优先 ( s h o r t j o b f i r s t ) (short \ job\ first) (short job first),简写为 S J F SJF SJF
- 很显然,让一个非常长的作业首先执行是一个愚蠢的决定,执行时间短的作业显然放在前面执行更好,所以就产生了短作业优先调度算法
- 短作业的短指的是执行时间的短,也就是表格里面的服务时间,从任务到达时间开始,先到达的要遵循 F C F S FCFS FCFS,这个算法的关键在于如果有多个任务都已经到达,谁先来执行, S J F SJF SJF算法要求服务时间短的先执行
非抢占式
- 先说一下简单的非抢占式,最开始先到的先得到服务,结束之后,看已经到达的进程谁的服务时间最短,就让谁先得到服务,对于上面的例子列表如下
进程 | 到达时间 | 服务时间 | 完成时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|
A | 0 | 3 | 3 | 3 | 1 |
B | 2 | 6 | 9 | 7 | 1.17 |
C | 4 | 4 | 15 | 11 | 2.75 |
D | 6 | 5 | 20 | 14 | 2.8 |
E | 8 | 2 | 11 | 3 | 1.5 |
- 简单说一下, A A A完成的时候, B B B已经到达,这个时候显然需要 B B B开始,由于不是非抢占式,每个进程如果开始就必须持续做直到做完,所以 B B B结束的时候也就是第 9 9 9个时间点,这时, C D E CDE CDE都已经到达,那么应该开始谁的服务呢?因为 E E E的服务时间最短,所以应该让 E E E继续,剩下同理
抢占式
- 抢占式调度方式可以解决进程急切性的问题,因为可能有些进程是比较紧迫的,需要立刻完成,但是在它之前还有一些其他进程,这时候就需要进行进程抢占,在 S J F SJF SJF调度算法中,进程抢占的条件是如果当前到达的进程 p 1 p_1 p1所需要的服务时间小于正在进行的进程 p 2 p_2 p2,那么 p 1 p_1 p1抢占 p 2 p_2 p2, p 2 p_2 p2保留需要服务的剩余时间,进入等待
- 计算带权周转时间为了直观起见,还是需要列表,辅助线段图可以更好的理解,上面例子使用抢占式调度算法列表如下
进程 | 到达时间 | 服务时间 | 完成时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|
A | 0 | 3 | 3 | 3 | 1 |
B | 2 | 6 | 15 | 13 | 2.17 |
C | 4 | 4 | 8 | 4 | 1 |
D | 6 | 5 | 20 | 14 | 2.8 |
E | 8 | 2 | 10 | 2 | 1 |
- 表格解释: A A A结束之后, B B B要开始,执行到第四个时间点的时候, C C C到达,那么 B B B这个时候已经执行了1个时间,还剩下5个服务时间, C C C需要4个服务时间,所以 C C C抢占 B B B, C C C结束以后, E E E开始执行,结束以后,发现 B B B和 D D D需要服务时间一样,那么应该让先到的进程 B B B继续执行,最后进行 E E E的执行
高响应比优先调度算法
高响应比优先调度算法
(
H
i
g
h
e
s
t
R
e
s
p
o
n
s
e
R
a
t
i
o
N
e
x
t
)
(Highest\ Response\ Ratio\ Next)
(Highest Response Ratio Next),简写为
H
R
R
N
HRRN
HRRN
在前面的
F
C
F
S
FCFS
FCFS调度算法中,仅仅考虑的是作业的等待时间,没有考虑作业的运行时间;而在
S
J
F
SJF
SJF调度算法中,考虑的是作业的运行时间,没有考虑作业的等待时间,这种单一考虑问题的方式需要改变
- 高响应比优先调度算法不仅考虑作业的运行时间,也考虑作业的等待时间,因为它提出了一个优先级的概念
优
先
级
=
等待时间+要求服务时间
要求服务时间
优先级=\frac{\text{等待时间+要求服务时间}}{\text{要求服务时间}}
优先级=要求服务时间等待时间+要求服务时间
优先级高的先调度,其中等待时间+要求服务时间 = = =系统对该作业的响应时间,公式可改成 优 先 级 = 响应时间 要求服务时间 优先级=\frac{\text{响应时间}}{\text{要求服务时间}} 优先级=要求服务时间响应时间
可以发现此算法好的地方在于随着等待时间的增加,作业优先级也在增加,所以可以使得等待时间很长的作业能有机会执行 - 同样还用那个例子来列表,得到表格如下
进程 | 到达时间 | 服务时间 | 完成时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|
A | 0 | 3 | 3 | 3 | 1 |
B | 2 | 6 | 9 | 7 | 1.17 |
C | 4 | 4 | 13 | 9 | 2.25 |
D | 6 | 5 | 20 | 14 | 2.8 |
E | 8 | 2 | 15 | 7 | 3.5 |
- 注意一点,此算法并非抢占,只要不是抢占调度,就必须一个一个的来,这个执行完毕才能执行下一个