操作系统学习 进程(1)进程的概念与状态
目标问题:
“一个程序是如何变成一个能运行的进程的?”
学习重点:
- 程序 → 进程(加载、分配资源、进入就绪队列)
- 进程的 状态转换图(创建 → 就绪 → 运行 → 阻塞 → 终止)
- PCB(Process Control Block,进程控制块)是什么、为什么重要
📘 建议练习:
画出进程状态转换图,用一句话解释每个箭头代表的操作(例如:等待I/O → 阻塞)。
🧭 一、从“程序”到“进程”
我们先来一个最根本的问题:
程序(Program)和进程(Process)有什么区别?
对比点 | 程序(Program) | 进程(Process) |
---|---|---|
本质 | 一堆静态的代码和数据(文件) | 正在执行的程序实例 |
存放位置 | 硬盘上 | 内存中 |
是否在运行 | 不运行,只是资源 | 正在运行,有生命期 |
是否独立资源 | 没有系统分配的资源 | 拥有独立资源(内存、文件、CPU时间等) |
👉 一句话总结:
程序是“做菜的菜谱”,进程是“正在做菜的厨师”。
🧩 二、进程的组成:PCB + 程序 + 数据
操作系统为了管理成千上万个进程,需要给每个进程一个“身份证”,这就是:
📋 PCB(Process Control Block)
它记录了进程的一切关键信息:
- 进程标识符(PID):唯一编号
- 进程状态:就绪 / 运行 / 阻塞
- 程序计数器(PC):记录执行到哪一条指令
- 寄存器内容:保存CPU上下文
- 内存管理信息:代码段、数据段、堆、栈地址
- I/O信息:打开的文件、设备状态
- 调度信息:优先级、时间片等
操作系统正是通过 PCB 来保存与恢复进程状态,实现进程切换。
🔄 三、进程的五种状态
我用文字画一遍状态图,说明:
┌──────────────┐│ ││ 创建(new) ││ │└──────┬───────┘│ 系统为进程分配资源、建立PCB▼┌──────────────┐│ ││ 就绪(ready)│ ←─── 被唤醒(如I/O完成)│ │└──────┬───────┘│ 调度器选中它,获得CPU▼┌──────────────┐│ ││ 运行(running)││ │└────┬────┬────┘│ ││ │ 调用I/O、等待事件│ ▼│ ┌──────────────┐│ │ ││ │ 阻塞(blocked)││ │ ││ └──────┬───────┘│ │ I/O完成、事件就绪▼ │┌──────────────┐│ ││ 终止(terminate) ││ │└──────────────┘
每个箭头表示一种“事件”:
- 从“运行 → 阻塞”:等待I/O
- 从“阻塞 → 就绪”:I/O完成
- 从“运行 → 终止”:程序执行完或被结束
状态 | 含义 | 转换触发 |
---|---|---|
创建(new) | 系统为新进程分配资源、建立PCB | 调用 fork()、CreateProcess() 等 |
就绪(ready) | 已准备好运行,只等CPU调度 | 时间片到 / I/O完成 |
运行(running) | 占用CPU执行指令 | 时间片到 / 调用I/O / 被抢占 |
阻塞(blocked) | 等待I/O或事件 | 事件发生后唤醒进入就绪 |
终止(terminated) | 程序运行完或被结束 | 系统回收资源 |
🧩 四、什么是阻塞(Blocked)?
想象一个场景:
你写了个程序,要从硬盘读取一个文件。
当执行到read(file)
时,程序必须等文件读取完成才能继续计算。
而磁盘很慢(相对CPU而言),CPU每秒能执行几十亿条指令,但磁盘读取一次数据可能要几毫秒。
如果CPU在这几毫秒内干等着,那就浪费了宝贵的计算资源。
于是——
💡 操作系统干了一件聪明的事:
当程序要等某个事件(比如磁盘、网络、用户输入)时,系统让它“先睡一觉”,
把CPU让给别的程序。
这个“睡眠”的状态就是:
阻塞(Blocked),也叫 等待(Waiting)
⚙️ 阻塞的本质:进程在等待“外部事件”
所以,进程的状态变化大概是这样的:
创建 → 就绪 → 运行 → (等待I/O)→ 阻塞↑└—— I/O完成 → 就绪
用更生活的例子来理解:
场景 | 状态 |
---|---|
你在排队等餐(CPU没空) | 就绪 |
轮到你点餐(获得CPU) | 运行 |
你等菜上桌(等I/O) | 阻塞 |
菜来了(I/O完成) | 唤醒回到就绪 |
吃完离开 | 终止 |
👉 阻塞不是错误,也不是停止运行,
而是“暂时没事干,等事件发生再回来”。
🔍 五、那 I/O 是什么?
I/O 是 “Input / Output” 的缩写,
指的是输入输出设备相关的操作。比如:
类型 | 举例 | 特点 |
---|---|---|
输入 | 键盘输入、鼠标点击、从文件读取 | 程序需要“等”输入完成 |
输出 | 显示输出、写文件、打印 | 也需要等待外设反应 |
网络 | 向服务器发请求、等待数据返回 | 网络延迟更明显 |
这些操作都不是CPU在做,而是由I/O设备控制器或DMA完成。
CPU只是发出请求,然后继续干别的活,等I/O完成后再回来处理结果。
⚙️ 六、状态切换的本质:CPU分配权的转移
“运行 ↔ 就绪 ↔ 阻塞”的切换,本质上是:
CPU使用权在不同进程之间转移。
- 当进程主动等待I/O:它让出CPU → 阻塞。
- 当I/O完成:它被唤醒 → 就绪。
- 当调度器选择它:它获得CPU → 运行。
这个循环,就形成了操作系统的“多任务”运行机制。