前言

        在Linux系统中,进程状态是系统管理和性能调优的核心知识。一个进程从诞生到终止,会经历运行(R)、可中断睡眠(S)、不可中断睡眠(D)、停止(T)、僵尸(Z)等多种状态。理解这些状态的含义、触发条件及观察方法,是诊断进程挂起、资源泄漏等问题的关键。

目录

一、进程状态观察详解

1、运行状态(R - Running/TASK_RUNNING)

示例观察方法

1. 创建测试程序

2. 运行程序并观察状态

方法一:使用top命令

方法二:使用ps命令

2、可中断睡眠(S - Interruptible Sleep/TASK_INTERRUPTIBLE)

3、不可中断睡眠(D - Uninterruptible Sleep/TASK_UNINTERRUPTIBLE)

方法一:模拟磁盘I/O导致的D状态

1. 创建测试脚本

2. 准备观察环境

第一步:查看可用设备

第二步:创建挂载点目录

第三步:执行挂载一个慢速存储设备

第四步:验证挂载

第五步:给脚本执行权限:

第六步:运行并观察

4、停止状态(T - Stopped/TASK_STOPPED)

5、跟踪状态(T - Tracing Stop)

1. 创建进程并进入跟踪状态

2. 使用调试器附加到进程

3. 观察进程状态

4. 状态变化示例

5. 其他产生T状态的场景(了解,不要求掌握)

6. 如何解除T状态

6、僵尸状态(Z - Zombie/EXIT_ZOMBIE) 

1. 创建僵尸进程的C程序

2. 编译并运行程序

3. 观察进程状态

4. 预期观察到的现象

5. 清理僵尸进程(后面会讲解,现在先了解)

6. 僵尸进程的特点

7. 僵尸进程的危害

7、死亡状态(X - Dead/EXIT_DEAD)

理解死亡状态的特点

二、常见问题

三、总结


一、进程状态观察详解

1、运行状态(R - Running/TASK_RUNNING)

        进程处于运行状态(running)并不等同于正在执行。运行状态意味着该进程要么正在CPU上运行,要么处于运行队列中等待执行。因此,系统中可以同时存在多个R状态的进程。

重点:

  • 所有可调度的运行状态进程都会被放入运行队列
  • 操作系统进行进程切换时,直接从运行队列中选择下一个要执行的进程
  • 单核CPU上同一时刻只有一个进程真正在CPU上运行
  • 其他R状态的进程都在运行队列中等待

  • 多核CPU上可以有多个进程同时处于"正在运行"状态

示例观察方法

1. 创建测试程序

创建一个简单的CPU密集型程序来观察R状态:

// cpu_busy.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {printf("PID: %d\n", getpid());while(1) {// 空循环保持CPU占用}return 0;
}

编译:

gcc cpu_busy.c -o cpu_busy

2. 运行程序并观察状态

方法一:使用top命令
  1. 在当前终端窗口运行程序:

    ./cpu_busy
  2. 在另一个终端窗口运行top:

top

在top界面中,按Shift + P按CPU使用排序、观察STAT列,会显示R状态:

方法二:使用ps命令
ps aux | grep cpu_busy

输出示例:

其中R+表示:

  • R:运行状态

  • +:在前台进程组中

2、可中断睡眠(S - Interruptible Sleep/TASK_INTERRUPTIBLE)

        一个进程处于浅度睡眠状态(sleeping)表示它正在等待某个事件的完成。处于这种状态的进程可以被随时唤醒或终止(这种状态也被称为可中断睡眠,即interruptible sleep)。

例如运行以下代码:

#include <stdio.h>
#include <unistd.h>int main()
{printf("I am running... \n");sleep(100);return 0;
}

编译并运行: 

        在代码中调用sleep函数休眠100秒期间,若用其他用户查看进程状态,会发现进程处于浅度睡眠状态:

处于浅度睡眠状态的进程可以被终止,使用kill命令即可强制结束该进程:

