1. CPU调度的背景
1.1 上下文切换
概念: 停止当前正在运行的进程/线程,转换到另一个进程/线程执行的行为叫上下文切换。
上下文切换的特点:
- 必须在切换之前存储当前进程/线程在PCB/TCB中的执行上下文
- 必须能够在之后恢复它们,并且进程/线程不能显示曾经暂停过
- 过程必须快速
需要保存哪些上下文信息?
PC(程序计数器)、SP(栈指针)、CPU状态等信息
1.2 CPU调度
概念: 从就绪队列中选择下一个要占用CPU执行的进程/线程。
1.3 调度时机
对于非抢占系统
CPU的调度时机为当前运行的进程主动放弃CPU执行权
对于抢占系统
CPU的调度时机为:
- 当前运行的进程结束
- 当前运行的进程从运行转成就绪
- 中断请求被服务例程响应完成时
1.4 调度算法指标
- CPU利用率:CPU处于忙状态所占时间百分比
- 吞吐量:单位时间内完成的进程数
- 周转时间:一个进程从初始化到结束(包括等待时间)所花费的时间
- 等待时间:一个进程在就绪队列中的时间(非阻塞)
- 响应时间:从一个请求提出到产生第一次相应所花费的时间
更快指高带宽,低延迟。反映在调度算法中指高吞吐量,低响应时间。
提高的方法:
- 减小响应时间
- 增大吞吐量(减小开销(操作系统开销、上下文切换开销),提高系统资源利用率)
- 减小平均等待时间的波动
- 减小等待时间
2. 调度算法
2.1 调度算法分类
- FCFS(First Come, First Served):先来先服务
- SPN(Shortest Process Next):最短进程优先; SRN(Shortest Remaining Next):最短剩余时间优先
- HRRN(Highest Response Ratio Next):最高响应比优先
- RR(Round Robin):轮询
- MQ(Multiple Queues):多级队列
- MFQ(Multiple Feedback Queues):多级反馈队列
- FSS(Fair Share Scheduling):公平共享调度
2.2 FCFS(First Come,First Served)
- 优点:
简单
- 缺点:
- 平均等待时间波动大
- 执行时间短的进程可能会排在执行时间长的进程后边
- 可能导致I/O和CPU之间的重叠处理(CPU密集型进程会导致I/O设备闲置时,I/O密集型进程也在等待)
2.3 SPN/SRN(Shortest Process/Remaining Next)
SPN和SRN的区别:
SPN是非抢占式的。
SRN是抢占式的,如当前运行的进程B剩余运行时间为8,就绪队列中来了一个进程A,剩余执行时间为5,则会进行抢占。B进程从运行变成就绪,A进程占用CPU并执行。
- 优点:
平均等待时间最优。
- 缺点:
- 可能会导致饥饿。长时间执行短进程会让长进程一直处于等待状态。
- 需要预估进程的执行时间。解决方法:询问用户进程的执行时间,如有欺骗,则杀死进程。
通过历史执行时间预估下一时段执行时间:
2.4 HRRN(Highest Response Ratio Next)
HRRN是在SPN的基础上进行改进,有效解决饥饿问题。
响应比公式:
R
=
(
w
+
s
)
/
s
R=(w+s) / s
R=(w+s)/s其中
w
w
w是等待时间,
s
s
s是执行时间。
HRRN特点:
- 不可抢占
- 关注进程等待了多长时间
- 防止无限期等待
2.5 RR(Round Ratio)
选择一个时间片,每个进程都执行时间片那么长的时间(提前结束则调度下一个进程)。
- 优点:
公平
- 缺点:
- 额外增加了上下文切换开销
- 时间量子选择太小,上下文切换太频繁,切换开销大,导致吞吐量减小
- 时间量子选择太大,等待时间久,极限情况下RR退化成FCFS算法
- 改进:
- 选择合适的时间量子
- 控制上下文开销处于1%之内
2.6 MQ(Multiple Queues)
就绪队列被分成若干个独立的子队列,每个队列可以有不同的调度算法。
如可以分成前台队列和后台队列。前台队列负责处理交互进程,后台队列负责批处理进程。
注意: 调度算法必须在队列间进行。
- 固定优先级。先处理前台队列,后处理后台,可能会导致饥饿现象。
- 时间切片轮转。每个队列获得确定比例的CPU处理时间。如80%的时间给前台队列,20%的时间给后台队列。
2.6 MFQ(Multiple Feedback Queues)
MFQ允许进程在队列之间移动,若进程使用过多的CPU时间,那么它会被移动到低优先级队列。在低优先级队列中等待时间过长的进程会被移动到高优先级队列中去。
对于I/O密集型任务,放在高优先级队列。对于CPU密集型任务,防止低优先级队列。
时间片的大小随着优先级的增大而减小。
3. 多处理调度和优先级反转
3.1 多处理调度
多处理机组成一个多处理系统,处理机间负载共享。
对称多处理器调度:
- 每个多处理器有自己的调度程序
- 调度程序堆共享资源的访问需要进行同步
3.2 优先级反转
优先级反转指操作系统中出现高优先级进程长时间等待低优先级进程所占用资源的现象,发生在任何基于优先级的可抢占的调度机制。
优先级反转例子:
T3在执行的过程中锁定了资源s,且在t3时刻被T1抢占。而由于T1也要访问资源s,s被锁定导致T1无法继续执行,只能等待T3释放资源。t4时刻T3继续执行并在t5时刻被T2抢占。在t6时刻T3重新执行,并在t7时刻结束执行释放资源s,T1才得以继续执行。
解决方法1:优先级继承
低优先级任务继承高优先级任务的优先级,依赖于它们共享的资源。
如上图所示,使用优先级继承后,t4时刻T3的优先级与T1一样高,这时候T2无法再抢占CPU的执行权。 使得T3在t6时刻执行结束并释放资源,T1能马上得到运行。
解决方法2:优先级天花板协议
占用资源进程的优先级和所有可能申请该资源的进程的最高优先级相同