操作系统中的进程调度算法:抢占式调度与非抢占式调度
字数 1816 2025-12-01 09:59:36
操作系统中的进程调度算法:抢占式调度与非抢占式调度
描述
在操作系统中,进程调度是决定哪个就绪进程可以获得CPU使用权的核心活动。根据调度程序能否在进程运行期间强行收回CPU,调度方式主要分为抢占式和非抢占式。理解这两种方式的区别、优缺点及适用场景,是掌握进程调度原理的关键。
知识点详解
1. 基本概念
- 非抢占式调度:一旦某个进程被调度程序选中,开始使用CPU,它就会一直运行,直到该进程主动放弃CPU(例如,因等待I/O操作完成而阻塞,或运行结束)。调度程序不能中途强行暂停该进程。
- 抢占式调度:允许调度程序基于某种策略(如优先级、时间片用完),强行暂停当前正在运行的进程,将CPU重新分配给另一个就绪进程。被暂停的进程会被放回就绪队列,等待下次被调度。
2. 工作原理与过程
非抢占式调度的工作流程:
- 事件发生:一个事件导致当前运行进程放弃CPU(如进程终止、进程因I/O阻塞)。
- 调度触发:CPU变为空闲状态,操作系统内核的调度程序被调用。
- 选择进程:调度程序从就绪队列中,根据既定算法(如FCFS、SJF的非抢占版本)选择一个新进程。
- 分配CPU:调度程序进行上下文切换,将CPU分配给选中的进程。
- 持续运行:新进程开始运行,并持续占有CPU,直到它自己因上述事件而主动放弃。
关键特征:进程切换只发生在当前运行进程自愿放弃CPU的时刻。
抢占式调度的工作流程:
- 事件发生:除了非抢占式中的事件外,还包括:
- 中断发生:如时钟中断,表示一个时间片已用完。
- 高优先级进程就绪:一个更高优先级的进程从阻塞状态变为就绪状态。
- 调度触发:一旦发生上述可导致抢占的事件,操作系统内核会立即中断当前进程的执行,并调用调度程序。
- 抢占决策:调度程序检查是否满足抢占条件(如新就绪进程的优先级是否高于当前进程)。
- 执行抢占:如果满足条件,调度程序保存当前进程的上下文(寄存器状态、程序计数器等),并将其状态从“运行”改为“就绪”,放回就绪队列。
- 选择新进程:从就绪队列中,根据算法(如RR、SRTF、优先级抢占)选择一个新进程。
- 分配CPU:调度程序进行上下文切换,将CPU分配给选中的新进程。
关键特征:进程切换可以发生在任何时刻,由操作系统强制进行。
3. 对比分析与优缺点
| 特性 | 非抢占式调度 | 抢占式调度 |
|---|---|---|
| 实现复杂度 | 简单 | 相对复杂,需处理中断和上下文切换的原子性 |
| 上下文切换开销 | 较低(只在进程主动放弃时发生) | 较高(可能发生得更频繁) |
| 响应时间 | 可能很长,一个长进程会阻塞后续所有进程 | 短,能保证高优先级或交互式任务及时得到响应 |
| 公平性 | 较差,可能导致一个进程长时间垄断CPU | 较好,通过时间片轮转等方式共享CPU |
| 适用场景 | 批处理系统、早期系统或某些专用实时系统 | 分时系统、交互式系统、通用操作系统(如Windows, Linux) |
| “饥饿”问题 | 较少发生 | 可能发生(如低优先级进程可能永远得不到调度) |
| 对临界区的影响 | 简单,进程在临界区内不会被中断 | 复杂,需要同步机制(如锁)保护共享数据 |
4. 实际算法举例
-
非抢占式算法的例子:
- 先来先服务(FCFS):严格按照进程到达就绪队列的顺序执行。
- 非抢占式短作业优先(Non-preemptive SJF):一旦短作业开始运行,就让它执行完,即使有更短的作业后来到达。
-
抢占式算法的例子:
- 时间片轮转(Round Robin):每个进程被分配一个固定的时间片,时间片用完即被抢占。
- 最短剩余时间优先(SRTF):如果一个新就绪进程的预计运行时间比当前进程的剩余运行时间更短,则抢占当前进程。
- 抢占式优先级调度:如果有一个更高优先级的进程变为就绪状态,它会立即抢占当前较低优先级的进程。
总结
抢占式与非抢占式是进程调度的两种基本范式。现代通用操作系统(如Linux、Windows)几乎全部采用抢占式调度,因为它能提供更好的响应性和公平性,更适合交互式和多任务环境。然而,这种优势是以更高的实现复杂度和系统开销为代价的。非抢占式调度虽然简单、开销小,但其较差的响应能力使其主要适用于对响应时间要求不高的特定场景。