文章目录
1. 基本概念
1.1 什么是CPU调度
调度程序在就绪队列中选择一个进程,让它在CPU上执行
(调度程序 + 分派程序)
1.2 抢占调度
CPU调度会在四种环境下发生
(1)进程从运行状态切换到阻塞状态(例如:IO请求)
(2)进程从运行状态切换到就绪状态(例如:发生中断)
(3)进程从阻塞状态切换到就绪状态(例如:IO完成)
(4)进程终止
问题:选择与调度
在(1)(4)情况下,没有选择只有调度
在(2)(3)情况下,即就绪队列有进程存在时,可以进行选择
1. 非抢占调度
定义
进程在CPU上执行时,会一直使用CPU资源直到进程结束或切换到阻塞状态(情况(1)(4))
2. 抢占调度
定义
会剥夺原在CPU上执行的进程对CPU资源的使用权(情况(2)(3))
3. 分派程序
定义
用来将CPU的控制交给调度程序选择的进程
功能
① 切换上下文
② 切换到用户模式
③ 跳转到用户程序的合适位置,以重新启动程序
2. 调度准则
提出的一些准则用于衡量调度算法的好坏
最大化
(1)CPU利用率:
(2)吞吐量:单位时间完成进程的数量
最小化
(1)等待时间:进程在就绪队列中等待的时间
(2)响应时间:从提交请求到开始响应的时间(包括:等待进入内存+在就绪队列中等待)
(3)周转时间:从提交请求到进程完成的时间(包括:等待进入内存+在就绪队列等待+在CPU上执行和IO执行)
计算方法
(1)等待时间:
① 一段:开始时间 - 到达时间
② 多段:结束时间 - 执行时间 - 到达时间
理解:从进程到达就绪队列后到进程执行结束前,进程不是在运行,就是在等待。因此
问题:CPU调度算法会改变进程运行和执行I/O的时间吗?
解答:不会。调度算法只影响进程在就绪队列等待的时间
3. 调度算法
3.1 先到先服务调度(FCFS)
定义
先请求CPU的进程先分配CPU(非抢占型)
优点
可以通过FIFO队列很容易地实现
缺点
(1)如果进程CPU区间时间变化很大时,平均等待时间变化也很大
(不同CPU区间时间的进程的执行顺序变化)
(2)护航效应:当大进程最先执行时,所有其他进程等待大进程释放CPU、I/O设备空闲,CPU和设备的利用率较低
Gantte图
1.平均等待时间:
(
0
+
24
+
27
)
3
=
17
\frac{(0+24+27)}{3}=17
3(0+24+27)=17
2.周转时间:
(
24
+
27
+
30
)
3
=
27
\frac{(24+27+30)}{3}=27
3(24+27+30)=27
3.吞吐量:
3
30
=
0.1
\frac{3}{30}=0.1
303=0.1
3.2 最短作业优先(SJF)
定义
当CPU空闲时,它会赋给具有最短CPU区间的进程。当两个进程具有相同长度时,采用FCFS调度(非抢占)
优点
最优调度算法,SJF的平均等待时间最少
困难
下一CPU区间长度的计算
① 长期调度:可以将用户提交作业时所指定的进程时间极限作为长度
② 短期调度:指数平均
下一个CPU区间通常可以预测为以前CPU区间的测量长度的指数平均
τ
n
+
1
=
α
t
n
+
(
1
−
α
)
τ
n
τ
n
+
1
=
α
t
n
+
α
(
1
−
α
)
t
n
−
1
+
⋯
+
(
1
−
α
)
n
+
1
τ
0
\tau_{n+1}=\alpha t_n+(1-\alpha)\tau_n \\ \tau_{n+1}=\alpha t_n+\alpha(1-\alpha)t_{n-1}+\dots+(1-\alpha)^{n+1}\tau_0
τn+1=αtn+(1−α)τnτn+1=αtn+α(1−α)tn−1+⋯+(1−α)n+1τ0
由于
α
,
(
1
−
α
)
\alpha,(1-\alpha)
α,(1−α)小于或等于1,更早信息的权重更小
Gantte图
1.平均等待时间:
(
0
+
3
+
9
+
16
)
4
=
7
\frac{(0+3+9+16)}{4}=7
4(0+3+9+16)=7
2.周转时间:
(
3
+
9
+
16
+
24
)
4
=
13
\frac{(3+9+16+24)}{4}=13
4(3+9+16+24)=13
3.吞吐量:
4
24
=
1.67
\frac{4}{24}=1.67
244=1.67
3.3 最短剩余时间优先调度(抢占型SJF)
定义
抢占型SJF,若一个新进程比当前运行进程有一个更短的CPU区间,则抢占当前运行的进程
Gantte图
1.平均等待时间:
(
(
10
−
1
)
+
(
1
−
1
)
+
(
5
−
3
)
+
(
17
−
2
)
)
4
=
6.5
\frac{((10-1)+(1-1)+(5-3)+(17-2))}{4}=6.5
4((10−1)+(1−1)+(5−3)+(17−2))=6.5
(开始时间 - 到达时间)
2.周转时间:
(
(
17
−
0
)
+
(
5
−
1
)
+
(
26
−
2
)
+
(
)
10
−
3
)
4
=
13
\frac{((17-0)+(5-1)+(26-2)+()10-3)}{4}=13
4((17−0)+(5−1)+(26−2)+()10−3)=13
3.吞吐量:
4
26
\frac{4}{26}
264
3.4 优先级调度(SJF)
定义
每个进程都有一个优先级,具有最高优先级的进程分配到CPU,具有相同优先级的按照FCFS处理(抢占/非抢占)
优先级
优先级可通过内部或外部方式定义
问题
饥饿:优先级调度会使某个低优先级进程无限等待
老化:逐渐增加在系统中等待很长时间的进程的优先级
Gantte图
考虑下面一组进程,它们在时间0按顺序
P
1
,
P
2
,
…
,
P
5
P_1,P_2,\dots,P_5
P1,P2,…,P5到达:
1.平均等待时间:
(
0
+
1
+
6
+
16
+
18
)
5
=
8.2
\frac{(0+1+6+16+18)}{5}=8.2
5(0+1+6+16+18)=8.2
2.周转时间:
(
1
+
6
+
16
+
18
+
19
)
5
=
12
\frac{(1+6+16+18+19)}{5}=12
5(1+6+16+18+19)=12
3.吞吐量:
5
19
\frac{5}{19}
195
3.5 轮转法调度(RR)
定义
定义一个较小的时间单元时间片,遍历循环队列为每个进程分配不超过一个时间片的CPU(可抢占)
实现
设置定时器在一个时间片后中断,发生上下文切换,将进程加入到队列尾部。接着CPU调度程序会选择就绪队列的下一个进程
可抢占
如果进程的CPU区间超过一个时间片,该进程就会被抢占。
优缺点
是专门为分时系统设计的,但等待时间通常较长。每个进程必须等待的CPU时间不会超过(n-1)q
时间片大小与上下文开销
① 如果时间片过大,就相当于FCFS
②== 如果时间片过小,会产生额外的上下文切换开销,相应的进程执行减慢==
③ 如果绝大多数进程在一个时间片内完成,则平均周转时间会改善
Gantte图
1.平均等待时间:
(
4
+
7
+
(
10
−
4
)
)
3
=
5.66
s
\frac{(4+7+ (10-4))}{3}=5.66s
3(4+7+(10−4))=5.66s
析: P2,P3的等待时间分别为4和7,而由于10s后仅P1在CPU上执行,因此再次发生的进程的等待时间=再次开始时间-初次结束时间=10-4=6
或者使用结束时间 - 开始时间 - 区间时间 = 等待时间
2.周转时间:
(
30
+
7
+
10
)
3
=
15.66
s
\frac{(30+7+10)}{3}=15.66s
3(30+7+10)=15.66s
3.吞吐量:
3
30
=
0.1
\frac{3}{30}=0.1
303=0.1
3.6 多级队列调度
定义
将就绪队列分成多个独立队列,每个进程被用就分配到一个队列。每个队列有自己的调度算法
队列间调度
固定优先级抢占调度:每个队列比较低层队列有绝对的优先级
优点
低调度开销
缺点
不够灵活,进程不能从一个队列转移到另一个队列
3.7 多级反馈队列调度
定义
允许进程在队列之间移动
主要思想
根据不同CPU区间以区分进程。如果进程使用过多CPU区间,它会被转移到较低优先级队列。如果在较低优先级队列中等待时间过长,进程会转移到更高优先级队列。
特点
最通用的CPU调度算法。不过需要选择参数以确定最佳的调度程序,也是最复杂的算法
4. 多处理器调度
4.1 多处理器的调度方法
(1)非对称多处理
让一个处理器(主服务器)处理所有调度决定、I/O处理以及其他系统活动,其他处理器只执行用户代码
(2)对称多处理
每个处理器检查共同的就绪队列并选择一个进程执行
4.2 处理器的亲和性
定义
试图避免进程从一个处理器转移到另一个处理器,而努力使一个进程在同一处理器上执行
分类
(1)软亲和性
(2)硬亲和性:指定进程不允许移动到其他处理器
4.3 负载平衡
定义
将工作负载平均分配到SMP系统中所有处理器上
方式
进程从超载处理器移到空闲或不太忙的处理器上
push migration和pull migration