Interactive Scheduling Algorithms
交互式调度算法
交互式系统要让用户的操作尽快得到反应,因此更关心算法的响应时间、公平性和任务紧急程度。
| 算法 | 主要依据 | 抢占性 | 适合解决的问题 |
|---|---|---|---|
| RR | 到达就绪队列的顺序、时间片 | 抢占 | 让每个进程周期性获得 CPU |
| 优先级调度 | 优先级 | 可抢占,也可非抢占 | 区分任务紧急程度 |
| 多级队列调度 | 进程类型所属队列 | 取决于队列间策略 | 按系统进程、交互进程、批处理进程等分类管理 |
| 多级反馈队列调度 | 队列优先级、时间片、运行反馈 | 抢占 | 在响应、公平、短进程优先之间折中 |
| 算法 | 是否区分优先级 | 是否使用时间片 | 是否允许队列迁移 | 主要优点 | 主要风险 |
|---|---|---|---|---|---|
| RR | 否 | 是 | 否 | 公平、响应快 | 时间片过小会增加切换开销 |
| 优先级调度 | 是 | 不一定 | 否 | 能表达任务紧急程度 | 低优先级进程可能饥饿 |
| 多级队列调度 | 是,按队列区分 | 可按队列设置 | 通常不迁移 | 不同类型进程分开管理 | 低优先级队列可能饥饿 |
| 多级反馈队列调度 | 是,按队列动态区分 | 是 | 是 | 综合响应、公平和短进程优先 | 规则复杂,低级队列仍可能饥饿 |
RR 时间片轮转
RR,Round-Robin,即时间片轮转调度。
| 角度 | RR |
|---|---|
| 思想 | 公平地、轮流地为各进程服务,让每个进程在一定时间间隔内得到响应 |
| 规则 | 按进入就绪队列的顺序,每次让队头进程运行一个时间片 |
| 使用对象 | 进程调度 |
| 抢占性 | 抢占式 |
| 优点 | 公平,响应快,适合分时系统 |
| 缺点 | 进程切换频繁,有上下文切换开销;不区分任务紧急程度 |
| 饥饿 | 不会 |
如果进程在一个时间片内完成,它主动放弃 CPU;如果时间片用完仍未完成,时钟中断触发调度,操作系统剥夺 CPU,把它放回就绪队列队尾。
若某个时刻同时发生新进程到达和当前进程时间片用完,新到达进程先进入就绪队列,当前进程后进入就绪队列。
示例:
| 进程 | 到达时间 | 运行时间 |
|---|---|---|
| P1 | 0 | 5 |
| P2 | 2 | 4 |
| P3 | 4 | 1 |
| P4 | 5 | 6 |
时间片为 2 时,运行顺序为:
$$
P1 \to P2 \to P1 \to P3 \to P2 \to P4 \to P1 \to P4 \to P4
$$
对应的 CPU 占用区间为:
| 进程 | CPU 占用区间 |
|---|---|
| P1 | $0\sim2,\ 4\sim6,\ 11\sim12$ |
| P2 | $2\sim4,\ 7\sim9$ |
| P3 | $6\sim7$ |
| P4 | $9\sim11,\ 12\sim14,\ 14\sim16$ |
时间片大小会直接影响系统表现:
| 时间片 | 结果 |
|---|---|
| 过大 | 每个进程可能在一个时间片内就完成,RR 退化为 FCFS,响应时间变长 |
| 过小 | 时钟中断和上下文切换太频繁,CPU 时间被调度开销消耗 |
| 合适 | 让交互进程较快得到响应,同时不让切换开销过大 |
- 若系统有 10 个进程轮流执行,时间片为 1 秒,则某个进程最坏可能接近 9 秒才再次得到 CPU
- 若时间片极小,用户感觉响应快,但系统会频繁保存和恢复进程运行现场。
优先级调度
优先级调度给每个作业或进程设置优先级,调度时选择优先级最高者。
| 角度 | 优先级调度 |
|---|---|
| 思想 | 按任务紧急程度或系统偏好分配 CPU |
| 规则 | 每次调度时,从候选者中选择优先级最高者 |
| 使用对象 | 可用于作业调度、进程调度,也可用于 I/O 调度 |
| 抢占性 | 可抢占,也可非抢占 |
| 优点 | 能表达任务紧急程度,适合实时系统;也便于体现系统策略 |
| 缺点 | 高优先级进程不断到来时,低优先级进程可能长期得不到服务 |
| 饥饿 | 可能 |
非抢占式优先级调度只在当前进程完成、阻塞或主动放弃 CPU 时重新选择。抢占式优先级调度还要在就绪队列变化时检查:若新到达进程优先级高于当前运行进程,就抢占当前进程。
优先级可以分为两类:
| 类型 | 含义 | 特点 |
|---|---|---|
| 静态优先级 | 创建进程时确定,之后不变 | 实现简单,但难以反映运行过程中的变化 |
| 动态优先级 | 创建时有初值,运行过程中可调整 | 更灵活,可以缓解饥饿,也能体现系统当前偏好 |
常见设置思路:
- 系统进程优先级通常高于用户进程。
- 前台进程优先级通常高于后台进程。
- I/O 繁忙型进程可适当提高优先级,因为它尽快运行后常会发起 I/O,使 CPU 和 I/O 设备更容易并行工作。
- 进程在就绪队列中等待很久,可提高优先级,避免饥饿。
- 进程占用 CPU 很久,可降低优先级,把机会让给其他进程。
多级队列调度
多级队列调度把就绪队列拆成多个队列,进程创建后按类型进入固定队列。例如:
| 队列 | 常见对象 | 队列内策略 |
|---|---|---|
| 系统进程队列 | 内核服务、系统任务 | 优先级调度 |
| 交互式进程队列 | 终端、编辑器、前台程序 | RR |
| 批处理进程队列 | 后台计算任务 | FCFS 或 SJF |
队列之间常见两种安排:
| 队列间策略 | 含义 |
|---|---|
| 固定优先级 | 高优先级队列不空时,低优先级队列不能运行 |
| 时间片划分 | 给不同队列分配固定 CPU 比例,例如 50%、40%、10% |
多级队列调度的关键是分类。一个进程通常固定属于某个队列,队列之间不强调迁移。它能把不同类型进程分开管理,但如果采用固定优先级,低优先级队列可能长期得不到 CPU。
多级反馈队列调度
多级反馈队列调度保留多个就绪队列,但进程可以根据运行情况在队列之间迁移。
| 角度 | 多级反馈队列 |
|---|---|
| 思想 | 在 FCFS 的公平、RR 的响应、SPF 的短进程优先、优先级调度的灵活性之间折中 |
| 规则 | 新进程先进入最高优先级队列;用完本级时间片仍未完成则下降一级;高优先级队列为空时才调度低优先级队列 |
| 使用对象 | 进程调度 |
| 抢占性 | 抢占式 |
| 优点 | 新进程响应快;短进程容易较早完成;不需要预估运行时间;可通过队列和时间片设置体现系统偏好 |
| 缺点 | 规则较复杂;若高优先级进程持续到来,低优先级进程可能饥饿 |
| 饥饿 | 可能 |
基本规则如下:
- 设置多个就绪队列,优先级从高到低。
- 高优先级队列时间片小,低优先级队列时间片大。
- 新进程先进入第 1 级队列。
- 若进程用完当前队列的时间片仍未完成,降到下一级队列队尾。
- 若已经在最低级队列,用完时间片仍未完成,则重新回到最低级队列队尾。
- 只有第 $k$ 级队列为空时,才会调度第 $k+1$ 级队列。
- 低级队列进程运行时,若更高级队列进入新进程,新进程会抢占 CPU;被抢占进程回到原队列队尾。
统一例子:
| 进程 | 到达时间 | 运行时间 |
|---|---|---|
| P1 | 0 | 8 |
| P2 | 1 | 4 |
| P3 | 5 | 1 |
设三层队列:
| 队列 | 优先级 | 时间片 |
|---|---|---|
| Q1 | 最高 | 1 |
| Q2 | 中 | 2 |
| Q3 | 最低 | 4 |
按抢占规则,运行过程为:
$$
P1(Q1,0\sim1)\to P2(Q1,1\sim2)\to P1(Q2,2\sim4)\to P2(Q2,4\sim5)\to P3(Q1,5\sim6)\to P2(Q2,6\sim8)\to P1(Q3,8\sim12)\to P1(Q3,12\sim13)
$$
这个过程体现了三个机制:
- 新进程先进入最高优先级队列,所以 P1、P2、P3 第一次运行都从 Q1 开始。
- P1 运行时间长,用完 Q1 和 Q2 时间片后逐步下降到 Q3。
- P3 在 5 时刻到达 Q1,会抢占正在 Q2 运行的 P2,因此短交互进程能很快得到响应。