【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态
目录
操作系统中
运行状态
阻塞状态
进程状态转换
Linux系统中
查看进程状态
深度睡眠状态
T 暂停状态
Z 僵尸状态
孤儿状态
文章手稿
xmind:
引言
介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换过程以及处理方法。
操作系统中
一个进程通常有三种状态
- 就绪状态(Ready):表示进程已经具备运行所需要的一切条件,只需要等待CPU的分配就可以运行。进程处于就绪状态时,通常会被添加到就绪队列,等待调度器分配CPU资源。
- 运行状态(Running):表示进程正在被CPU执行。处于运行状态的进程正在使用CPU进行计算或其他操作。
- 阻塞状态(Blocked):表示进程因为某些原因暂时无法继续执行,需要等待一些特定条件的解除之后才能继续运行。例如,当进程等待I/O操作完成或者等待某个资源可用时,会转入阻塞状态。进程在阻塞状态时,通常会被移动到阻塞队列中,等待条件的满足。
我们下面将对运行,阻塞,和阻塞挂起进行介绍~

运行状态
进程只要在运行队列中,就叫做 运行态。
阻塞状态
关于进程:
① 一个进程使用资源的时候,可不仅仅是在申请 CPU 资源
② 进程可能会申请其它资源:磁盘、网卡、显卡,显示器资源……如果我们申请 CPU 资源无法暂时无法得到满足,这就需要排队的 "运行队列" 。那么如果我们申请其他慢设备的资源呢?是需要排队的(task_struct 在进程排队)。
当访问某些资源(磁盘,网卡等),如果该资源暂时没有准备好,或者正在给其他进程提供服务,那么此时:
① 当前进程要从 runqueue 中逐出。
② 将当前进程放入对应设备的描述结构体中的waitqueue 。
进程状态:看PCB在哪个队列
内存不足了,操作系统就会把 该进程的代码和数据置换到磁盘上,进行 进程挂起。
进程状态转换
进程状态的转换可以通过以下示例说明:
#include <stdio.h>
#include <unistd.h>int main() {while (1) {printf("进程[%d]正在运行...\n", getpid());sleep(1); // 模拟阻塞状态}return 0;
}
通过运行上述代码并观察进程状态,可以理解进程在不同状态之间的转换过程。
三种状态的图示如下:

Linux系统中
进程状态用整数表示,这些整数存储在进程的task_struct结构体中。常见的进程状态包括:运行(R)、睡眠(S)、磁盘睡眠(D)、停止(T)、死亡(X)、僵尸(Z)和孤儿进程。
进程状态一览
| 状态代码 | 状态名称 | 描述 |
|---|---|---|
| R | 运行(Running) | 进程正在运行或在运行队列中等待 |
| S | 睡眠(Sleeping) | 进程在等待某事件完成,可被信号唤醒 |
| D | 磁盘睡眠(Disk Sleep) | 进程在等待I/O操作完成,不可被信号唤醒 |
| T | 停止(Stopped) | 进程被暂停,可通过信号恢复 |
| X | 死亡(Dead) | 进程已终止,从进程列表中移除 |
| Z | 僵尸(Zombie) | 进程已退出,父进程尚未读取其状态 |
| 孤儿(Orphan) | 父进程已退出,被init进程收养 |
查看进程状态
使用ps aux或ps axj命令可以查看系统中进程的状态。例如:
ps aux
ps axj
这些命令输出的状态字段展示了进程当前的状态。

背后的原因让人暖心,cpu太快了,print显示器等待的时间在他看来就是在sleep了

深度睡眠状态

这个D状态我们就不模拟了……可能会把我的机子磁盘打满(害怕.dog)
T 暂停状态
比如看视频,听音乐,下载,都会有暂停。当你点击暂停的时候下载对应的代码就不跑了,此时这个进程你就可以认为是暂停状态。
再比如说我们调试程序,让程序打断点之后让程序运行起来,程序在打断点处停住的时候是将进程暂停了,所以你在gdb 调试或在 VS 下调试时你会发现程序会停下来,这就是暂停。
是进程挂起的一种。
我们可以先来看一下kill

