一.什么是调度?
调度就是从就绪队列中挑选下一个占用 CPU 运行的进程。
调度分为:长程调度、中程调度、短程调度和 I/O 调度。
本文主要讲解短程调度。
二.为什么要进行进程调度?
- 正在执行的进程正确完成,或由于某种错误而终止运行(陷阱或中断)
- 执行中的进程提出 I/O 请求,等待 I/O 完成
- 在分时系统中,分给进程的时间片用完
- 按照优先级调度,有更高优先级进程变为就绪状态(抢占方式)
- 执行中的进程执行了进程通信原语操作,如 wait 操作、阻塞原语或唤醒原语。
三.短程调度准则:
- 面向用户的准则:响应时间、周转时间(周转时间 = 完成时间 - 到达时间)
- 面向系统的准则:吞吐量、处理器利用率
四.选择调度策略
- 先到先服务FCFS
- 时间片轮转RR
- 最短进程优先SPN
- 最短剩余时间优先SRT
- 最高相应比优先HRRN
- 反馈法
五.进程调度算法的实例
进程调度方式有两种:
非抢占方式
分配 CPU 后,进程一直运行到完成或异常终止
简单、系统开销小
批处理系统抢占方式
系统根据某种策略(抢占原则)收回正在运行进程的 CPU ,调度其它就绪进程运行
及时响应各进程的需求
分时/实时系统
抢占原则:
- 时间片原则(时间片用完)
- 优先级原则(更高优先级进程就绪)
- 短进程优先原则(更短进程就绪)
1.先来先服务FCFS
FCFS 算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便执行下去,直到该进程完成或阻塞时,才释放处理机。(非抢占调度)
FCFS 的优点:实现简单。
FCFS 的缺点:没有考虑进程的优先级,平均等待时间波动较大,短进程可能排在长进程后面,I/O 资源和 CPU 资源利用率低。
FCFS 有利于长作业(进程)
2.时间片轮转RR
RR 用于分时系统进程调度,其步骤如下:
- 就绪进程按照 FCFS 原则排成一个就绪队列
- 调度队首进程,执行一个时间片
- 在一个时间片结束时,发生时钟中断
- 调度程序暂停当前进程的执行,并送就绪队列尾
- 通过 CPU 现场切换执行当前的队首进程
这里的时间片 q = 1
RR 的优点:就绪队列中的所有进程都会有机会获得处理器运行;可提高进程并发性和资源利用率;缩短响应时间。
RR 的缺点:时间片的长度影响系统开销和响应时间。
时间片过短,则调度程序剥夺处理机的次数增多,增加进程上下文交换次数,加重了系统开销(时间片短,有利于短作业,不利于长作业);
时间片过长,大到进程能完成全部运行作业所需的时间,那么时间片轮转法就退化为 FCFS (长时间片,无法满足交互式用户需求)。
最佳时间片,长度略大于一次典型交互所需的时间(响应时间= 进程数目 × 时间片大小)
3.最短进程优先SPN
SPN 算法从就绪队列中选出估计运行时间最短的进程,为之分配处理机,如果运行时间相同,按 FCFS 调度。
SPN 算法有抢占方式和非抢占方式两种:
- 最短进程优先SPN(非抢占)
- 最短剩余时间优先SRT(抢占)
SPN 的优点:能有效地降低平均等待时间,提高系统的吞吐量(平均周转时间最短),有利于短作业。
SPN 的缺点:不利于长作业当短作业持续不断到达时,长作业可能被饿死。无法准确估计作业的的确切执行时间,不一定能真正做到短作业(进程)优先调度。
4.最短剩余时间优先SRT
SRT 是对 SPN 的改进,采用了抢占机制,根据就绪队列里进程剩余需要服务的时间来排队。剩余时间越短的排在最前面。因为需要去记录进程的剩余服务时间,所以增加了系统的开销。
SRT 的优点:比 SPN 的性能更好,短作业只要就绪就可以抢占正在执行长进程的 CPU。
SRT 的缺点:增加了额外开销,长作业(进程)可能会被饿死。
5.最高相应比优先HRRN
为了防止长作业(进程)被饿死,选择最高相应比优先算法。
响应比 = 周转时间 / 运行时间 = (运行时间 + 等待时间 )/ 运行时间 = 1 + 等待时间 / 运行时间
HRRN 的优点:对短作业有利(运行时间越短优先级越高),长作业不会被饿死(运行时间相同时,等待时间越长优先级越高)
HRRN 的缺点:增加了系统的开销(每次重新调度需要估计运行时间,并计算响应比)
6.反馈法
多级队列调度:
- 根据进程属性设置多个就绪队列,每个就绪队列有各自的调度算法、优先级或时间片长度
前台(或交互式)RR
后台(或批处理)FCFS - 队列之间必须有调度
通常采用固定优先级可抢占调度
另一种可能是在队列之间划分时间片。每个队列都有一定的 CPU 时间
多级反馈队列:
- 基于多级队列调度(多个队列,不同优先级,不同时间片长度,不同调度算法)
- 进程可以在不同队列间移动
- 可抢占调度
- 最通用和最复杂的 CPU 调度算法
多级反馈队列调度的优点:
- 短进程出现在优先级高的队列中,可提高系统吞吐量、缩短平均周转时间
- I/O 密集型进程放在最高优先级队列,保证及时 I/O 交互,提高 I/O 设备利用率、缩短响应时间
- 不必事先估计进程执行时间,可以在进程中动态调节