一、知识思维导图先通过思维导图快速建立进程状态的整体知识框架二、进程状态的核心概念操作系统中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 盘里拷贝大文件时拷贝进程在内核执行写入操作的阶段就可能处于不可中断睡眠此时按CtrlC也无法立刻终止它。3. 僵尸状态Zombie进程已经执行结束但是父进程还没有调用wait()回收它的 PCB 信息进程的退出状态、资源统计信息还留在系统里只占用一个 PID不占内存和 CPU。举例子进程跑完所有代码退出但父进程一直在执行自身逻辑没去读取子进程的退出状态子进程就会变成僵尸进程。4. 暂停状态Stopped进程被暂停执行既不运行也不等待特定事件收到继续信号才会回到就绪状态。举例在终端里按CtrlZ挂起一个前台程序这个进程就进入暂停状态。六、完整场景举例一次文件读取的状态流转以 “双击打开本地文本文档” 为例记事本进程的完整状态变化如下新建双击图标系统加载程序文件分配 PID、内存空间创建 PCB。就绪初始化完成进入系统就绪队列等待 CPU 调度。运行调度器选中记事本进程CPU 执行启动代码绘制窗口界面。运行→阻塞程序发起 “读取磁盘上的 txt 文件” IO 请求主动放弃 CPU进入不可中断睡眠状态。阻塞→就绪磁盘完成文件读取发送中断信号内核唤醒记事本进程重新进入就绪队列。就绪→运行调度器再次选中它CPU 继续执行将读取到的文字渲染到窗口。运行→就绪时间片用完被调度器换下 CPU回到就绪队列。运行→终止用户点击关闭程序执行退出逻辑、释放资源进入终止状态最终被系统回收。谢谢