接下来可以来尝试一下;
$ kill -19 4026,就会发现

gdb下的暂停状态,测试一下
$ gdb process # 进入gdb调试
(gdb) l # 查看代码
(gdb) b 9 # 打断点
q + 回车 # 退出

Z 僵尸状态
僵尸状态:当一个 Linux 中的进程退出的时候,一般不会直接进入 X 状态(死亡,资源可以立马被回收),而是进入 Z 状态。
为什么呢~
进程为 Z 状态,就是为了维护退出信息,可以让父进程或者 OS 读取记录的,退出信息会写入 test_struct。
以下是创建僵尸进程的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t id = fork();if (id < 0) {perror("fork");return 1;} else if (id == 0) { // 子进程printf("子进程[%d]开始运行...\n", getpid());sleep(5);printf("子进程[%d]退出...\n", getpid());exit(0);} else { // 父进程printf("父进程[%d]正在睡眠...\n", getpid());sleep(30); // 父进程延迟回收子进程}return 0;
}
我们可以写一个监控脚本来看一下~
while :; do ps axj | head -1 && ps axj | grep mytest | grep -v grep; sleep 1; echo "######" ; done

在另一个终端中运行ps命令可以看到子进程进入僵尸状态。

僵尸进程虽然不再运行,但它们仍然占用系统资源(如进程控制块task_struct)。如果父进程不及时回收子进程,会导致系统资源浪费,甚至内存泄漏。
可以通过以下方式:
- 父进程及时调用
wait()或waitpid()回收子进程。- 使用信号处理机制,在子进程退出时通知父进程进行回收。
孤儿状态
孤儿进程:父亲没了(bushi
即:父进程先退出了,子的父就变成1 号进程了,相当于被os领养了
测试一下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main(void) {pid_t id = fork();if (id == 0) {// childint cnt = 5;while (1) { // 死循环,孩子进程就不退了printf("我是子进程,我还剩下 %ds\n", cnt--);sleep(1);}printf("我是子进程,我已经变僵尸了,等待被检测\n");exit(0);}else {// fatherint cnt = 3;while (cnt) {printf("我是父进程,我: %d\n", cnt--);sleep(1);}exit(0);}
}
监控一下:
while :; do ps axj | head -1 && ps axj | grep mytest | grep -v grep; sleep 1;echo "######";done

我们可以top看一下1究竟是什么
❓ 疑问:父进程退出,为什么父进程没有变成僵尸?我们怎么没有看到父进程 为Z ?
- 那是因为父进程的父进程是bash ,它会自动回收它的子进程,也就是这里的父进程。这里之所以没有看到父进程变成僵尸,是因为被 bash 回收了, z->x 的状态很快,所以你没看到。
- 那为什么刚才我自己代码中的父进程创建的子进程,父进程没有回收子进程呢?那是因为你的代码压根就没有写回收,所以你的子进程就没有回收。
那我们怎么暂停呢,ctrl+c 只能干掉前台进程,
所以孤儿进程就要用到我们的杀进程:kill -9来暂停啦

文章手稿


相关文章:
【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态
目录 操作系统中 运行状态 阻塞状态 进程状态转换 Linux系统中 查看进程状态 深度睡眠状态 T 暂停状态 Z 僵尸状态 孤儿状态 文章手稿 xmind: 引言 介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换…...
MySQL添加外键约束经典案例
1DDL建表语句 需要一个emp员工表和一个dept部门表 CREATE TABLE emp (id int NOT NULL AUTO_INCREMENT,name varchar(50) COLLATE utf8mb4_0900_as_ci NOT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,job varchar(20) COLLATE utf8mb4_0900_as_ci DEFAULT NULL CO…...
vue3监听器watch以及watchEffect的使用
一,watch()简介: 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数 watch()默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。 watch()一共有三个参数 第一个参数:侦听器的源,可以为以…...
modelsim做后仿真的一点思路
这是以TD_5.6.3_Release_88061生成的网表文件(其他工具生成的网表文件类似),与modelsim联合进行门级仿真的样例,时序仿真与门级仿真的方法类似,只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…...
如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区
如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表,或者所有分区表的所有分区,以便执行进一步的操作,比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…...
如何在 qmake(QtCreator)中指定 Mac 平台
在 Qt 项目文件(.pro 文件)中设置针对 Mac OS 的配置项。通常情况下,我们可以使用如下方式为 Windows 和 Unix 系统分别添加源文件: win32 {SOURCES += hellowin.cpp } unix {SOURCES += hellounix.cpp }虽然 Mac OS 是类 Unix 系统,但有时我们仍然需要区分它和 Linux 系…...
day39动态规划part02| 62.不同路径 63. 不同路径 II 343. 整数拆分 (可跳过)96..不同的二叉搜索树 (可跳过)
**62.不同路径 ** 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 题目讲解 | 视频讲解 class Solution { public:int uniquePaths(int m, int n) {// 确定数组及其下标的含义int dp[101][101] {0}; //到达i,j的点有多少条路径// 确定递推…...
声场合成新方法:基于声波传播的框架
声场合成是指在房间内的麦克风阵列上,根据来自房间内其他位置的声源信号,合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务,因为它是一种成本效益高的方法,用于数据生成以替代真实的数据收集,后…...
鸿蒙文件操作事前准备
13900001,沙箱13900002 首选授权 module授权配置 "requestPermissions": [{ "name": "ohos.permission.CAMERA",}, { "name": "ohos.permission.READ_MEDIA",}, { "name": "ohos.permission.WR…...
AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?
文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化:ChatGPT在金融策略与算法交易中的实践》亮点内…...
C#面:C#属性能在接口中声明吗?
在C#中,接口是一种定义了一组方法、属性和事件的类型。在接口中,只能声明方法、属性和事件的签名,而不能包含字段、构造函数或实现代码。因此,C#属性不能直接在接口中声明。 然而,你可以在接口中定义属性的签名&#…...
区块链的历史和发展:从比特币到以太坊
想象一下,你住在一个小镇上,每个人都有一个大账本,记录着所有的交易。这个账本很神奇,每当有人买卖东西,大家都会在自己的账本上记一笔,确保每个人的账本都是一致的。这就是区块链的基本思想。而区块链的故…...
input()函数——输入
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入,将所有的输入按照字符串进行处理,并返回一个字符串,input()函数的…...
CST 时间格式减去八小时
问题: 查看服务器时间是正确的,但输出出来的时间,比此时多出来八个小时。这里直接把时间减去八个小时。 public static void main(String[] args) throws ParseException {// 设定原始时间格式try {SimpleDateFormat dateFormat new SimpleDateFormat(&…...
植物大战僵尸杂交版技巧大全(附下载攻略)
《植物大战僵尸杂交版》为策略游戏爱好者带来了全新的挑战和乐趣。如果你是新手玩家,可能会对游戏中的植物和僵尸感到困惑。以下是一些实用的技巧,帮助你快速掌握游戏并享受其中的乐趣。 技巧一:熟悉基本玩法 游戏的基本玩法与原版相似&…...
HTTPS 代理的优点和缺点是什么?
HTTPS代理的优点包括提供更好的安全性、支持验证、速度、匿名性、节省带宽。 安全性:HTTPS代理通过使用SSL/TLS协议对传输的数据进行加密,保护用户的数据传输安全,防止中间人攻击和窃听,确保数据的安全性。 速度:HTTPS…...
Mac安装多版本node
Mac下使用n模块去安装多个指定版本的Node.js,并使用命令随时切换。 node中的n模块是,node专门用来管理node版本的模块,可以进行node版本的切换,下载,安装。 1.安装n npm install -g n 2.查看版本 n --version 3.展…...
HTML静态网页成品作业(HTML+CSS)——动漫猪猪侠网页(4个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…...
【机器学习300问】125、什么是双向循环神经网络(BRNN)?什么是深度循环神经网络(DRNN)?
一、双向循环神经网络 (1)诞生背景 双向循环神经网络(Bidirectional Recurrenct Neural Network, BRNN)是在深度学习领域发展起来的一种特殊类型的循环神经网络(RNN),它诞生的背景是为了解决传…...
办公软件汇总
1、OCR 1.1 pearOCR pearOCR 是一个免费的免费在线文字提取OCR工具网站。PearOCR界面简洁,所有过程均在网页端完成,无需下载任何软件,点开即用。官方地址:https://pearocr.com/ 参考:9款文字识别(OCR)工具…...
【LE Audio】PACS精讲[2]: 服务层核心逻辑,玩转音频能力发布与交互
在上一篇的内容里【LE Audio】PACS精讲[1]: 吃透基础规则,解锁音频能力发布核心逻辑,我们吃透了PACS的基础规则,从一致性要求、协议兼容、GATT交互约定到术语体系,搭建起了PACS的知识地基。而PACS的服务层,正是这些基础规则落地的核心载体,是蓝牙音频设备作为服务器对外发…...
OpenClaw+GLM-4.7-Flash简报系统:自动生成每日行业动态摘要
OpenClawGLM-4.7-Flash简报系统:自动生成每日行业动态摘要 1. 为什么需要自动化简报系统 作为一名长期跟踪AI行业动态的技术博主,我每天需要花费大量时间浏览数十个技术博客、新闻网站和RSS订阅源。最痛苦的不是阅读本身,而是如何在信息洪流…...
ncmdumpGUI+解决网易云音乐NCM文件跨设备播放痛点
ncmdumpGUI解决网易云音乐NCM文件跨设备播放痛点 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 问题场景:被加密的音乐自由 想象这样的场景&…...
基于SSM + Vue的二手物品交易网站系统(角色:用户、管理员)
文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…...
Python 3.14 JIT编译器实测对比:启动耗时降63%、内存开销压减41%,你的服务还在用默认配置?
第一章:Python 3.14 JIT编译器实测性能跃迁全景Python 3.14 引入的实验性 JIT 编译器(基于 Pyjion 与 CPython 运行时深度集成)首次在标准发行版中启用可配置的即时编译通道,显著改变了传统解释执行的性能边界。我们通过统一基准套…...
STM32F103 SPI+DMA驱动WS2812B的时序实现原理
1. WS2812B_STM32_Libmaple 库深度解析:基于 SPI DMA 的高性能 NeoPixel 驱动实现WS2812B(常被称作 NeoPixel)是当前嵌入式系统中最主流的单线协议可寻址 RGB LED。其核心挑战在于严格的时序要求:T0H(逻辑 0 的高电平时…...
化学信息学避坑指南:RDKit分子数据解析的7个常见错误与解决方案
RDKit分子数据处理实战:7个高频错误排查与性能优化指南 在药物研发和材料科学领域,RDKit作为化学信息学的瑞士军刀,每天处理着数以百万计的分子结构数据。但当你在凌晨三点调试代码时,一个不起眼的PDB文件编码错误可能让整个分析流…...
CentOS7系统维护终止后YUM源失效的解决方案
1. CentOS7维护终止带来的YUM源危机 去年夏天我给客户部署的CentOS7服务器突然无法安装新软件,屏幕上不断弹出"无法解析主机"的错误。这才意识到官方已经停止维护,默认的YUM源就像突然关门的超市,所有货架都空了。对于仍在使用Cent…...
【Unity3D】从零打造动态天空盒:Cubemap生成与实时环境映射实战
1. 动态天空盒的核心原理与场景价值 第一次在Unity里看到动态天空盒效果时,我盯着屏幕愣了三秒——云层在头顶流动,夕阳的光影实时投射在建筑表面,整个场景瞬间有了生命力。这种魔法般的体验,其实都建立在立方体贴图(C…...
告别指标混乱:衡石科技指标管理平台的AI自治之路
指标混乱的根源在数字化时代,企业决策依赖的指标体系正面临前所未有的混乱:63%的企业存在指标定义不统一问题,58%的团队因数据口径差异导致决策冲突。这种"指标地狱"不仅消耗大量人力进行数据对齐,更直接导致战略执行偏移。某制造企业的案例极具代表性:其生产部门与财…...


