第七课:CPU调度——为什么CPU要不停切换?

先思考一个问题。

假设你的电脑现在打开了:

微信
浏览器
QQ
音乐
IDE(代码编辑器)

CPU只有一个。

那么:

CPU应该先运行谁?

有没有规则?

当然有。

这个规则,就叫:

CPU调度(CPU Scheduling)


什么是CPU调度?

一句话:

CPU调度就是操作系统决定"下一个CPU给谁用"。

注意关键词:

决定。

CPU自己不会决定。

操作系统决定。


谁负责调度?

操作系统里有一个模块:

调度器(Scheduler)

你可以把它想象成:

火车站的调度员。

例如:

火车站只有一条轨道。

却有:

高铁A

高铁B

高铁C

调度员必须决定:

A先走?

还是B先走?

还是C先走?

CPU也是一样。


为什么需要调度?

假设没有调度。

QQ:

一直运行。

QQ

QQ

QQ

QQ

QQ

……

浏览器:

永远没有机会。

是不是不行?

所以:

CPU必须:

QQ运行一点

↓

浏览器运行一点

↓

微信运行一点

↓

QQ回来

于是:

所有程序都有机会。


调度发生在什么时候?

这是一个考试喜欢问的点。

调度不是随时发生。

通常发生在下面几种情况:

第一种:时间片用完(★★★★★)

例如:

QQ获得CPU。

规定:

时间片:

10ms

10ms到了。

操作系统说:

到时间了。

于是:

QQ

↓

就绪

↓

浏览器开始运行

这是最常见的调度。


第二种:进程阻塞

QQ:

突然:

读取图片

需要等待硬盘。

CPU怎么办?

当然不能等。

立即:

浏览器开始运行。

所以:

阻塞以后:

发生调度。


第三种:进程结束

例如:

记事本关闭。

CPU空出来。

当然:

马上:

运行别人。


所以:

记住:

CPU空出来的时候,操作系统就要重新调度。


什么是时间片(Time Slice)?

时间片:

就是:

一次允许进程连续使用CPU的最长时间。

例如:

规定:

时间片:

5ms

QQ:

最多:

连续运行:

5ms。

然后:

必须:

让别人运行。


为什么要限制时间片?

举个例子。

只有一个窗口卖票。

如果:

一个人:

买:

500张票。

后面:

100个人:

是不是一直等?

不公平。

于是:

规定:

每次:

最多买5张。

然后:

重新排队。

是不是:

大家都能快一点买到票?

CPU也是一样。

时间片就是:

为了:

公平。


时间片太长会怎样?

假设:

时间片:

10秒。

QQ:

运行:

10秒。

浏览器:

只能等。

你点击浏览器。

要:

10秒以后才响应。

是不是:

电脑很卡?

所以:

时间片:

不能太长。


时间片太短呢?

例如:

0.000001秒

CPU:

不停:

QQ

↓

浏览器

↓

微信

↓

QQ

↓

浏览器

切换。

注意:

切换:

也是需要时间的。

叫:

上下文切换(Context Switch)

如果:

一直切。

CPU:

大部分时间:

都在:

保存PCB。

恢复PCB。

真正运行程序:

反而少了。


所以:

时间片:

不能:

太短。


上下文切换(★★★★★)

这是以后一定会学的。

今天先理解。

例如:

CPU正在运行:

QQ。

突然:

要切换:

浏览器。

CPU不能直接:

跑。

必须:

先保存:

QQ现在执行到了哪里。

保存:

程序计数器(PC)

寄存器

栈

CPU状态

全部:

保存到:

PCB。

然后:

读取:

浏览器PCB。

恢复:

浏览器之前保存的信息。

CPU:

才能继续运行。

整个过程:

叫:

上下文切换(Context Switch)


为什么PCB那么重要?

现在是不是懂了?

切换的时候:

CPU:

其实:

什么都不知道。

它:

完全依赖:

PCB。

所以:

PCB里面:

必须保存:

CPU现场

以后:

回来。

才能:

继续运行。


一个完整的切换过程

假设:

CPU:

正在运行QQ。

QQ运行

↓

时间片结束

↓

保存QQ现场到PCB

↓

读取浏览器PCB

↓

恢复浏览器现场

