当前位置: 首页 > ds >正文

从就绪到终止:操作系统进程状态转换指南

前言:

        在操作系统的核心机制中,进程管理是至关重要的组成部分。进程在其生命周期中会经历多种状态的变化,如创建、就绪、运行、阻塞、挂起和终止等。理解这些状态及其转换关系,不仅有助于掌握操作系统的调度原理,也能为系统性能优化、进程调试和并发程序设计提供理论基础。

目录

一、进程状态分类

二、状态转换流程

(1)从创建到就绪

(2)就绪与运行的转换

(3)运行到阻塞

(4)阻塞到就绪

(5)挂起状态的转换

(6)终止

三、关键转换场景

四、与Linux实际状态的对比

五、总结


进程状态转换模型,通常出现在操作系统理论中,用于说明进程在其生命周期中的状态变化:

一、进程状态分类

图中涉及的主要状态包括:

  1. 创建状态(New):进程刚被创建,尚未进入就绪队列。

  2. 就绪状态(Ready):进程已准备好运行,等待CPU调度。

  3. 运行状态(Running):进程正在CPU上执行。

  4. 阻塞状态(Blocked/Waiting):进程因等待某事件(如I/O完成)而暂停运行。

  5. 挂起状态(Suspended):进程被移到外存(Swap),暂时不参与调度(可能是就绪挂起或阻塞挂起)。

  6. 结束状态(Terminated):进程执行完毕或被终止。


二、状态转换流程

(1)从创建到就绪

  • 创建状态 → 就绪状态
    进程初始化完成后,进入就绪队列等待调度。

(2)就绪与运行的转换

  • 就绪状态 → 运行状态
    被CPU调度器选中,开始执行。

  • 运行状态 → 就绪状态

    • 时间片用完:进程未执行完,但CPU时间片耗尽,重新放回就绪队列。

    • 被更高优先级进程抢占:调度器强制切换进程。

(3)运行到阻塞

  • 运行状态 → 阻塞状态
    进程主动等待某事件(如读取磁盘数据),主动让出CPU。

(4)阻塞到就绪

  • 阻塞状态 → 就绪状态
    等待的事件完成(如I/O操作结束),进程重新具备运行条件。

(5)挂起状态的转换

  • 就绪状态 ↔ 就绪挂起状态

    • 挂起:系统资源不足时,将就绪进程移到外存(暂停调度)。

    • 激活:资源恢复时,重新调入内存。

  • 阻塞状态 ↔ 阻塞挂起状态

    • 挂起:即使进程在等待事件,也可能被换出到外存。

    • 激活:事件完成后,需先回到内存的阻塞队列。

(6)终止

  • 运行状态 → 结束状态
    进程正常结束或被强制终止(如kill -9)。


三、关键转换场景

转换触发条件
就绪 → 运行CPU调度器选择该进程执行。
运行 → 就绪时间片用完或被更高优先级进程抢占。
运行 → 阻塞进程主动等待I/O、信号量等事件(如read()系统调用)。
阻塞 → 就绪等待的事件完成(如磁盘数据就绪)。
就绪 ↔ 就绪挂起系统内存不足时挂起,资源充足时激活。
阻塞 ↔ 阻塞挂起即使进程在等待,也可能被挂起以释放内存(需等待事件完成才能激活)。

四、与Linux实际状态的对比

后面将要讲解的Linux中的进程状态(如RSDTZ)是此模型的具体实现:

  • 就绪状态 → TASK_RUNNINGR)。

  • 阻塞状态 → TASK_INTERRUPTIBLES)或 TASK_UNINTERRUPTIBLED)。

  • 挂起状态 → 部分情况对应TASK_STOPPEDT),或通过Swap机制实现。


五、总结

  • 该图是通用操作系统的进程状态机模型,适用于理论分析。

  • 挂起状态是资源管理的优化手段(缓解内存压力)

  • Linux的实现更简化,但核心逻辑(就绪、运行、阻塞)保持一致。

http://www.xdnf.cn/news/15311.html

相关文章:

  • 将手工建模模型(fbx、obj)转换为3dtiles的免费工具!
  • 上半年净利预增66%-97%,高增长的赛力斯该咋看?
  • 聊一聊在 Spring Boot 项目中自定义 Validation 注解
  • 牛客小白月赛119
  • 进程状态 + 进程优先级切换调度-进程概念(5)
  • 【C++篇】二叉树进阶(上篇):二叉搜索树
  • Qt中QGraphicsView类应用解析:构建高效2D图形界面的核心技术
  • 数据结构-顺序表
  • 【C语言网络编程】HTTP 客户端请求(域名解析过程)
  • Oracle字符类型详解:VARCHAR、VARCHAR2与CHAR的区别
  • Qt数据库编程详解:SQLite实战指南
  • 解决Linux绑定失败地址已使用(端口被占用)的问题
  • 设计仿真 | MSC Apex Simufact实现铁路铰链轻量化与高精度增材制造
  • 在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
  • MySQL:分析表锁的常见问题
  • JavaScript加强篇——第四章 日期对象与DOM节点(基础)
  • P9755 [CSP-S 2023] 种树
  • 【JavaScript高级】构造函数、原型链与数据处理
  • OS16.【Linux】冯依诺曼体系结构和操作系统的浅层理解
  • docker-compose安装常用中间件
  • 【unitrix】 4.21 类型级二进制数基本结构体(types.rs)
  • 1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却
  • C语言的程序控制语句
  • VR协作海外云:跨国企业沉浸式办公解决方案
  • 决策树算法在医学影像诊断中的广泛应用
  • ch07 题解
  • 番外-linux系统运行.net framework 4.0的项目
  • [特殊字符]远程服务器配置pytorch环境
  • 设计模式笔记_结构型_代理模式
  • 基于vscode开发工具显示git提交信息的插件