0

0

Linux 进程生命周期与状态转换详解

冰川箭仙

冰川箭仙

发布时间:2026-01-30 21:07:02

|

319人浏览过

|

来源于php中文网

原创

用 ps 看清进程真实状态需理解状态码本质:R 表示就绪或运行(未必真执行),S 为可中断睡眠,D 是不可中断睡眠(kill -9 无效),Z 为僵尸进程;结合 top、strace、/proc//stack 等工具定位根因。

linux 进程生命周期与状态转换详解

怎么用 ps 看清进程真实状态?别被 R/S/Z 迷惑

Linux 进程状态不是“正在运行”或“没在运行”这么简单,ps 输出的状态码(如 RSDZ)直接反映内核当前对它的调度决策。很多人看到 R 就以为“肯定在跑”,其实它只表示“在运行队列里或真在 CPU 上”,单核系统中绝大多数 R 进程其实在排队等时间片。

  • R:就绪(ready)或运行(running)——关键看 CPU 负载;用 top -1 对比各核利用率,能快速判断是真忙还是假忙
  • S:可中断睡眠(TASK_INTERRUPTIBLE)——常见于 read()sleep()、等待用户输入;收到信号(如 SIGKILL)可立即唤醒
  • D:不可中断睡眠(TASK_UNINTERRUPTIBLE)——典型场景是等待磁盘 I/O 完成;此时 kill -9 也无效,只能等硬件响应或重启
  • Z:僵尸进程(zombie)——子进程已退出,但父进程没调用 wait() 回收;不占 CPU,但持续占用 PID 和进程表项;查父进程是否异常退出或存在 bug

为什么 fork 后子进程一启动就变 S?从创建到就绪的隐藏步骤

调用 fork() 并不等于进程立刻可运行。子进程刚被复制出来时处于“新建(new)”状态,内核需完成 PCB 初始化、内存页表建立、COW(写时复制)标记等操作,完成后才进入就绪队列(R)。但现实中你几乎看不到 R,因为现代 shell 启动子进程后常立刻调用 execve() 加载新程序,而加载过程会触发缺页中断,导致进程短暂进入 S 等待页框分配或磁盘读取。

  • strace -f bash -c 'sleep 1' 可观察到 forkexecve → 多次 mmapbrk → 最终 nanosleep 进入 S
  • 若父进程未 wait() 就 exit,子进程会变成 Z;若父进程崩溃且无 init 收养,Z 将长期滞留
  • 注意:容器环境(如 Docker)中 init 进程可能被替换,zombie 更难自动清理

阻塞态转就绪,到底谁来“叫醒”进程?

进程从 SD 回到就绪,不是靠自己定时轮询,而是由内核事件驱动。比如一个 read() 调用阻塞在磁盘读上,当块设备驱动完成数据搬运并触发中断,内核会标记对应等待队列上的进程为“就绪”,并将其 PCB 插入 CPU 对应的运行队列。但这里有个关键区别

Pixso AI
Pixso AI

Pixso AI是一款智能生成设计稿工具,通过AI一键实现文本输入到设计稿生成。

下载
  • S 态进程可被任意信号中断唤醒(包括 SIGCONT),所以调试时 kill -CONT 有时能让卡住的程序继续
  • D 态进程绕过了信号处理路径,只响应底层硬件事件;常见于 NFS 挂载点卡死、RAID 卡故障、ext4 journal 阻塞等场景
  • /proc//stack 查看内核,能确认它卡在哪条路径上(例如 __wait_on_bitnvme_submit_cmd

挂起(suspended)和睡眠(sleeping)根本不是一回事

新手常把 Ctrl+Z 挂起进程产生的 T 状态,跟 I/O 等待的 S 混为一谈。前者是用户主动触发的暂停(TASK_STOPPED),进程代码完全冻结,连信号处理都停摆;后者是内核调度策略下的协作式让出 CPU,随时准备响应外部事件。

  • T 态可用 kill -CONT 恢复;S 态恢复取决于事件是否发生,不能“强行唤醒”
  • 挂起进程仍驻留内存,不释放资源;而深度睡眠(D)进程虽不占 CPU,但可能持有锁、文件句柄甚至硬件通道
  • ps -o pid,stat,comm -C your_program 精确过滤状态,避免被 ps aux 的默认宽字段干扰判断

真正难排查的,往往是那些看似“正常”却长期卡在 D 或反复在 SR 间抖动的进程——它们背后通常是硬件响应延迟、驱动 Bug 或文件系统元数据锁争用,而不是代码逻辑问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

257

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

500

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

403

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

440

2024.04.08

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1415

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

706

2023.06.29

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.1万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号