OS 操作系统 处理器调度
(这一章的重点是六个短程调度的算法:FCFS、RR、SRN、SRT、HRRN、Feedback;只介绍单处理器的调度)
调度的种类 Three-Level Scheduling
长程调度 Long-Term Scheduling
当一个新的进程被创建时,需要对是否将其加入进程集做出决策。既然长程调度决定接纳哪一个进程到系统内进行处理,就决定了系统的多道程序度和并发度。
需要对两类进程的数目和比例作出权衡考虑:
-
受处理器限制的进程 Processor-bounded processes:主要做计算工作,偶尔才会用 I/O
-
受 I/O 限制的进程 I/O-bounded processes :使用 I/O 设备的时间长于用 CPU 的时间
中程调度 Medium-Term Scheduling
中程调度就是 swapping 的一部分,针对的是内存资源,决定将哪些进程换入、换出内存。swapping 也是基于对多道程序度的管理的需要。
短程调度 Short-Term Scheduling
短程调度就是 CPU 的分派程序,决定应当将处于就绪态的进程中的哪一个作为 CPU 执行的下一个进程。时三类调度中执行最频繁的调度级别。
短程调度 Short-Term Scheduling
调度准则 Criteria
调度算法的成功与否取决于,是否能让进程保持 CPU-I/O 脉冲循环:
- 进程往往以一个 CPU burst 开始执行,接着是 CPU burst 和 I/O burst 交替出现;最后以一个 CPU burst 调用系统调用,结束进程
- CPU 的速度增长得比磁盘等 I/O 设备要快,因此受 I/O 限制的进程比例越来越大
抢占式调度 VS 非抢占式调度 Non-preemptive vs Preemptive Scheduling
CPU 在以下几种情况时需要作出调度决策:
-
当前正在运行的进程进入阻塞态(可能是在等待 I/O 或者等待其他进程发生动作)
-
当前正在运行的进程结束了
-
当某个(外部)中断出现(可能是某个优先级比较高的进程锁等待的外部事件发生了)
-
当某个进程从阻塞态切换到就绪态(可能它的优先级比较高)
抢占式调度 Preemptive Scheduling: 当前正在运行的进程可能会被打断进入就绪态(前面提到的四种情况都有可能需要调度)
- 优点:没有进程能够垄断处理器,因此可以提供更好的服务
- 缺点:开销大,需要更好的调度算法和硬件支持来减少开销
非抢占式 Nonpreemptive Scheduling: 只要一个进程在运行就可以一直运行,直到它主动等待、阻塞,或者主动结束时才需要作出调度(只有前面提到的第一、二种情况需要调度)
调度算法的目标 Scheduling Algorithm Goals
所有系统:
- Fairness:类似的进程应当被相同地对待,并且不能让任何进程经受 starvation
- Enforcing Priorities :进程间需要有优先级,特权进程需要被优先执行
- Balancing Resources: 尽量充分利用所有资源,不要空闲
批处理系统 Batch System:
- Throughput: 吞吐量,每个单位时间内能够完成多少进程数
- Turnaround Time: 周转时间,从用户提交作业到产出结果的时间
- Processor Utilization: 处理器的利用率(这对于共享系统来说更重要,对一些单用户的系统或者实时系统则不是那么重要)
交互式系统 Interactive System:
- Response Time: 响应时间,从用户提交请求到开始有应答的时间;这是最重要的一条标准
- Predictability / Proportionality: 对于同一作业来说,不论当前系统的繁忙程度如何,其周转时间和相应时间应该是比较均匀的、变化较小的,这样可预测性较好。
实现策略
Selection Function
有一个专门的选择函数用于从就绪的进程种选择下一个来执行,选择的标准有:
- 优先级 Priority
- 资源需求 Resource Requirements
- 执行特点 Execution Characteristic
- w = 该进程存在的时间,包括等待和运行的时间
- e = 该进程已经运行的时间
- s = 该进程要求的总的服务时间,包括 e 在内
优先级 Priorities
常常使用优先级来实现调度算法:
- 调度器总是会优先选择优先级较高的进程来运行
- 对于每一个优先级,都有相应的就绪队列用于存放同一登记的、处于就绪态的进程
- 问题:低优先级的进程可能会出现 starvation;为了避免 starvation,可以依据等待时间和执行记录来调整的进程的优先级
短程调度策略 Short-Term Scheduling Policies
评价指标
主要介绍六种短程调度策略,都以以下的进程作为例子:
Process | Arrival Time | Service Time |
---|---|---|
A | 0 | 3 |
B | 2 | 6 |
C | 4 | 4 |
D | 6 | 5 |
E | 8 | 2 |
**Turnaround Time(TAT)周转时间:**从进程进入系统到最终完成的时间(Finish Time - Arrival Time)
Normalized Turnaround Time 归一化周转时间: TAT / service time(周转时间和处理时间的比例)
- 最小值为 1 :当归一化周转时间为 1 时,代表服务质量最好,越大则服务质量下降;
- 归一化周转时间时最常用的评价调度策略的指标,因为需要更长处理时间的进程应当忍受更长的等待时间
① First-Come-First-Served (FCFS)
算法: (非抢占式)使用一个就绪队列,新进入就绪态的进程加入队尾;当前进程停止运行时,选择队头(即等待时间最长)的进程来运行
优点: 实现简单,对处理时间较长的进程表现好;
缺点: FCFS 偏爱受 CPU 限制的进程,最终可能导致对 CPU 的使用率和对 IO 设备的使用率都下降。(因为受 IO 限制的进程每次使用 CPU 的时间很短,就又要进行 IO 操作,进入等待队列,导致服务质量下降,进而导致 IO 的利用率也降低;最后当受 CPU 限制的进程运行完后,往往只剩下受IO限制的进程,又导致 CPU 的利用率降低)
(FCFS 的缺点提醒我们应当让使用资源时间较短的进程拥有更高的优先级)
总结: FCFS 对于单处理器来说并不是一个很好的选择,经常用于搭配其他的调度策略(例如 FeedBack)一起使用。
② Round-Robin(轮转) / Time Slicing(时间分片)
算法: (抢占式)也有一个类似 FCFS 的队列机制;当一个进程新进入运行态时启动时钟,退出时关闭;时钟每隔一定时间就产生中断,因此每个进程最多能运行一个定长的时间片。
关键: 时间片长度的选择
- 如果太长,可以考虑极端情况,那么变得和 FCFS 一样;
- 如果太短,可以考虑极端情况,进程间切换的时间比时间片还长,得不偿失。
优点: RR 在分时系统或者交易处理系统方面尤为高效;
缺点: Unfairness,时间片对于 FCFS 的问题解决是不彻底的,受 IO 限制的进程的优先级还是没有得到提升。因此受 IO 限制的进程表现差, IO设备利用率低,进程间的响应时间差距大。
Virtual Round-Robin(VRR)
**算法: **(作为 RR 的改进策略)在原来队列的基础上再引入一条辅助队列,并且让辅助队列比原先的队列优先级更高:
-
主要队列:当进程从运行态切换到就绪态时,加入该队列;
-
辅助队列:当进程从阻塞态切换到就绪态时,加入该队列。
③ Shortest Process Next(SPN) / Shortest Job First
算法:(非抢占式)下一个执行的进程为预计使用 CPU 时间最短的进程(即队列变成了一个以时间期望为 key 的优先队列)
优点: 与 FCFS 相比表现好很多;当所有进程同时到达就绪队列时,SPN 所有非抢占式调度算法中最优解(可以证明);
缺点: 对于使用 CPU 时间较长的进程,有可能出现 starvation;对于 FCFS 偏好长进程的优化还不够彻底(主要是因为没有抢占机制);需要估计每个 busrt 的运行时间。
关键: 如何估计运行时间(例如,可以按照运行时间的历史记录,为每个进程保存一个每个 burst 的运行平均时间)
④ Shortest Remaining Time
算法: (抢占式,相当于是 SPN 的抢占版本)
- 抢占时机:新的进程进入就绪队列时
- 抢占原则:比较新的进程与当前运行进程的预期剩余时间,谁短谁运行
优点: 解决了 FCFS 对于长时间进程的偏爱;相比于 RR,SRT 不会产生额外的无用的中断
Priority Scheduling 优先级调度
算法: 按照某种优先级进行调度,同种优先级的则按照 FCFS 规则排列;可以是抢占式的也可以是非抢占式的
SPN 就是优先级调度的一个特例,优先级为下一个 burst 的预计时长;
受 IO 限制的进程应当拥有更高的优先级。
⑤ Highest Response Ratio Next
算法: (非抢占式)考虑预计响应比,响应比越大的进程先执行(相对等待时间越长的进程越先执行)
响应比: R = w + s s R=\frac{w+s}{s} R=sw+s , w w w 是进程等待的时间, s s s 是预计的服务时间(随着 w w w 的增大, R R R 增大)(响应比就是归一化周转时间)
优点: 相比于 SPN 或 SRT,不会发生 starvation !
缺点: 和 SPN 或 SRT 一样需要估计 service time
⑥ Feedback(反馈)
思想:(抢占式)SPN、SRT 和 HRRN 对于服务时间的估计并不总是能被实现,于是我们可以根据进程上一次 CPU burst 的表现来及时调整进程的优先级(即关注于进程当前已经运行的时间,而不是预计的剩余时间)最终表现为更偏向于新的、短 burst 的进程。
算法: 使用多个队列 RQ0-n,每一级队列内部使用 RR 策略;当某个进程运行时,将当前时间片全部用完,那么它将被下放到下一级队列;新加入系统的进程进入第一级队列,总体情况是越来越往下移动。
(时间片用完,说明它对 CPU 时间的需求越大,因此要降低它的优先级)
缺点: 长时间的进程会发生 stavation
变体:
- 优先级越低的队列时间片长度越长,例如 RQi 的时间片长度可以是 2 i 2^i 2i 个单位(因为优先级越低说明它对 CPU 时间的需求越大)
- 可以用 HRRN 的机制,对当前队列等待时间过长的进程提升其优先级,到上一层队列