# 2.2 进程的状态与转换 ## 一、进程的基本状态 ### 1.1 三种基本状态 进程在其生命周期中,由于调度策略和运行情况的不同,会处于不同的状态。 #### 就绪状态(Ready) **定义**:进程已分配到除CPU以外的所有必要资源,只要获得CPU就可以立即执行。 **特点**: - 万事俱备,只欠CPU - 处于就绪队列中等待调度 - 可以有多个进程同时处于就绪状态 #### 执行状态(Running) **定义**:进程已获得CPU,正在执行。 **特点**: - 单处理机系统中,只有一个进程处于执行状态 - 多处理机系统中,可以有多个进程同时执行 - 进程正在使用CPU执行指令 #### 阻塞状态(Blocked,等待状态 Wait) **定义**:进程因等待某事件(如I/O完成、资源分配)而暂停执行。 **特点**: - 即使分配CPU也无法执行 - 处于阻塞队列中等待某事件 - 等待的事件完成后转为就绪状态 ### 1.2 状态转换图 ``` 调度 就绪 ----------> 执行 ^ | | | 时间片到/被抢占 | v | 执行 | | | 事件发生 | 请求I/O/等待资源 | v +-------------- 阻塞 等待事件 ``` --- ## 二、进程状态的转换 ### 2.1 就绪 → 执行 **转换原因**:进程被调度程序选中,获得CPU。 **触发条件**: - 当前运行进程时间片用完 - 当前运行进程阻塞 - 当前运行进程结束 - 新进程到达且优先级更高(抢占式) ### 2.2 执行 → 就绪 **转换原因**: - **时间片到**:分时系统中,进程时间片用完 - **被抢占**:更高优先级的进程到达 - **主动放弃**:进程主动让出CPU ### 2.3 执行 → 阻塞 **转换原因**:进程请求某事件,无法继续执行。 **触发条件**: - 请求I/O操作 - 请求资源失败(如申请内存失败) - 等待某信号或消息 - 等待同步信号量 ### 2.4 阻塞 → 就绪 **转换原因**:进程等待的事件已完成。 **触发条件**: - I/O操作完成 - 资源分配成功 - 收到信号或消息 - 同步条件满足 **注意**:阻塞态不能直接转换为执行态,必须经过就绪态。 --- ## 三、进程的五种状态模型 ### 3.1 增加两种状态 在实际操作系统中,通常会增加两种状态: #### 新建状态(New) **定义**:进程正在被创建,尚未进入就绪队列。 **创建过程**: 1. 申请空白PCB 2. 分配资源 3. 初始化PCB 4. 插入就绪队列 #### 终止状态(Terminated,退出状态 Exit) **定义**:进程结束运行,正在回收资源。 **终止过程**: 1. 等待操作系统进行善后处理 2. 回收PCB 3. 释放资源 ### 3.2 五状态转换图 ``` 新建 --> 就绪 <--> 执行 --> 终止 ^ | | v +-- 阻塞 ``` --- ## 四、进程的挂起状态 ### 4.1 引入挂起状态的原因 - 系统负荷过大,需要将某些进程换出内存 - 用户需要调试程序,将进程挂起 - 父进程需要考察子进程的状态 - 操作系统需要检查资源使用情况 ### 4.2 挂起状态的类型 #### 就绪挂起(Ready Suspend) **定义**:进程在外存,但只要调入内存就可以执行。 **特点**: - 进程映像在外存 - 只要调入内存就转为就绪态 - 优先级通常较低 #### 阻塞挂起(Blocked Suspend) **定义**:进程在外存,等待某事件。 **特点**: - 进程映像在外存 - 等待的事件完成后转为就绪挂起 - 需要调入内存才能执行 ### 4.3 七状态模型 ``` 激活 就绪挂起 ------> 就绪 ^ | | | 调度 | v | 执行 | | | | 挂起 | v +-------- 就绪挂起 | | 事件完成 v 阻塞挂起 <------ 阻塞 挂起 ``` ### 4.4 挂起与阻塞的区别 | 特性 | 挂起 | 阻塞 | |-----|------|------| | 原因 | 系统或用户需要 | 进程自身需要等待事件 | | 位置 | 可以在内存或外存 | 通常在内存(除非同时挂起) | | 转换 | 可以挂起就绪或阻塞进程 | 进程主动进入阻塞 | | 激活 | 需要激活操作 | 事件完成后自动转为就绪 | --- ## 五、进程状态的实现 ### 5.1 PCB中的状态字段 每个PCB中都有一个状态字段,表示进程当前状态: ```c enum ProcessState { NEW, // 新建 READY, // 就绪 RUNNING, // 执行 BLOCKED, // 阻塞 TERMINATED // 终止 }; struct PCB { int pid; ProcessState state; // ... }; ``` ### 5.2 进程队列的组织 操作系统通常维护多个队列: - **就绪队列**:所有就绪进程 - **阻塞队列**:按等待事件分类的多个队列 - **挂起队列**:挂起的进程 ### 5.3 状态转换的原语操作 状态转换通常由操作系统原语完成: - **创建原语**:新建 → 就绪 - **调度原语**:就绪 → 执行 - **阻塞原语**:执行 → 阻塞 - **唤醒原语**:阻塞 → 就绪 - **挂起原语**:就绪/阻塞 → 挂起 - **激活原语**:挂起 → 就绪/阻塞 - **撤销原语**:执行 → 终止 --- ## 六、考研重点 1. **三种基本状态**:就绪、执行、阻塞 2. **状态转换的原因和条件** 3. **五状态模型**:增加新建和终止 4. **七状态模型**:增加挂起状态 5. **挂起与阻塞的区别** 6. **状态转换图**:能画出并解释 7. **PCB中的状态字段** 8. **进程队列的组织** --- *下一节:2.3 进程控制*