第五课:进程的三种基本状态

先问你一个问题。

假设你正在电脑上:

① 打开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)

你会看到,当你双击一个程序时,操作系统内部到底做了哪些事情,以及这些状态转换是如何真正发生的。

Logo

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

更多推荐