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

​​深入理解进程状态:从运行到僵尸​

目录

​​1. 进程的三大基本状态​​

​​2. Linux 内核中的 7 种进程状态​​

​​(1)R (Running) - 运行状态​​

​​(2)S (Sleeping) - 可中断休眠​​

​​(3)D (Disk Sleep) - 不可中断休眠​​

​​(4)T (Stopped) - 暂停状态​​

​​(5)t (Tracing Stop) - 调试暂停​​

​​(6)X (Dead) - 死亡状态​​

​​(7)Z (Zombie) - 僵尸状态​​

​​3. 进程状态转换示例​​

​​4. 如何查看 Linux 进程状态?​​

​​(1)ps 命令​​

​​(2)top 命令​​

​​(3)/proc//status​​

​​5. 总结​​


在操作系统中,​​进程​​是程序执行的基本单位,而进程的状态管理是操作系统调度的核心。本文将详细介绍进程的几种主要状态,并结合 Linux 内核的实现,解析进程状态转换的底层逻辑。


​1. 进程的三大基本状态​

进程的状态通常可以分为三大类:

  1. ​运行状态(Running)​
    • 进程正在 CPU 上执行,或已就绪等待 CPU 调度。
    • 包括 ​​创建 → 就绪 → 运行​​ 的完整生命周期。
  2. ​阻塞状态(Blocked)​
    • 进程因等待某些条件(如 I/O 操作、信号量等)而暂停执行。
    • 例如:等待键盘输入、磁盘读取等。
  3. ​挂起状态(Suspended)​
    • 进程被临时移出内存,可能是由于 ​​内存不足​​ 或 ​​人为干预​​(如 Ctrl+Z)。
    • 挂起的进程 ​​代码和数据可能被存入磁盘​​,但 ​​PCB(进程控制块)仍保留​​。

​阻塞 vs. 挂起​

  • ​阻塞​​:进程仍在内存,只是暂时无法执行。
  • ​挂起​​:进程可能被换出到磁盘,以释放内存资源。

​2. Linux 内核中的 7 种进程状态​

Linux 内核的进程状态更加细化,源码中定义了 7 种状态(task_state_array):

static const char * const task_state_array[] = {"R (running)",    /* 0  - 运行或就绪 */"S (sleeping)",    /* 1  - 可中断休眠(等待事件) */"D (disk sleep)",  /* 2  - 不可中断休眠(如磁盘I/O) */"T (stopped)",     /* 4  - 暂停状态(如 Ctrl+Z) */"t (tracing stop)",/* 8  - 调试暂停(如 gdb 断点) */"X (dead)",        /* 16 - 进程已终止 */"Z (zombie)",      /* 32 - 僵尸进程(等待父进程回收) */
};

​(1)R (Running) - 运行状态​

  • 进程正在 CPU 执行,或 ​​就绪等待调度​​。
  • ​示例​​:top 命令中标记为 R 的进程。

​(2)S (Sleeping) - 可中断休眠​

  • 进程在等待某个事件(如 I/O 完成),​​可被信号唤醒​​。
  • ​示例​​:ps aux 中标记为 S 的进程。

​(3)D (Disk Sleep) - 不可中断休眠​

  • 类似 S,但 ​​不能被强制终止​​(如正在写入磁盘的关键进程)。
  • ​示例​​:ps aux 中标记为 D 的进程(罕见,通常出现在磁盘高负载时)。

​(4)T (Stopped) - 暂停状态​

  • 进程被 ​​主动暂停​​(如 Ctrl+Zkill -STOP)。
  • ​恢复方式​​:fg(前台恢复)或 bg(后台恢复)。

​(5)t (Tracing Stop) - 调试暂停​

  • 进程被调试器(如 gdb)暂停,通常是在断点处停止。
  • ​示例​​:调试程序时,进程状态可能显示为 t

​(6)X (Dead) - 死亡状态​

  • 进程已结束运行,​​资源已被回收​​。
  • ​注意​​:该状态极短暂,通常无法通过 ps 观察到。

