跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

Linux 进程状态详解:内核视角与代码实例

Linux 进程状态涵盖新建、就绪、运行、阻塞、终止等通用状态,内核中具体定义为 R、S、D、T、X、Z。文章解析各状态含义及转换条件,通过 C 语言 fork 示例演示状态变化,深入探讨磁盘休眠、停止及僵尸进程的特殊机制与处理方案,并介绍 ps 命令用于进程状态查看与监控。

嘘发布于 2026/3/16更新于 2026/6/1727 浏览
Linux 进程状态详解:内核视角与代码实例

Linux 进程状态详解

进程状态的基础认知与内核视角

操作系统中的进程状态概览

在操作系统中,进程状态是核心概念。一般包括新建、就绪、运行、阻塞、终止等常见状态。

  • 新建:系统为进程分配资源。
  • 就绪:等待 CPU 调度。
  • 运行:正在执行指令。
  • 阻塞:等待事件完成(如 I/O)。
  • 终止:任务完成,回收资源。

这些状态相互转换,维持系统运转。

Linux 内核里的进程状态定义

Linux 内核通过 task_state_array 数组定义进程状态,核心成员包括 R (running)、S (sleeping)、D (disk sleep)、T (stopped)、X (dead) 和 Z (zombie)。

static const char * const task_state_array[] = {
    "R (running)",
    "S (sleeping)",
    "D (disk sleep)",
    "T (stopped)",
    "t (tracing stop)",
    "X (dead)",
    "Z (zombie)"
};

常用查看命令:ps aux / ps axj。

运行状态(R - running)

运行状态的进程不一定正在 CPU 上执行,可能在运行队列中等待调度。调度器根据优先级或时间片轮转分配 CPU 资源。

睡眠状态(S - sleeping)

S (sleeping) 状态的进程在等待特定事件结束,常与阻塞状态相关。例如进行 I/O 操作时进入睡眠态,释放 CPU 资源,待数据准备好后被唤醒。

代码实例中的进程状态变化

经典代码展示进程状态切换

以下 C 代码演示了进程创建后的状态变化:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    int ret = fork();
    if(ret < 0) {
        perror("fork");
        return 1;
    } else if(ret == 0) {
        // 子进程
        printf("I am child : %d!, ret: %d\n", getpid(), ret);
    } else {
        // 父进程
        printf("I am father : %d!, ret: %d\n", getpid(), ret);
    }
    sleep(1);
    return 0;
}

当 fork 函数执行后,父子进程均进入就绪态。执行 printf 时,因输出缓冲区问题可能短暂阻塞进入睡眠态,等待设备响应。

不同代码场景下进程状态的差异

  • 纯循环:进程持续占用 CPU,处于运行态。
  • 含 I/O 的循环:进程频繁等待 I/O,进入睡眠态。

特殊进程状态的深度解读与应对之策

磁盘休眠状态(D - disk sleep)

不可中断睡眠状态,进程等待磁盘 I/O 完成。对大多数信号不响应,确保数据安全写入。例如数据库存大量数据时进入此状态。

停止状态(T - stopped)

通过发送 SIGSTOP 信号暂停进程,SIGCONT 信号恢复执行。常用于调试程序,检查变量值及程序状态。

僵尸状态(Z - zombie)

子进程退出后,若父进程未调用 wait 或 waitpid 获取状态,子进程变为僵尸进程,占用系统资源。多进程服务器需及时清理子进程资源,防止系统变慢。

若父进程先退出,僵尸进程会被 init 进程领养并清理。

进程状态查看与监控的实用技巧

使用 ps aux 和 ps axj 命令查看进程信息。

while :; do 
    ps axj | head -1 && ps axj | grep 'code'; 
    sleep 1; 
done

ps aux 显示所有进程详细信息(启动者、CPU/内存使用、状态等)。ps axj 额外提供进程关系(会话 ID、父进程 ID),有助于理解进程家族树。

遇到问题时,利用这两个命令可快速定位进程状态,辅助故障排查。

目录

  1. Linux 进程状态详解
  2. 进程状态的基础认知与内核视角
  3. 操作系统中的进程状态概览
  4. Linux 内核里的进程状态定义
  5. 运行状态(R - running)
  6. 睡眠状态(S - sleeping)
  7. 代码实例中的进程状态变化
  8. 经典代码展示进程状态切换
  9. 不同代码场景下进程状态的差异
  10. 特殊进程状态的深度解读与应对之策
  11. 磁盘休眠状态(D - disk sleep)
  12. 停止状态(T - stopped)
  13. 僵尸状态(Z - zombie)
  14. 进程状态查看与监控的实用技巧
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 闲鱼 x-sign 生成算法逆向分析
  • tablib:Python 数据处理与格式转换库详解
  • 通过 Ambari API 添加服务时解决 CSRF 保护错误的方法
  • Node.js 调试核心要点全解析
  • 基于 DeepSeek 的 AI 对话系统构建:Spring Boot + 前端实战指南
  • 基于回调接口实现 AI 助手接入企业微信群聊
  • JESD204B 协议链路建立机制与 Xilinx IP 仿真实战
  • B 站 PC 端自动字幕脚本:快捷键控制与自动开启
  • 二叉树算法实战:新二叉树构建与遍历
  • Microsoft Edge WebView2 安装与故障排查指南
  • 二叉树算法实战:美国血统重建与深度宽度计算
  • OpenAI DALL·E API 绘图实战:从零构建 AI 绘画应用
  • 队列的数组模拟实现与 STL queue 实战
  • C++ 数组模拟单双向链表实现与优化
  • eNSP 安装教程:依赖环境配置与软件部署指南
  • 基于 OpenClaw 搭建 QQ AI 办公机器人:关键词触发与邮件发送
  • 宇树 VR 遥操与 IL:从 xr_teleoperate 到 unitree_IL_lerobot 的 G1 开发实践
  • 二分查找经典例题实战解析
  • Java Thread 类创建线程的多种方式与线程终止详解
  • 算法实战:Z 字形变换与外观数列解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online