Bootstrap

比较FCFS和SJF两种调度算法

在操作系统中,进程调度是核心任务之一,用于决定在什么时候由哪个进程来占用CPU资源。两种常见的调度算法是先来先服务(FCFS)最短作业优先(SJF)。这篇博客将用详细的步骤和例子,帮助你理解这两种算法的工作原理及其优缺点。


一、先来先服务(FCFS)

工作原理

FCFS 是最简单的调度算法,按照进程到达的顺序进行调度,就像排队买票,先到的先服务。这里每个进程都需要等待当前正在运行的进程完成之后才能开始。

特点

  • 非抢占式:一旦一个进程开始执行,其他进程需要等它完成。
  • 简单易实现:只需要维护一个按照到达顺序排列的队列。

优缺点

优点:

  1. 简单直观,易于实现。
  2. 所有进程都能公平地获得资源,不会有饥饿问题。

缺点:

  1. 平均等待时间可能较长,特别是在进程大小差异较大时(称为“长进程阻塞短进程”问题)。
  2. 不灵活,无法动态调整优先级。

二、最短作业优先(SJF)

工作原理

SJF 优先调度那些预计运行时间最短的进程。它的目标是使系统的平均等待时间最小化。

特点

  • 可以是抢占式或非抢占式:
    • 非抢占式:一旦一个进程开始执行,其他进程不能打断。
    • 抢占式(又称最短剩余时间优先,SRTF):如果一个新的短作业到达,正在运行的长作业会被打断。

优缺点

优点:

  1. 平均等待时间通常是所有调度算法中最短的。
  2. 更适合批处理系统或对响应时间要求不高的场景。

缺点:

  1. 需要事先知道每个进程的运行时间(或作出准确的估计),这在实际中可能很难。
  2. 饥饿问题:如果短作业不断到来,长作业可能永远得不到执行。

三、示例对比

假设有以下四个进程需要调度:

  • 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,每次新的短作业到达都会打断当前的长作业,调度过程如下:

  1. P1 开始运行,P2 到达,P2 比 P1 短,因此切换到 P2。
  2. P2 完成后,P4 到达,比剩余的 P1 短,因此执行 P4。
  3. P4 完成后继续执行剩余的 P1。
  4. 最后执行 P3。

经过计算,抢占式 SJF 的平均等待时间会进一步降低。


四、总结

特性FCFSSJF
调度原则到达顺序短作业优先
实现难度简单较复杂
平均等待时间较高较低
饥饿问题有(长作业可能被饿死)
适用场景适合公平性要求高的场景适合追求效率的场景

对于初学者来说,建议从 FCFS 入手,理解基本调度流程后再学习 SJF 的优点和实现细节。希望本文能帮助你轻松迈出学习操作系统调度算法的第一步!如果有疑问或需要更复杂的例子,欢迎留言讨论!

;