3、不可中断睡眠(D - Uninterruptible Sleep/TASK_UNINTERRUPTIBLE)

        当进程处于深度睡眠状态(Disk Sleep)时,系统无法终止该进程,只能等待其自行唤醒。这种状态也被称为不可中断睡眠状态(Uninterruptible Sleep),通常发生在进程等待I/O操作完成时。

        以磁盘写入为例:当进程发起写盘请求后,会进入深度睡眠状态等待磁盘响应(如写入成功/失败的通知)。在此状态下,即使系统也无法终止该进程,必须等待I/O操作完成。(又称磁盘休眠状态)

方法一:模拟磁盘I/O导致的D状态

1. 创建测试脚本

创建一个会触发磁盘I/O的脚本:

#!/bin/bash
# 保存为 disk_io_test.shecho "PID: $$"
echo "将模拟磁盘I/O操作..."# 向慢速设备(如U盘/NFS)写入大量数据
dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=1024 2>/dev/nullecho "I/O操作完成"

2. 准备观察环境

第一步:查看可用设备

lsblk  # 查看所有存储设备

输出示例:

        根据lsblk 的输出,可以看到我的系统只有一个虚拟磁盘设备(vda),没有检测到其他存储设备。这是典型云服务器或虚拟机的配置。

  1. vda:虚拟磁盘(40GB)

  2. vda1:第一个分区(已挂载到根目录 /

第二步:创建挂载点目录

sudo mkdir /mnt/mydisk  # 创建一个新目录作为挂载点

第三步:执行挂载一个慢速存储设备

sudo mount /dev/vda1 /mnt/mydisk

第四步:验证挂载

df -h  # 查看已挂载的文件系统

ls /mnt/mydisk  # 查看挂载的设备内容

第五步:给脚本执行权限:

chmod +x disk_io_test.sh

第六步:运行并观察

  1. 在一个终端运行脚本:

    ./disk_io_test.sh

  2. 在另一个终端观察进程状态:

    watch -n 0.5 'ps aux | grep disk_io_test | grep -v grep'

        命令刚启动时的状态,可能还未进入深度睡眠(D状态),而如果进入深度睡眠(D状态),会输出示例,必须要有产生足够的 I/O 压力,才会实现(我模拟不了,大概看一下就行):

user  12345  0.0  0.0  12345  678 pts/1    D+   14:30   0:05 /bin/bash ./disk_io_test.sh

其中D+表示:

  • D:深度睡眠状态(不可中断)

  • +:前台进程组

4、停止状态(T - Stopped/TASK_STOPPED)

        Linux系统可通过发送SIGSTOP信号将进程挂起为暂停状态(Stopped),发送SIGCONT信号则可恢复被暂停的进程运行。

例如:

向某进程发送SIGSTOP信号后,该进程立即进入暂停状态:

直到收到SIGCONT信号才会继续执行:

5、跟踪状态(T - Tracing Stop)

1. 创建进程并进入跟踪状态

首先,我们需要创建一个可以被跟踪的进程:

#include <stdio.h>
#include <unistd.h>int main() {printf("子进程PID: %d\n", getpid());while(1) {// 无限循环保持进程运行sleep(1);}return 0;
}

编译并运行这个程序,记下它的PID:

2. 使用调试器附加到进程

在另一个终端中,使用gdb附加到该进程:

sudo gdb -p <PID>

使用第三个终端观察,此时,被调试的进程会进入T (Tracing Stop)状态:

3. 观察进程状态

在第三个终端中,查看进程状态:

ps -o pid,state,cmd -p <PID>

输出可能类似于:

4. 状态变化示例

  • 初始状态:进程正常运行,状态为"S"(睡眠)

  • 附加调试器后:状态变为"T"(被跟踪)

  • 继续执行:在gdb中输入"continue",状态可能变回"S"

  • 断点命中:当遇到断点时,状态再次变为"T"

5. 其他产生T状态的场景(了解,不要求掌握)

  1. 使用strace跟踪系统调用

    strace -p <PID>
  2. 使用ptrace系统调用Ptrace 详解 - tangr206 - 博客园

    // 跟踪进程的示例代码
    ptrace(PTRACE_ATTACH, pid, NULL, NULL);
  3. 接收到SIGSTOP信号

    kill -SIGSTOP <PID>

6. 如何解除T状态

  • 在gdb中:使用detach命令或退出gdb

  • 对于strace:按Ctrl+C终止strace

  • 对于SIGSTOP:发送SIGCONT信号

    kill -SIGCONT <PID>

6、僵尸状态(Z - Zombie/EXIT_ZOMBIE) 

1. 创建僵尸进程的C程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid == 0) {int cnt=60;while(cnt--){// 子进程printf("子进程 PID: %d 开始运行\n", getpid());sleep(2);  // 模拟子进程工作printf("子进程 PID: %d 即将退出\n", getpid());}exit(0);   // 子进程退出} else if (pid > 0) {// 父进程printf("父进程 PID: %d 创建了子进程 %d\n", getpid(), pid);printf("父进程将不调用wait(),故意制造僵尸进程\n");// 父进程不调用wait(),继续运行while(1) {sleep(1);printf("父进程仍在运行...\n");}} else {perror("fork失败");exit(1);}return 0;
}

2. 编译并运行程序

gcc -o zombie zombie.c
./zombie

3. 观察进程状态

重新运行,然后在另一个终端窗口中,使用以下命令观察进程状态变化:

watch -n 1 'ps -eo pid,ppid,state,cmd | grep -E "PID|zombie"'

4. 预期观察到的现象

  1. 初始阶段:父子进程都处于运行状态(S)

  2. 子进程退出后

    • 子进程状态变为Z(僵尸)

    • 父进程仍在运行

  3. 最终状态

5. 清理僵尸进程(后面会讲解,现在先了解)

要清理僵尸进程,可以:

  1. 终止父进程:

    kill -9 <父进程PID>
  2. 或者修改程序让父进程调用wait():

    // 在父进程代码中添加
    wait(NULL);  // 回收子进程

6. 僵尸进程的特点

  • 出现在进程表中,占用一个PID

  • 已释放大部分资源,仅保留退出状态等信息

  • PPID为创建它的父进程

  • 命令显示为[进程名] <defunct>

  • 只能通过终止父进程或让父进程调用wait()来清除

7. 僵尸进程的危害

  • 僵尸进程的退出状态必须一直维持下去,因为它要告诉其父进程相应的退出信息。可是父进程一直不读取,那么子进程也就一直处于僵尸状态。
  • 僵尸进程的退出信息被保存在task_struct(PCB)中,僵尸状态一直不退出,那么PCB就一直需要进行维护。
  • 若是一个父进程创建了很多子进程,但都不进行回收,那么就会造成资源浪费,因为数据结构对象本身就要占用内存。
  • 僵尸进程申请的资源无法进行回收,那么僵尸进程越多,实际可用的资源就越少,也就是说,僵尸进程会导致内存泄漏。

7、死亡状态(X - Dead/EXIT_DEAD)

        死亡状态(X)是进程的最终状态,表示进程已经完全终止且其资源已被系统回收。由于这个状态持续时间极短(几乎是瞬时的),直接观察非常困难。

理解死亡状态的特点

  • 瞬时性:X状态是进程从退出到完全消失之间的瞬时状态

  • 不可见性:通常无法通过ps等工具直接观察到

  • 前驱状态:进程通常从Z(僵尸)状态转为X状态


二、常见问题

  1. 僵尸进程积累

    • 原因:父进程未正确处理子进程退出。

    • 解决:找到父进程ID(PPID)并重启或发送SIGCHLD信号。

  2. 不可中断进程卡住

    • 可能原因:硬件故障(如磁盘坏块)、内核Bug。

    • 排查:dmesg查看内核日志,检查硬件健康。

  3. 高负载下RUNNING进程过多:使用vmstat 1mpstat -P ALL 1分析CPU竞争。

  4. SD状态的区别:S可被信号中断,D必须等待事件完成(即使发送kill -9无效)。

  5. 为什么进程长时间处于D状态?

  • 可能原因:硬件故障(如磁盘损坏)、内核驱动Bug。

  • 解决方案:检查dmesg日志,修复硬件或更新驱动。


三、总结

  • 理解进程状态是系统调优和故障排查的基础。

  • R/S/D是常见状态,Z需及时处理,T常用于调试。

  • 结合pstop/proc等工具实时监控状态变化。

        掌握这些状态及其转换机制,能有效诊断进程挂起、资源泄漏等问题。实际应用中需结合日志和性能工具(如straceperf)深入分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913581.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913581.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913581.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库与关系数据库的区别是什么

数据库&#xff0c;简单来说&#xff0c;就是一个存储数据的地方&#xff0c;就像一个超级大仓库&#xff0c;能把各种各样的数据都收纳进来。它可以是一个简单的文本文件&#xff0c;用来记录一些基本信息&#xff1b;也可以是一个复杂的系统&#xff0c;存储着企业的大量业务…

如何解决微信小程序出现两个下拉刷新样式?

在微信小程序中&#xff0c;如果出现两个下拉刷新的情况&#xff0c;可能是因为在多个地方启用了下拉刷新功能&#xff0c;或者在同一个页面中多次调用了下拉刷新的API。以下是一些可能的原因和解决方法&#xff1a; 多次调用下拉刷新API&#xff1a; 确保在页面的生命周期中只…

(3)手摸手-学习 Vue3 之 变量声明【ref 和 reactive】区别

手摸手-学习 Vue3 之 变量声明【ref 和 reactive】区别前言ref 扩展ref 和 reactive 区别前言 ref 扩展 在之前博文《&#xff08;2&#xff09;手摸手-学习 Vue3 之 变量声明【ref 和 reactive】》中有提到&#xff1a; 当时已基本类型 进行演练说明&#xff0c;此时以 对象…

机器视觉运动控制一体机在SCARA机器人柔振盘上下料的应用

市场应用背景 SCARA机器人是一种高效、高精度的圆柱坐标系工业机器人&#xff0c;专精于装配任务。其独特的机械结构赋予其在特定方向&#xff08;通常是XY平面&#xff09;高度顺应性&#xff0c;同时在垂直方向保持优异刚性。 SCARA机器人本体通常包含三个轴线平行的旋转关…

3D 演示动画在汽车培训与教育领域中的应用

在企业培训这一至关重要的领域中&#xff0c;3D 演示动画犹如一颗璀璨的明星&#xff0c;发挥着无可替代的关键作用&#xff0c;大显身手。以某知名汽车制造企业为例&#xff0c;当对新入职员工开展汽车装配培训工作时&#xff0c;企业精心利用先进的 3D 演示动画技术制作了极为…

华锐视点 VR 污水处理技术对激发学习兴趣的作用​

华锐视点的 VR 虚拟仿真平台&#xff0c;尤其是 VR 污水处理模块&#xff0c;不仅仅是让学生观察&#xff0c;还设置了丰富多样的互动操作环节&#xff0c;充分激发学生的学习兴趣和主动性。​在平台的 VR 污水处理模拟中&#xff0c;学生可以模拟操作各种污水处理设备。比如&a…

百度斩获大模型中标第一,股价上涨5%

7月7日&#xff08;周一&#xff09;&#xff0c;百度&#xff08;BIDU.US&#xff09;股价上涨 5%&#xff0c;收报 90.68美元。最新数据显示&#xff0c;2025上半年我国大模型相关项目呈现爆发式增长态势&#xff1a;中标项目累计达 1810个&#xff0c;金额突破 64亿元&#…

【计算机网络】4网络层②

概念是什么?以太网有线联网的标准LAN小范围网络(家里/公司)WAN大范围网络(跨城市)Internet全球公共互联网 🌍internet任意互联的网络 🔗子网将一个LAN通过路由器的硬件隔离分为多个LAN(广播域)VLAN将一个LAN通过交换机的软件方法分为多个VLAN(广播域)以太网和Wi-Fi建L…

微信小程序81~90

1. 配置分包加载以及打包、引用原则 小程序如果需要进行分包加载&#xff0c;需要在 app.json 中&#xff0c;通过 subPackages 或者 subpackages 定义分包结构 每个分包结构含三个常用字段&#xff1a; root&#xff1a;分包的根目录&#xff0c;该目录下的所有文件都会被打包…

深度学习——神经网络1

一、神经网络 1.神经网络定义&#xff1a;人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c;是一种模仿生物神经网络结构和功能的计算模型。人脑可以看作是一个生物神经网络&#xff0c;由…

ipmitool 使用简介(ipmitool sel list ipmitool sensor list)

常用IPMI命令扩展使用ipmitool查看传感器信息ipmitool是一个用于管理IPMI&#xff08;Intelligent Platform Management Interface&#xff09;设备的命令行工具&#xff0c;可用于监控服务器硬件状态&#xff0c;包括传感器数据。运行以下命令可以列出所有传感器信息&#xff…

小米YU7预售现象深度解析:智能电动汽车的下一个范式革命

小米YU7预售现象深度解析&#xff1a;智能电动汽车的下一个范式革命一、预售数据创造三项行业新纪录 2025年6月26日的小米YU7发布会&#xff0c;不仅刷新了智能汽车预售速度&#xff0c;更揭示了新时代的消费心理变迁&#xff1a; &#xff08;1&#xff09;订单爆发速度史无前…

xlog-Android15适配之16KB对齐

背景 前两天查看Google play控制台突然发现有告警&#xff0c;一看原来是要求必须尽快适配Android15。 过程 先看了一下网上的资料&#xff0c;Android15适配 发现对我的apk基本上没有什么影响&#xff0c;除了 动态库必须16KB对齐这一项。 最简单查看apk是否16KB对齐的方法…

Crazyflie支持MATLAB/Simulink控制 基于NOKOV度量动捕系统实现

Crazyflie支持MATLABSimulink控制 基于NOKOV度量动捕系统实现 一、动捕软件VRPN配置 以动捕软件版本XINGYING 4.2.0.5495为例&#xff0c;其他版本同理。打开动捕软件&#xff0c;连接上镜头。单击菜单栏下的视图->数据广播。在数据广播中的VRPN流下&#xff0c;将单位下拉…

Windows 系统安装与使用 Claude Code 全攻略

Claude Code 作为一款高效的 AI 编程辅助工具&#xff0c;深受开发者青睐&#xff0c;但由于其本身不支持 Windows 文件系统&#xff0c;在 Windows 系统上使用需要借助 WSL&#xff08;适用于 Linux 的 Windows 子系统&#xff09;。下面为你详细介绍在 Windows 系统上安装和使…

如何用Python编程计算权重?

1. 加权平均中的权重计算&#xff08;已知权重值&#xff09; 如果已知各元素的权重&#xff0c;直接用权重乘以对应值后求和。 # 示例&#xff1a;计算加权平均分&#xff08;权重之和为1&#xff09; scores [80, 90, 70] # 各项分数 weights [0.3, 0.5, 0.2] # 对应权重…

WinUI3入门16:Order自定义排序

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Java 面向对象三大特性详解:封装、继承与多态,掌握OOP核心思想

作为一名Java开发工程师&#xff0c;你一定知道&#xff0c;封装&#xff08;Encapsulation&#xff09;、继承&#xff08;Inheritance&#xff09;和多态&#xff08;Polymorphism&#xff09; 是面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;的三大…

WPS中配置MathType教程

项目场景&#xff1a;在WPS中使用MathType问题描述&#xff1a;MathPage.wll或MathType.dll文件找不到问题原因分析&#xff1a;在C盘wps中的startup中有mathpage.wll,但配置不可用而我的WPS安装在E盘&#xff0c;并且桌面图标启动路径也是E盘路径下的WPS路径&#xff0c;所以不…

基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理

1.模板设计模式&#xff1a;模板设计模式是一种常见的设计模式&#xff0c;主要作用是对 具体操作的 共有代码块进行提取&#xff0c;提升代码复用性。那么说道代码复用性&#xff0c;首先想到的是抽象类而不是接口。因为抽象类的本质就是为了代码复用&#xff0c;抽象类既可以…