↓

浏览器继续运行

是不是:

整个过程:

都围绕PCB?

所以:

再记一句:

PCB是进程切换的依据。


调度一定公平吗?

不一定。

例如:

医院:

来了:

普通病人

↓

心脏骤停病人

是不是:

应该:

先抢救?

所以:

CPU调度:

有时候:

不是:

先来先服务。

而是:

优先级高的先运行。

这就是:

后面:

优先级调度算法。


CPU调度的目标

教材一般会列很多目标。

先理解。


① CPU利用率高

不要让CPU闲着。

★★★★★


② 响应快

点击浏览器。

马上:

有反应。

★★★★★


③ 周转时间短

例如:

提交一个程序。

希望:

尽快完成。

★★★★★


④ 公平

不要:

一直运行QQ。

浏览器:

一直等待。

★★★★★


今天先认识几个名词(后面会展开)

以后你会学到这些经典算法:

算法 中文 特点
FCFS 先来先服务 最简单,按到达顺序运行
SJF 短作业优先 谁运行时间短,谁先运行
Priority 优先级调度 优先级高的先运行
RR 时间片轮转 每个进程轮流运行一小段时间
多级反馈队列 综合算法 Linux、Windows都借鉴这种思想

今天先知道名字。

下一课开始,我们会一个一个学。


今天知识串起来

现在你已经可以理解整个流程了:

双击QQ
    │
    ▼
创建PCB
    │
    ▼
进入就绪队列
    │
    ▼
调度器选择QQ
    │
    ▼
QQ运行
    │
 ┌──┴───────────────┐
 │                  │
 │ 时间片到         │ 等待I/O
 ▼                  ▼
就绪              阻塞
 │                  │
 └──────事件完成─────┘
        │
        ▼
      就绪
        │
        ▼
再次被调度
        │
        ▼
运行
        │
        ▼
结束 → 撤销PCB

你会发现,我们从第四课开始学的所有知识,现在已经串成了一条完整的链。


本课重点(必背)

✅ CPU调度:决定下一个由哪个进程使用CPU。

✅ 调度器(Scheduler):负责选择进程。

✅ 时间片:进程一次连续使用CPU的最大时间。

✅ 上下文切换:保存当前进程现场并恢复另一个进程现场。

✅ PCB保存了上下文,是进程切换的关键。

这是操作系统第一种调度算法,也是所有调度算法的基础。我会带你从零开始学会画 时间轴(Gantt图) ,并计算:

  • 完成时间(Completion Time)
  • 周转时间(Turnaround Time)
  • 带权周转时间(Weighted Turnaround Time)
  • 平均周转时间

这些是期末考试、考研 408 中最经典的计算题。学会 FCFS 后,SJF、RR、优先级调度都会变得很容易。

太好了,现在正式进入 操作系统第一道计算题

很多同学一看到调度算法就害怕,其实 本质只有一句话:

CPU 就像一个人在排队办事,调度算法就是"排队规则"。

今天这一课学会以后,你后面的 SJF、优先级、RR 基本都会了。


我们先看一个生活例子

去银行办业务。

已经有三个人:

小明
小红
小刚

他们到达时间:

9:00 小明

9:05 小红

9:10 小刚

银行会怎么安排?

当然是:

先来的先办。

不会因为:

小刚长得帅,

就让他插队。

这就是:

FCFS(先来先服务)


CPU也是一样

假设:

现在有三个进程。

进程 到达时间 运行时间
A 0 5
B 2 3
C 4 2

这里有两个非常重要的新概念。


什么叫到达时间(Arrival Time)?

就是:

什么时候进入就绪队列。

例如:

A:

0秒

进入就绪队列

B:

2秒

进入就绪队列

C:

4秒

进入就绪队列

注意:

不是创建时间。

而是:

开始等待CPU的时间。


什么叫运行时间(Burst Time)

又叫:

CPU执行时间。

例如:

A:

需要:

5秒CPU

意思就是:

CPU连续给它5秒。

它就完成了。


FCFS怎么排?

规则只有一句:

谁先到,谁先运行。

我们一步一步来。


第一步

时间:

0秒

谁到了?

只有:

A

所以:

CPU:

运行A

第二步

A运行:

5秒。

于是:

时间来到:

5秒。

这时候:

B到了吗?

到了。

C呢?

也到了。

所以:

等待队列:

B

↓

C

谁先来?

B。

所以:

继续:

运行B

第三步

B:

运行:

3秒。

时间:

8秒。

只剩:

C。

于是:

运行:

C

2秒。

结束。


我们画出甘特图(Gantt Chart)

考试一定会画。

时间 →
0        5        8       10
|--------|--------|--------|
    A         B        C

这个图一定要会画。

以后所有算法都要画它。


什么叫完成时间(Completion Time)

完成时间:

就是:

什么时候结束。

看看图。

A:

结束:

5

所以:

完成时间:

5

B:

结束:

8

完成时间:

8

C:

结束:

10

完成时间:

10

整理一下。

进程 完成时间
A 5
B 8
C 10

什么叫周转时间(Turnaround Time)

这是考试最喜欢考的。

公式只有一个。

周转时间 = 完成时间 − 到达时间

为什么?

因为:

例如:

A:

0秒到达

↓

5秒完成

是不是:

总共:

经历了:

5秒?

所以:

5−0=5

计算一下。

A

5−0=5

B

8−2=6

C

10−4=6

整理:

进程 周转时间
A 5
B 6
C 6

平均周转时间

公式:

所有周转时间

相加

÷

进程数

所以:

(5+6+6)

÷3

=

17/3

≈5.67

带权周转时间(考试重点)

很多同学看到这里开始慌。

其实:

公式很简单。

带权周转时间 = 周转时间 ÷ 运行时间

为什么要除?

因为:

运行时间不同。

举个例子。

甲:

运行:

100秒。

等了:

10秒。

影响大吗?

不大。

乙:

运行:

1秒。

等了:

10秒。

是不是很亏?

所以:

要:

标准化。


开始计算。

A

5÷5=1

B

6÷3=2

C

6÷2=3

整理:

进程 带权周转时间
A 1
B 2
C 3

平均:

(1+2+3)

÷3

=

2

一道完整考试题

假设:

进程 到达 运行
P1 0 4
P2 1 3
P3 2 2
P4 3 1

第一步:画甘特图

FCFS:

按到达顺序:

0      4      7      9      10
|------|------|------|-------|
  P1      P2     P3      P4

第二步:完成时间

进程 完成时间
P1 4
P2 7
P3 9
P4 10

第三步:周转时间

公式:

完成

−

到达
进程 周转时间
P1 4
P2 6
P3 7
P4 7

第四步:带权周转时间

进程 带权周转
P1 4÷4=1
P2 6÷3=2
P3 7÷2=3.5
P4 7÷1=7

FCFS优点

✅ 简单。

✅ 公平。

先来先服务。


FCFS缺点(重点)

来看这个例子。

进程 到达 运行
A 0 100
B 1 1
C 2 1

FCFS:

0               100      101     102
|---------------|--------|--------|
       A              B        C

问题来了。

B:

只需要:

1秒。

却:

等待:

99秒。

是不是很离谱?

这种现象叫:

护航效应(Convoy Effect)

长作业像一辆慢卡车,后面的短作业都被"堵住"了。

这就是 FCFS 最大的缺点。


本课必须掌握的四个公式

一定要记住:

① 完成时间
= 结束时间

② 周转时间
= 完成时间 − 到达时间

③ 带权周转时间
= 周转时间 ÷ 运行时间

④ 平均周转时间
= 所有周转时间 ÷ 进程数

课堂练习(请你自己算)

下面这道题,不要急着看答案,先拿纸自己画一遍甘特图。

进程 到达时间 运行时间
A 0 3
B 2 4
C 4 2

请完成:

  1. 画出 FCFS 甘特图。
  2. 写出 A、B、C 的完成时间。
  3. 计算每个进程的周转时间。
  4. 计算平均周转时间。
  5. 计算每个进程的带权周转时间。

学习建议

先自己做这道题,我再帮你逐步批改。 调度算法最重要的是动手算 ,而不是看答案。

等你这道题掌握之后,我们进入 第九课:SJF(Shortest Job First,短作业优先) 。你会发现,它和 FCFS 的区别只在于 排队规则变了 ,计算方法几乎完全一样。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