一、知识思维导图
先通过思维导图快速建立进程状态的整体知识框架:

二、进程状态的核心概念
操作系统中,CPU 核心数量远少于进程总数,多个进程需要轮流占用 CPU 执行;同时进程还会频繁等待 IO、等待共享资源,不可能一直处于 “正在运行” 的状态。 进程状态就是对进程当前执行阶段的抽象标记,用来描述进程 “当前能做什么、在等待什么”,帮助操作系统合理分配 CPU 和内存、IO 等资源,是多进程并发调度的基础依据。
三、经典五状态模型全解析
最通用的进程状态抽象模型分为 5 种基础状态,完整覆盖进程从创建到消亡的全生命周期。
1. 新建状态(New)
- 定义:进程正在被创建,操作系统为其分配 PCB(进程控制块)、初始化内存空间、加载程序代码,尚未提交到就绪队列。
- 触发场景:用户双击启动程序、父进程调用
fork()创建子进程、系统启动时初始化系统服务进程的瞬间。 - 举例:在桌面双击 “记事本” 图标后,系统加载程序文件、分配进程 ID、预留基础内存的短暂阶段,进程就处于新建状态。此时程序还没执行任何业务代码,只是完成了系统内的 “身份登记”。
2. 就绪状态(Ready)
- 定义:进程已经获得除 CPU 之外的所有必要资源,万事俱备,只等待操作系统分配 CPU 时间片,一旦拿到 CPU 就能立刻运行。
- 触发场景:新建状态完成初始化后、阻塞进程等待的事件完成后、运行进程时间片用完被剥夺 CPU 后。
- 举例:同时打开微信、浏览器、音乐播放器三个软件,假设 CPU 只有 1 个核心,当前浏览器在运行,微信和音乐播放器就处于就绪状态 —— 它们的代码、数据都已加载到内存,随时可以接替 CPU 运行。
3. 运行状态(Running)
- 定义:进程正在 CPU 上执行指令,是进程真正推进任务、处理逻辑的状态。
- 触发场景:操作系统调度器从就绪队列中选中该进程,完成上下文切换,将 CPU 控制权交给该进程。
- 举例:正在用 Word 打字时,Word 进程正在 CPU 上处理键盘输入、渲染文字界面,此时它就处于运行状态。
- 单核心 CPU 下,同一时刻只能有一个进程处于运行状态;多核 CPU 可以同时有多个进程分别在不同核心上并行运行。
4. 阻塞状态(Blocked / Waiting)
- 定义:进程正在等待某一事件发生,主动放弃 CPU;即使此时给它 CPU 也无法继续执行,因此会被移出就绪队列。
- 触发场景:等待磁盘读写完成、等待用户输入、等待网络响应、等待锁资源释放、调用
sleep()主动休眠等。 - 举例:在浏览器里点击 “下载文件”,浏览器发起磁盘写入请求后,会进入阻塞状态等待磁盘返回写入完成信号;这段时间里即使 CPU 空闲,浏览器也没法继续执行下载相关代码,必须等 IO 完成。
- 关键区别:阻塞是主动放弃 CPU,和就绪状态 “被动等待 CPU 分配” 有本质不同。
5. 终止状态(Terminated / Exit)
- 定义:进程执行完毕或因异常被终止,操作系统正在回收其资源、移除 PCB 信息。
- 触发场景:程序正常执行完
main函数返回、调用exit()主动退出、出现段错误等异常被系统杀死、父进程请求终止子进程。 - 举例:点击窗口右上角的 “×” 关闭记事本,程序执行退出逻辑、释放内存和文件句柄的阶段,就处于终止状态;资源回收完成后,该进程从系统中彻底消失。
四、进程状态转换全景与触发条件
5 种状态之间的转换有严格的触发条件,不能任意跳转,核心转换路径如下图所示:

