(这一章的重点是六个短程调度的算法:FCFS、RR、SRN、SRT、HRRN、Feedback;只介绍单处理器的调度)
当一个新的进程被创建时,需要对是否将其加入进程集做出决策。既然长程调度决定接纳哪一个进程到系统内进行处理,就决定了系统的多道程序度和并发度。
需要对两类进程的数目和比例作出权衡考虑:
受处理器限制的进程 Processor-bounded processes:主要做计算工作,偶尔才会用 I/O
受 I/O 限制的进程 I/O-bounded processes :使用 I/O 设备的时间长于用 CPU 的时间
中程调度就是 swapping 的一部分,针对的是内存资源,决定将哪些进程换入、换出内存。swapping 也是基于对多道程序度的管理的需要。
短程调度就是 CPU 的分派程序,决定应当将处于就绪态的进程中的哪一个作为 CPU 执行的下一个进程。时三类调度中执行最频繁的调度级别。
调度算法的成功与否取决于,是否能让进程保持 CPU-I/O 脉冲循环:
CPU 在以下几种情况时需要作出调度决策:
当前正在运行的进程进入阻塞态(可能是在等待 I/O 或者等待其他进程发生动作)
当前正在运行的进程结束了
当某个(外部)中断出现(可能是某个优先级比较高的进程锁等待的外部事件发生了)
当某个进程从阻塞态切换到就绪态(可能它的优先级比较高)
抢占式调度 Preemptive Scheduling: 当前正在运行的进程可能会被打断进入就绪态(前面提到的四种情况都有可能需要调度)
非抢占式 Nonpreemptive Scheduling: 只要一个进程在运行就可以一直运行,直到它主动等待、阻塞,或者主动结束时才需要作出调度(只有前面提到的第一、二种情况需要调度)
所有系统:
批处理系统 Batch System:
交互式系统 Interactive System:
有一个专门的选择函数用于从就绪的进程种选择下一个来执行,选择的标准有:
常常使用优先级来实现调度算法:
主要介绍六种短程调度策略,都以以下的进程作为例子:
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(周转时间和处理时间的比例)
算法: (非抢占式)使用一个就绪队列,新进入就绪态的进程加入队尾;当前进程停止运行时,选择队头(即等待时间最长)的进程来运行
优点: 实现简单,对处理时间较长的进程表现好;
缺点: FCFS 偏爱受 CPU 限制的进程,最终可能导致对 CPU 的使用率和对 IO 设备的使用率都下降。(因为受 IO 限制的进程每次使用 CPU 的时间很短,就又要进行 IO 操作,进入等待队列,导致服务质量下降,进而导致 IO 的利用率也降低;最后当受 CPU 限制的进程运行完后,往往只剩下受IO限制的进程,又导致 CPU 的利用率降低)
(FCFS 的缺点提醒我们应当让使用资源时间较短的进程拥有更高的优先级)
总结: FCFS 对于单处理器来说并不是一个很好的选择,经常用于搭配其他的调度策略(例如 FeedBack)一起使用。
算法: (抢占式)也有一个类似 FCFS 的队列机制;当一个进程新进入运行态时启动时钟,退出时关闭;时钟每隔一定时间就产生中断,因此每个进程最多能运行一个定长的时间片。
关键: 时间片长度的选择
优点: RR 在分时系统或者交易处理系统方面尤为高效;
缺点: Unfairness,时间片对于 FCFS 的问题解决是不彻底的,受 IO 限制的进程的优先级还是没有得到提升。因此受 IO 限制的进程表现差, IO设备利用率低,进程间的响应时间差距大。
**算法: **(作为 RR 的改进策略)在原来队列的基础上再引入一条辅助队列,并且让辅助队列比原先的队列优先级更高:
主要队列:当进程从运行态切换到就绪态时,加入该队列;
辅助队列:当进程从阻塞态切换到就绪态时,加入该队列。
算法:(非抢占式)下一个执行的进程为预计使用 CPU 时间最短的进程(即队列变成了一个以时间期望为 key 的优先队列)
优点: 与 FCFS 相比表现好很多;当所有进程同时到达就绪队列时,SPN 所有非抢占式调度算法中最优解(可以证明);
缺点: 对于使用 CPU 时间较长的进程,有可能出现 starvation;对于 FCFS 偏好长进程的优化还不够彻底(主要是因为没有抢占机制);需要估计每个 busrt 的运行时间。
关键: 如何估计运行时间(例如,可以按照运行时间的历史记录,为每个进程保存一个每个 burst 的运行平均时间)
算法: (抢占式,相当于是 SPN 的抢占版本)
优点: 解决了 FCFS 对于长时间进程的偏爱;相比于 RR,SRT 不会产生额外的无用的中断
算法: 按照某种优先级进行调度,同种优先级的则按照 FCFS 规则排列;可以是抢占式的也可以是非抢占式的
SPN 就是优先级调度的一个特例,优先级为下一个 burst 的预计时长;
受 IO 限制的进程应当拥有更高的优先级。
算法: (非抢占式)考虑预计响应比,响应比越大的进程先执行(相对等待时间越长的进程越先执行)
响应比: 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
思想:(抢占式)SPN、SRT 和 HRRN 对于服务时间的估计并不总是能被实现,于是我们可以根据进程上一次 CPU burst 的表现来及时调整进程的优先级(即关注于进程当前已经运行的时间,而不是预计的剩余时间)最终表现为更偏向于新的、短 burst 的进程。
算法: 使用多个队列 RQ0-n,每一级队列内部使用 RR 策略;当某个进程运行时,将当前时间片全部用完,那么它将被下放到下一级队列;新加入系统的进程进入第一级队列,总体情况是越来越往下移动。
(时间片用完,说明它对 CPU 时间的需求越大,因此要降低它的优先级)
缺点: 长时间的进程会发生 stavation
变体: