计算机操作系统7,8(计算题)
第七课: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 |
请完成:
- 画出 FCFS 甘特图。
- 写出 A、B、C 的完成时间。
- 计算每个进程的周转时间。
- 计算平均周转时间。
- 计算每个进程的带权周转时间。
学习建议
先自己做这道题,我再帮你逐步批改。 调度算法最重要的是动手算 ,而不是看答案。
等你这道题掌握之后,我们进入 第九课:SJF(Shortest Job First,短作业优先) 。你会发现,它和 FCFS 的区别只在于 排队规则变了 ,计算方法几乎完全一样。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)