调度类型:
- 长程调度 :决定加入待执行进程池
- 中程调度 :决定加入部分/全部位于内存中进程集合
- 短程调度 :决定处理器执行哪个可运行进程
- I/O调度 : 决定可用I/O设备处理哪个挂起的I/O请求
1. 处理器调度
目的 :满足系统目标(响应时间、吞吐率、处理器效率)
作用 :决定进程等待/运行(少量开销)
本质 : 队列管理(managing queues):减少延迟、优化性能
调度 + 进程状态转换:
调度层次:
调度队列图:
1.1 长程调度
决定哪个程序可进入系统中处理,它控制了并发度。长程调度程序执行频率较低。
1.2 中程调度
决定加入部分/全部位于内存中进程集合。交换功能的一部分,主要操作包括 换入(swapping-in)、换出(swapping-out)。中程调度程序执行频率适中。
1.3 短程调度
决定处理器执行哪个可运行进程。短程调度程序(分派程序,dispatcher),执行最为频繁,它精确地决定执行哪个进程。
当前进程 阻塞/被抢占 事件:
- 时钟中断
- I/O中断
- 操作系统调用
- 信号(eg. 信号量)
2. 调度算法
2.1 短程调度规则
优化系统一个/多个方面行为,以分配处理器时间,从而根据各种调度策略建立规则。
常用规则的两大维度:
- 面向用户的规则
- 面向系统的规则
调度规则
- 面向用户(性能相关)
- 周转时间
- 一个进程从提交到完成之间的时间间隔,包括实际执行时间、等待资源 (包括处理器) 时间
- 响应时间
- 从提交一个请求到开始接收响应的时间间隔
- 最后期限
- 再能指定进程的完成期限时,调度原则将降低目标,使得满足最后期限的作业数量百分比最大。
- 周转时间
- 面向用户(其他)
- 可预测性
- 无论系统负载如何,用户不希望响应时间/周转时间过长,则需要在系统抖动时发出信号、处理不稳定性
- 可预测性
- 面向系统(性能相关)
- 吞吐量
- 调度策略应使得单位时间内完成的进程数量最大
- 处理器利用率
- 处理器处于忙状态的时间百分比
- 吞吐量
- 面向系统(其他)
- 公平性
- 没有来自用户/系统的指导时,进程应被平等地对待,没有进程处于饥饿状态
- 强制优先级
- 指定进程优先级后,调度策略应优先选择高优先级的进程
- 平衡资源
- 调度策略使系统中的所有资源处于忙状态,优先调用较少使用紧缺资源的进程
- 公平性
2.2 优先级的使用
许多系统中,每个进程都被指定一个优先级,调度程序总是优先选择具有高优先级的进程。
纯优先级调度方案
这里给出了一组按优先级(RQ0, RQ1, …)排列的就绪队列。进行一次调度时,调度程序按优先级递减顺序选择队列。
问题 :低优先级进程可能会长时间处于饥饿状态
解决方案 :让一个进程的优先级随时间/执行历史而变化
2.3 选择调度策略
选择函数(selection function) :决定选择哪个就绪进程下次执行。
决策模式(decision mode) :说明选择函数开始执行的瞬间的处理方式:
- 非抢占 :一旦进程处于运行状态,就会不断执行直至终止。进程仅可被自身事件阻塞(等待I/O、请求操作系统服务)
- 抢占 :当前正运行进程可被操作系统中断,并转换为就绪态。
两个基本概念:
- 长进程:运行时间长的进程
- 段进程:运行时间短的进程
三个重要参数:
- w:目前位置在系统中停留的时间
- e:目前为止花费的执行时间
- s:进程所需的总服务时间(包括e)
调度策略
先来先服务 FCFS | 轮转 RR | 最短进程优先 SPN | 最短剩余时间 SRT | 最短响应比优先 HRRN | 反馈 | |
---|---|---|---|---|---|---|
选择函数 | max(w) | 常数 | min(s) | min(s - e) | max[(w + s) / s] | - |
决策模式 | 非抢占 | 抢占(时间片用完时) | 非抢占 | 抢占(到达时) | 非抢占 | 抢占(时间片用完时) |
吞吐量 | 不强调 | 时间片小时, 很低 | 高 | 高 | 高 | 不强调 |
响应时间 | 进程执行时间差别大 时, 较高 | 对短进程 提供较好的响应时间 | 对短进程 提供较好的响应时间 | 提供较好的响应时间 | 提供较好的响应时间 | 不强调 |
开销 | 最小 | 最小 | 可能较大 | 可能较大 | 可能较大 | 可能较大 |
对进程影响 | ① 对短进程不利 ② 对 I/O 密集型进程不利 | 公平 对待 | 对长进程不利 | 对长进程不利 | 平衡 性好 | 对I/O 密集型进程可能有利 |
饥饿 | 无 | 无 | 可能 | 可能 | 无 | 可能 |
先来先服务(FCFS)
先来先服务(FCFS),又称先进先出(First-In-First-Out)。每个进程就绪后加入就绪队列。当前正运行进程停止执行时,选择就绪队列中存在时间最长的进程运行。
FCFS对单处理器系统而言效益一般,但可与优先级策略结合以提高效益。
轮转(RR, Round-Robin)
先来先服务(FCFS),也称为时间片(Time-Slicing)技术,一种基于时钟的抢占策略。其周期性地产生时钟中断(时间片),出现中断时,当前正运行进程被放入就绪队列,然后基于FCFS策略选择下一个就绪作业运行。
缺点:当既有处理器密集型,又有I/O密集型时
- 一方面,I/O密集型进程短时间使用处理器后,会因为I/O被阻塞没等待I/O操作完成后,加入到就绪队列
- 另一方面,处理器密集型进程在执行完一个完整的时间片后,立即返回就绪队列,它不公平地使用了大部分处理器时间
以上缺陷,导致了I/O密集型进程新弄降低,I/O设备低效,响应时间变化大。
虚拟轮转法(VRR, Virtual Round Robin)
虚拟轮转法避免了上述不公平性,新进程根据FCFS的管理到达并加入就绪队列。一个正运行进程用完其时间片后,会返回到就绪队列中。一个进程因I/O阻塞时,会加入一个I/O队列。
- 解除I/O阻塞的都会转移到一个FCFS辅助队列中。
- 进行调度决策时,辅助队列中的进程优先于就绪队列中的进程。
- 调度辅助队列中的一个进程时,这个进程的运行时间不会长于基本时间减去其上次在就绪队列中被选择运行的总时间。
最短进程优先(SPN, Short Process Next)
最短进程优先(SPN, Short Process Next),解决FCFS策略不利于短作业的一种方法。这是一种非抢占策略,原则:下次选择预计处理器时间最短的进程,但存在长进程饥饿的风险,该策略需要预估服务时间。
最短剩余时间(SRT, Shortest Renaming Time)
最短剩余时间(SRT, Shortest Renaming Time),在SPN中增加了抢占机制的策略。此时,调度程序总是选择与其剩余时间最短的进程,但存在长进程饥饿的风险,该策略需要预估服务时间。
SRT不像FCFS那样偏向长进程,也不像轮转算法那样产生额外中断,降低了开销。但它会记录过去的服务时间,增加了开销。
最高响应比优先(HRRN, Highest Response Ratio Next)
最高响应比优先(HRRN, Highest Response Ratio Next),使用归一化周期时间(周转时间、实际服务时间 比值)。
R = w + s s R=\dfrac{w+s}{s} R=sw+s
原则:当前进程 完成/被阻塞 时,选择R值最大的就绪进程。
该策略说明了进程的年龄(小分母产生大比值),但需要预估服务时间。
反馈法
反馈法,不存在各个进程相对长度的任何信息时,无法使用SPN、SRT、HRRN策略时的方法。
具体方法:
- 调度基于抢占原则(时间片)并使用动态优先级机制。
- 一个进程首次进入系统 时,会放在RQO中。当它首次被抢占并返回就绪态时,会放在RQ1中。在随后的时间里,每次它被抢占时,都会降级到下一个低优先级队列中。
- 短进程很快执行完毕,但长进程则会多次降级。因此,新进程、短进程 优于 老进程、长进程。每个队列(除优先级最低队列)均采用FCFS机制。
- 若进程位于优先级最低队列,无法降级,则重复返回该队列,直至运行结束,此队列可按 轮转RR 方式调度。
一个进程经过多个队列的路径,可以反应这种反馈调度机制的本质,即 多级反馈(multilevel feedback):操作系统把处理器分配给一个进程,当这个进程 被阻塞/被抢占 时,就反馈到多个优先级队列之一。
进程调度示例
先介绍两个概念:
周转时间(turnaround time):驻留时间Tr / 这一项在系统中花费的总时间(等待时间 + 服务时间)
归一化周转时间(normalized turnaround time):周转时间、服务时间 比值,表示一个进程的相对延迟情况。比值越大,服务级别越低。
进程 | 到达时间 | 服务时间 |
---|---|---|
A | 0 | 3 |
B | 2 | 6 |
C | 4 | 4 |
D | 6 | 5 |
E | 8 | 2 |
2.4 公平共享调度(FSS, Fair-Share Scheduling)
公平共享调度(FSS, Fair-Share Scheduling),一种基于进程组的调度策略。
公平共享调度程序(FSS, Fair-Share Scheduler)
调度基于优先级进行,其中包括三大重要参数:
- 进程基本优先级
- 进程近期使用处理器情况(进程CPU计数)
- 组近期使用处理器情况(组CPU计数)
进程j在时间区间i中时,处理器使用情况的测度:
C
P
U
j
(
i
)
=
C
P
U
j
(
i
−
1
)
2
CPU_j(i)=\dfrac{CPU_j(i-1)}{2}
CPUj(i)=2CPUj(i−1)
组k在时间区间i中时,处理器使用情况的测度:
G
C
P
U
k
(
i
)
=
G
C
P
U
k
(
i
−
1
)
2
GCPU_k(i)=\dfrac{GCPU_k(i-1)}{2}
GCPUk(i)=2GCPUk(i−1)
进程j在时间区间i开始处的优先级(Basej是进程j的基本优先级,Wk是分配给组k的权值):
P
j
(
i
)
=
B
a
s
e
j
+
C
P
U
j
(
i
)
2
+
G
C
P
U
k
(
i
)
4
W
k
P_j(i)=Base_j+\dfrac{CPU_j(i)}{2}+\dfrac{GCPU_k(i)}{4W_k}
Pj(i)=Basej+2CPUj(i)+4WkGCPUk(i)
Pj越小,优先级越高。
每个进程被分配一个基本优先级。进程的优先级会随进程使用处理器及进程 所在组使用处理器而降低。对于进程组使用的情况。用平均值除以该组的权值来归一化平均值。分配给某个组的全职越大,那么该组使用处理器对其优先级的影响越低。
公平共享调度程序示例(三进程 → 分两组)
上图中,进程A在一个组中,进程B、C在另一个组中,每组权值为0.5。
假设所有进程基本优先级为60,处理器每秒中断60次,每次中断当前运行进程&所在组 使用域均增加1,每秒都重新计算优先级。
- 首先,调度进程A。第1秒结束时,它被抢占。此时进程B和C具有最高优先级,进程B被调度。
- 在第2个单位时间按结束时,A又具有最高优先级。
内核按照重复顺序调度进程A、B、A、C、A、B……
因此,处理器的50%分配给进程A(第1组),50%分配给进程B、C(第2组)。