在操作系统中,进程调度是核心任务之一,用于决定在什么时候由哪个进程来占用CPU资源。两种常见的调度算法是先来先服务(FCFS)和最短作业优先(SJF)。这篇博客将用详细的步骤和例子,帮助你理解这两种算法的工作原理及其优缺点。
一、先来先服务(FCFS)
工作原理
FCFS 是最简单的调度算法,按照进程到达的顺序进行调度,就像排队买票,先到的先服务。这里每个进程都需要等待当前正在运行的进程完成之后才能开始。
特点
- 非抢占式:一旦一个进程开始执行,其他进程需要等它完成。
- 简单易实现:只需要维护一个按照到达顺序排列的队列。
优缺点
优点:
- 简单直观,易于实现。
- 所有进程都能公平地获得资源,不会有饥饿问题。
缺点:
- 平均等待时间可能较长,特别是在进程大小差异较大时(称为“长进程阻塞短进程”问题)。
- 不灵活,无法动态调整优先级。
二、最短作业优先(SJF)
工作原理
SJF 优先调度那些预计运行时间最短的进程。它的目标是使系统的平均等待时间最小化。
特点
- 可以是抢占式或非抢占式:
- 非抢占式:一旦一个进程开始执行,其他进程不能打断。
- 抢占式(又称最短剩余时间优先,SRTF):如果一个新的短作业到达,正在运行的长作业会被打断。
优缺点
优点:
- 平均等待时间通常是所有调度算法中最短的。
- 更适合批处理系统或对响应时间要求不高的场景。
缺点:
- 需要事先知道每个进程的运行时间(或作出准确的估计),这在实际中可能很难。
- 饥饿问题:如果短作业不断到来,长作业可能永远得不到执行。
三、示例对比
假设有以下四个进程需要调度:
- P1: 到达时间=0,运行时间=8
- P2: 到达时间=1,运行时间=4
- P3: 到达时间=2,运行时间=9
- P4: 到达时间=3,运行时间=5
1. FCFS 调度
按照到达顺序(P1 → P2 → P3 → P4):
- P1 执行时间:0 到 8,等待时间=0
- P2 执行时间:8 到 12,等待时间=8-1=7
- P3 执行时间:12 到 21,等待时间=12-2=10
- P4 执行时间:21 到 26,等待时间=21-3=18
平均等待时间 = (0 + 7 + 10 + 18) / 4 = 8.75
2. SJF 调度(非抢占式)
按照运行时间排序(P1 → P2 → P4 → P3):
- P1 执行时间:0 到 8,等待时间=0
- P2 执行时间:8 到 12,等待时间=8-1=7
- P4 执行时间:12 到 17,等待时间=12-3=9
- P3 执行时间:17 到 26,等待时间=17-2=15
平均等待时间 = (0 + 7 + 9 + 15) / 4 = 7.75
3. SJF 调度(抢占式)
如果是抢占式 SJF,每次新的短作业到达都会打断当前的长作业,调度过程如下:
- P1 开始运行,P2 到达,P2 比 P1 短,因此切换到 P2。
- P2 完成后,P4 到达,比剩余的 P1 短,因此执行 P4。
- P4 完成后继续执行剩余的 P1。
- 最后执行 P3。
经过计算,抢占式 SJF 的平均等待时间会进一步降低。
四、总结
特性 | FCFS | SJF |
---|---|---|
调度原则 | 到达顺序 | 短作业优先 |
实现难度 | 简单 | 较复杂 |
平均等待时间 | 较高 | 较低 |
饥饿问题 | 无 | 有(长作业可能被饿死) |
适用场景 | 适合公平性要求高的场景 | 适合追求效率的场景 |
对于初学者来说,建议从 FCFS 入手,理解基本调度流程后再学习 SJF 的优点和实现细节。希望本文能帮助你轻松迈出学习操作系统调度算法的第一步!如果有疑问或需要更复杂的例子,欢迎留言讨论!