CPU调度
调度是指操作系统按照一定的策略从就绪队列当中选择一个进程,将CPU的使用权交给该进程。
调度切换过程和开销
- 进程切换过程
- 保存处理器的上下文,包括程序计数器和其他寄存器
- 更新PCB信息
- 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列
- 选择另一个进程执行,并更新其PCB
- 更新内存管理的数据结构
- 恢复处理器上下文
- 进程切换开销
- 直接开销
- 保存和恢复寄存器
- 切换虚拟地址空间
- 间接开销
- 高速缓存
- 缓冲区
- TLB失效
- 直接开销
非抢占式与抢占式调度
- 非抢占式调度:任务完成或者阻塞时,让出CPU,调度程序将CPU分配给某个就绪进程。
- 抢占式调度:操作系统将正在运行的进程强行暂停,由调度程序将CPU分配给其他就绪进程。
- 规定的时间片到了
- 出现了优先级更高的进程
CPU-I/O区间周期
- 程序代码有计算类代码和I/O类代码
- 进程执行过程由CPU执行和IO等待周期组成
- CPU约束型程序以计算为主,CPU区间多,甚至会有少量长的CPU区间
- IO约束型程序以IO为主,会有大量短的CPU区间
例题
P1、P2 和 P3 是在某个系统中正在执行的三个进程,各进程的计算(CPU)时间和 I/O 时间 比例如下表所示:
为提高系统资源利用率,合理的进程优先级设置是( )。
A. P1>P2>P3 B. P3>P2>P1 C. P2>P3>P1 D. P2>P1>P3
计算进程会占用大量的cpu时间,而i/o大的会占用较少的cpu资源,相当于短作业,所以应该优先权更高。
CPU调度准则
公平高效,要提高CPU利用率
- 提高系统运算吞吐量 吞吐量:单位时间完成的任务数量
- 缩短进程的周转时间 周转时间:T周转时间 = T完成时刻– T到达时刻
- 缩短进程的等待时间 等待时间:任务在就绪队列中等待的时间总和
- 提高用户的响应满意度 响应时间:从用户输入到产生反应的时间,即从任务到达就绪队列到首次运行的时 间:T响应时间 = T首次运行时刻 - T到达时刻
准则之间的矛盾关系
- 响应时间与公平性之间的矛盾
- 响应时间短 =》 前台任务的优先级高 =》 后台任务得不到CPU
- 吞吐量和响应时间之间的矛盾
- 吞吐量大 =》 时间片大 =》 响应时间长
CPU调度算法
先到先服务调度(FCFS)
字面意思。
相关的计算:
- 公平、简单,非抢占,不适合交互式
最短作业优先调度(SJF)
CPU区间长度最小的先给CPU。
可以证明:同时到达作业,SJF可以保证最小的平均等待时间
- 对于一个调度序列P1…Pn,pi是任务CPU区间大小,若存在i < j而pi > pj,那么交换pi和pj的顺序会减少平均等待时间
最短剩余作业优先调度(SRJF)
SJF的可抢占版本,也就是说每时每刻都会判断哪个现在完成哪个任务需要用的时间最短,如果是一个新的任务用时更短,就会让新的任务直接抢占cpu。
比如说:假定任务的到达顺序为: P1,P2,P3,P4,P5。
抢占显然具有优点,但CPU区间必须是已知的
可以根据历史对cpu区间进行预测,即指数平均法:
τ
n
+
1
=
α
t
n
+
(
1
−
α
)
t
n
−
1
+
.
.
.
+
(
1
−
α
)
j
t
n
−
j
+
.
.
.
+
(
1
−
α
)
n
+
1
τ
0
\tau_{n+1} = \alpha t_n+(1-\alpha)t_{n-1}+...+(1-\alpha)^jt_{n-j}+...+(1-\alpha)^{n+1}\tau_0
τn+1=αtn+(1−α)tn−1+...+(1−α)jtn−j+...+(1−α)n+1τ0
α
→
0
\alpha\to0
α→0:忽略近期,关注历史,反之关注当前,通常取
α
=
0.5
\alpha = 0.5
α=0.5。
SJF的一般化:优先权调度
每个任务关联一个优先权,调度优先权最高的任务。
例题
CPU作业的顺序应当是C->A->B->A->C->B->A,最早完成的是B,最晚完成的是A。
CPU利用率(40 + 20 + 40 + 10 + 20 + 30 + 20) / (40 + 20 + 40 + 10 + 20 + 30 + 20 + 10 + 20) = 0.857
有一个 CPU 和两台外设 D1,D2,且在能够实现抢占式优先级调度算法的多道程序环境中, 同时进入优先级由高到低的 P1,P2,P3 三个作业,每个作业的处理顺序和使用资源的时间如 下:
P1: D2 (30ms), CPU (10ms), D1 (30ms), CPU (10ms)
P2: D1 (20ms), CPU (20ms), D2 (40ms)
P3: CPU(30ms), D1 (20ms)
假设忽略不计其他辅助操作的时间,每个作业的周转时间 T1 ,T2, T3 分别为多少?CPU 和 D1、D2 的利用率各是多少?
T1 = 30(D2) + 10(CPU) +30(D1) + 10(CPU) = 80
T2 = 20(D1) + 10(CPU) + 10(CPU等待P1) + 10(CPU) + 40(D2) = 90
T3 = 20(CPU) + 10(CPU等待P2) + 10(CPU等待P1) +10(CPU等待P2) + 10(CPU) + 10(D1等待P1) + 20(D1) = 90
D1利用率 = (20 + 30 + 20) / 90 = 0.778
D2 = (30 + 40) / 90 = 0.778
CPU = (30 + 10 + 20 + 10) / 90 = 0.778s
轮询调度算法(RR)
按时间片来轮转调度,也就是说每个任务执行的时间都不会超过时间片,到时间就得换
假定任务的到达顺序为: P1,P2,P3,P4,P5;到达时刻都为0,时间片为10。
这里等待时间是指在任务队列里但没在执行的时间,比如说任务P2,等待时间是0-10、20-40、50-52,总的等待时间是32。
- 优点:定时有响应, 响应时间较短
- 缺点:上下文切换 次数较多
RR中时间片如何设定
- 如果时间片太大:响应时间太长,转化为FCFS
- 如果时间片太小:吞吐量变小,周转时间变长
- 所以折中:时间片10-100ms,切换时间0.1-1ms(1%)
例题
解析:
- 进程切换带来系统开销,切换次数越多,系统开销越大,即A选项正确;
- 当前进程的时间片用完后,该进程状态由执行态变为就绪态,即B选项错误;
- 时钟中断是系统特定的周期性时钟节拍。操作系统通过它来确定时间间隔,实现时间的延时和任务的超时,即C选项正确;
- 现代操作系统为了保证性能最优,通常根据响应时间、系统开销、进程数量、进程运行时间、进程切换开销等因素确定时间片大小,即D选项正确。
多级反馈队列(MFQS)
前面的调度方法任务都放置在单个队列上,可能需要进行O(n)的搜索
-
MFQS采取将任务按照优先级分为多个队列,每次从优先级最高的队列选择任务,即 多级队列(Multilevel Queue)(但可能会造成进程饥饿问题)
-
所以根据任务的CPU周期将任务放置在不同的队列中,允许任务在队列间移动
- 使用太多CPU时间的任务会被放置在低优先级队列。
- 在低优先级队列过久的任务会被移到高优先级队列(老化)
-
需要考虑的参数:
- 队列数目
- 每条队列的调度算法
- 将任务移动到高优先级队列的策略
- 将任务移动到低优先级队列的策略
- 为需要服务的任务分配队列的策略
最为通用,但也是最为 复杂的CPU调度算法。
彩票算法
调度过程中应该保证每个任务都获得一定比例的CPU时间
-
给每个任务分配一定的彩票数,彩票数表示了任务应该接受到的资源份额
-
调度器随机选择彩票中奖号码,加载中奖进程并运行它
-
比如说:
- 任务A有75张彩票,假设编码为0~74
- 任务B有25张彩票,假设编码为75~99
- 调度器选择的中奖彩票:63 85 70 39 76 17
- 调度结果:A B A A B A
随着运行时间的增加, 两者得到的CPU时间 比例会越接近期望。
定的彩票数,彩票数表示了任务应该接受到的资源份额
-
调度器随机选择彩票中奖号码,加载中奖进程并运行它
-
比如说:
- 任务A有75张彩票,假设编码为0~74
- 任务B有25张彩票,假设编码为75~99
- 调度器选择的中奖彩票:63 85 70 39 76 17
- 调度结果:A B A A B A
随着运行时间的增加, 两者得到的CPU时间 比例会越接近期望。