计算机操作系统5
第五课:进程的三种基本状态
先问你一个问题。
假设你正在电脑上:
① 打开QQ
② 打开浏览器
③ 打开微信
CPU只有一个。
那么:
QQ什么时候运行?
浏览器什么时候运行?
微信什么时候运行?
操作系统必须知道:
谁现在可以运行?
谁正在运行?
谁现在不能运行?
于是:
每个进程都有一个:
状态(State)
为什么要有状态?
我们先来看一个例子。
假设:
QQ正在运行。
突然:
你点击:
发送图片
QQ开始读取:
D:\照片\旅游.jpg
这里需要:
读取硬盘。
注意:
硬盘速度远远慢于CPU。
CPU一秒可以执行几十亿条指令。
而硬盘(尤其传统机械硬盘)读取需要几毫秒甚至更多。
那么:
CPU怎么办?
继续傻等?
当然不能。
所以:
操作系统说:
QQ,你先等等。
CPU去运行:
浏览器
等:
图片读取完成。
再回来运行QQ。
于是:
QQ就经历了:
运行
↓
等待磁盘
↓
继续运行
所以:
状态就产生了。
第一种状态:运行态(Running)
最容易理解。
就是:
CPU正在执行这个进程。
例如:
此刻:
CPU
↓
QQ
QQ就是:
运行态。
注意:
对于单核CPU来说:
任何时刻只有一个运行态进程。
这是重点。
第二种状态:就绪态(Ready)
假设:
浏览器已经:
- 加载完成
- 内存有了
- 数据都有了
它现在:
什么都准备好了。
唯一缺什么?
CPU。
所以:
浏览器就在:
排队。
教材定义:
除了CPU之外,其他资源都已经满足,只等待CPU。
这就是:
就绪态。
例如:
CPU
↓
QQ(运行)
等待队列:
浏览器
微信
Word
浏览器是不是不能运行?
不是。
它:
随时可以运行。
只是:
CPU现在没轮到它。
一个生活例子
医院只有一个医生。
外面:
小明
小红
小刚
医生正在看:
小明
那么:
小红、小刚:
是不是已经准备好了?
是。
他们只是:
排队。
所以:
他们就是:
就绪态。
第三种状态:阻塞态(Blocked / Waiting)
阻塞:
很多人最容易搞混。
我们举个例子。
QQ:
点击发送图片。
需要:
读取硬盘。
或者:
等待网络。
或者:
等待键盘输入。
这时候:
CPU能解决吗?
不能。
因为:
CPU再快。
也不能让:
网络立即传回来。
所以:
QQ只能:
等待。
这种等待:
叫:
阻塞。
教材定义:
由于等待某个事件发生,而暂时不能运行。
例如:
等待:
- 键盘输入
- 鼠标点击
- 网络数据
- 磁盘读取
- 打印完成
都属于:
阻塞。
一个最经典的例子
假设:
你去银行。
流程:
排队
↓
柜台办理
↓
发现身份证忘带
↓
回家拿身份证
↓
回来继续办理
我们对应一下。
排队:
就绪态
柜台办理:
运行态
回家拿身份证:
阻塞态
为什么?
因为:
银行工作人员:
不能帮你拿身份证。
只能:
等你回来。
三种状态之间怎么转换?
这是教材最喜欢画图的地方。
我们先理解,再记图。
第一种转换
就绪
↓
获得CPU
↓
运行
例如:
浏览器终于轮到了。
CPU开始执行。
所以:
就绪 → 运行
第二种转换
CPU时间到了。
例如:
QQ运行了:
10ms
操作系统说:
时间到了。
该换别人了。
于是:
运行
↓
就绪
注意:
QQ没有出问题。
只是:
CPU轮到别人了。
第三种转换
QQ:
点击:
发送文件
开始:
读取硬盘。
于是:
运行
↓
阻塞
因为:
开始等待IO。
第四种转换
图片终于读取完成。
QQ:
不用等了。
于是:
阻塞
↓
就绪
注意!
这里:
很多同学答错。
为什么不是:
阻塞
↓
运行?
因为:
CPU:
可能还在运行:
浏览器。
所以:
QQ只能:
先进入:
就绪队列。
等:
CPU空闲。
再运行。
这一点:
考试特别喜欢考。
一张图记住状态转换(重点)
获得CPU
┌─────────────┐
│ ▼
就绪态 ───────▶ 运行态
▲ │
│ │
│ │ 时间片用完
│ │
│ ▼
│ 阻塞态
│ ▲
└─────────────┘
等待事件完成
不过,更准确的转换关系应该理解为:
获得CPU
就绪态 ─────────▶ 运行态
▲ │
│ │ 时间片用完
│ ▼
└──────────── 就绪态
运行态 ── 等待I/O等事件 ─▶ 阻塞态
阻塞态 ── 事件完成 ─────▶ 就绪态
三种状态怎么区分?
这是考试最容易混的。
我们做一个对比。
| 状态 | 有没有CPU | 能不能运行 | 在干什么 |
|---|---|---|---|
| 运行态 | ✅ 有 | 能 | 正在执行 |
| 就绪态 | ❌ 没有 | 能,只差CPU | 排队等CPU |
| 阻塞态 | ❌ 没有 | 不能 | 等待事件发生 |
记住一句口诀:
就绪是等CPU,阻塞是等事件。
这是整章最重要的一句话。
为什么不能一直运行?
有人会问:
为什么QQ不能一直霸占CPU?
因为:
电脑还有:
- 浏览器
- 微信
- 音乐
- 杀毒软件
如果:
QQ一直运行。
其他程序:
永远没机会。
所以:
操作系统必须:
不断:
运行
↓
切换
↓
运行
↓
切换
这就是:
后面要学的:
CPU调度。
一个完整的例子
假设:
你打开浏览器。
浏览器创建
↓
进入就绪队列
↓
获得CPU(运行)
↓
访问网页
↓
等待网络(阻塞)
↓
网页下载完成(回到就绪)
↓
再次获得CPU(运行)
↓
关闭浏览器(进程结束)
这就是一个真实进程的一生。
下一课预告
下一课我们学习 进程控制(Process Control) ,包括四个经典操作:
- 创建(Create)
- 撤销(Terminate)
- 阻塞(Block)
- 唤醒(Wakeup)
你会看到,当你双击一个程序时,操作系统内部到底做了哪些事情,以及这些状态转换是如何真正发生的。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)