​(7)Z (Zombie) - 僵尸状态​

  • 进程已终止,但 ​​父进程尚未调用 wait() 回收其退出状态​​。
  • ​危害​​:僵尸进程会占用内核资源,过多可能导致内存泄漏。
  • ​解决方案​​:
    • 父进程正确处理子进程退出(如 waitpid)。
    • 若父进程已退出,僵尸进程会被 init 进程(PID=1)回收。

​3. 进程状态转换示例​

  1. ​创建 → 就绪​​:进程初始化完成,等待 CPU 调度。
  2. ​就绪 → 运行​​:被调度器选中,开始执行。
  3. ​运行 → 阻塞​​:等待 I/O 或信号量,主动让出 CPU。
  4. ​阻塞 → 就绪​​:等待的条件满足(如数据到达),重新进入调度队列。
  5. ​运行 → 挂起​​(过程比图实际中要复杂):内存不足或人为干预(如 Ctrl+Z)。
  6. ​挂起 → 就绪​​(过程比图实际中要复杂):被换回内存,等待调度。

实际挂起也分为“挂起就绪”和“挂起阻塞”​​​

  1. ​挂起就绪​​:

    • 进程 ​​不依赖任何事件​​,换回内存后可直接被调度。

    • ​示例​​:一个计算密集型任务被挂起后重新激活。

  2. ​挂起阻塞​​:

    • 进程 ​​仍在等待事件​​(如 I/O),即使换回内存也无法立即运行。

    • ​示例​​:一个等待磁盘读取的进程被挂起后重新激活,仍需等待 I/O 完成。


​4. 如何查看 Linux 进程状态?​

​(1)ps 命令​

ps aux | grep <进程名>
  • ​STAT 列​​ 显示进程状态(如 RSZ 等)。

​(2)top 命令​

top
  • 实时查看进程状态,R 表示运行,S 表示休眠。

​(3)/proc/<PID>/status

cat /proc/1234/status
  • 查看特定进程的详细状态信息。

​5. 总结​

  • ​运行(R)​​:进程正在执行或就绪。
  • ​阻塞(S/D)​​:等待资源,区别在于是否可被中断。
  • ​挂起(T/t)​​:进程被暂停或换出内存。
  • ​僵尸(Z)​​:子进程已结束,但父进程未回收。
  • ​死亡(X)​​:进程完全终止。

理解进程状态有助于 ​​优化程序性能​​、​​排查系统问题​​(如僵尸进程),是系统管理和开发调试的重要基础。

http://www.dtcms.com/a/283644.html

相关文章:

  • 学习软件测试掌握什么基本知识?
  • 数字经济专业核心课程解析:从理论到实践的学习框架
  • C/C++---rdbuf()函数
  • parallels desktop windows win10无法复制文件无法共享剪切板
  • 利用node.js在本地搭建简易http服务器
  • QT跨平台应用程序开发框架(10)—— Qt窗口
  • 【C#】Vscode中C#工程如何引用自编写的dll
  • React hooks——useReducer
  • 端到端神经网络视频编解码器介绍
  • 神经网络常见激活函数 14-Mish函数
  • AI学习笔记三十二:YOLOv8-CPP-Inference测试(Linux版本)
  • CDSS系统升级“可视化解释-智能反馈-临床语言“三位一体设计架构设计分析
  • 「Chrome 开发环境快速屏蔽 CORS 跨域限制详细教程」*
  • lua(xlua)基础知识点记录二
  • Oracle数据泵详解——让数据迁移像“点外卖”一样简单​
  • 数据库管理-第349期 Oracle DB 23.9新特性一览(20250717)
  • python与正则:前后向断言、分组,以及案例练习
  • Xss-labs 1-8关的初步通关
  • 【Linux系统】进程地址空间
  • 时序数据库选型指南 —— 为什么选择 Apache IoTDB?
  • Qt Quick 粒子系统详解
  • 数据呈现高阶技巧:散点图与桑基图的独特价值
  • 从零开始学 Linux 系统安全:基础防护与实战应用
  • 12.9 Mixtral-8x7B核心技术解密:如何用1/3参数实现4倍推理速度碾压LLaMA2?
  • 取消office word中的段落箭头标记
  • 多方案对比分析:后端数据加密策略及实践
  • 菜单权限管理
  • 【Linux】LVS(Linux virual server)
  • zabbix安装(docker-compose)
  • 若依框架开启注册功能全流程指南