核心转换规则详解:
-
新建 → 就绪
- 条件:操作系统完成进程初始化,资源分配完毕,将进程加入就绪队列。
- 说明:这是进程进入可调度队列的标志,此后进程就可以被调度器选中执行。
-
就绪 → 运行
- 条件:操作系统调度器执行进程调度,选中该进程,完成 CPU 上下文切换。
- 说明:这是唯一由调度器主动触发的转换,直接决定哪个进程能获得 CPU 资源。
-
运行 → 就绪
- 条件 1:进程的 CPU 时间片用完,被系统强制剥夺 CPU。
- 条件 2:抢占式系统中,有更高优先级的进程进入就绪队列,抢占了当前进程的 CPU。
- 举例:正在玩低优先级小游戏时,高优先级的系统杀毒软件启动,游戏进程被抢占,从运行变回就绪。
-
运行 → 阻塞
- 条件:进程主动发起 IO 请求、等待同步资源(信号量、锁)、调用休眠函数。
- 说明:这是进程主动发起的转换 —— 不等待事件完成就无法继续执行,因此主动让出 CPU。
-
阻塞 → 就绪
- 条件:进程等待的事件发生(IO 完成、数据到达、休眠时间结束、锁被释放)。
- 举例:磁盘读取完成后,系统向 CPU 发送中断信号,内核唤醒对应进程,进程重新进入就绪队列等待再次调度。
-
运行 → 终止
- 条件:进程正常结束、异常崩溃、被系统或其他进程强制终止。
核心规则:阻塞状态不能直接回到运行状态,必须先进入就绪队列等待调度;新建状态也不能直接跳到运行状态,必须先进入就绪队列。
五、真实操作系统的扩展状态
经典五状态是抽象模型,实际系统(如 Linux)会细分出更多状态,最常见的有:
1. 可中断睡眠状态(Interruptible Sleep)
阻塞状态的细分,进程在等待事件,同时可以接收外部信号被唤醒。绝大多数等待用户输入、等待网络数据的用户态进程都处于这个状态。
2. 不可中断睡眠状态(Uninterruptible Sleep)
同样属于阻塞,但进程不响应外部信号,只能等待目标事件完成才能唤醒。一般出现在内核态的关键 IO 操作中,防止中途被信号打断导致数据不一致。
- 举例:往 U 盘里拷贝大文件时,拷贝进程在内核执行写入操作的阶段,就可能处于不可中断睡眠,此时按
Ctrl+C也无法立刻终止它。
3. 僵尸状态(Zombie)
进程已经执行结束,但是父进程还没有调用wait()回收它的 PCB 信息,进程的退出状态、资源统计信息还留在系统里,只占用一个 PID,不占内存和 CPU。
- 举例:子进程跑完所有代码退出,但父进程一直在执行自身逻辑,没去读取子进程的退出状态,子进程就会变成僵尸进程。
4. 暂停状态(Stopped)
进程被暂停执行,既不运行也不等待特定事件,收到继续信号才会回到就绪状态。
- 举例:在终端里按
Ctrl+Z挂起一个前台程序,这个进程就进入暂停状态。
六、完整场景举例:一次文件读取的状态流转
以 “双击打开本地文本文档” 为例,记事本进程的完整状态变化如下:
- 新建:双击图标,系统加载程序文件,分配 PID、内存空间,创建 PCB。
- 就绪:初始化完成,进入系统就绪队列,等待 CPU 调度。
- 运行:调度器选中记事本进程,CPU 执行启动代码,绘制窗口界面。
- 运行→阻塞:程序发起 “读取磁盘上的 txt 文件” IO 请求,主动放弃 CPU,进入不可中断睡眠状态。
- 阻塞→就绪:磁盘完成文件读取,发送中断信号,内核唤醒记事本进程,重新进入就绪队列。
- 就绪→运行:调度器再次选中它,CPU 继续执行,将读取到的文字渲染到窗口。
- 运行→就绪:时间片用完,被调度器换下 CPU,回到就绪队列。
- 运行→终止:用户点击关闭,程序执行退出逻辑、释放资源,进入终止状态,最终被系统回收。
1645

被折叠的 条评论
为什么被折叠?



