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

进程状态(三)----- linux 中具体的进程状态(下)

目录

  • 前言
  • 1. T && t 状态
  • 2. X 与 Z 状态
  • 3. 孤儿进程

前言

继上一篇文章 进程状态(二)----- linux 中具体的进程状态(上) 介绍了 linux 系统中具体的 R、S、D 状态,而这篇文章继续介绍 linux 系统中剩下的三种状态,T && t 状态,X 与 Z 状态,以及孤儿进程的由来。

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

1. T && t 状态

T 和 t 状态,我们放在一块讲,因为在如今的 linux 系统中,这两个基本已经没有什么区别了。所谓 T 状态,就是 stop,就是让进程停下来。

当我们进程跑起来的时候,我们可以通过如下指令,将进程暂停一下。

[outlier@localhost process2]$ kill -l1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	其中的 19 信号就是将进程暂停,18 信号恢复进程(恢复之后的进程会变为后台进程,需要通过 kill 指令杀掉进程才能够关闭)

在这里插入图片描述

大家会不会有一个疑问就是,一个进程处于暂停状态 和 一个进程处于 sleep 状态,有什么区别吗?在最直观的理解上,这两种进程都是不被 cpu 执行的进程。所以为什么进程要暂停下来呢?它是不是也像 sleep 一样,在等待某种资源的就绪呢?

面对这类问题,我们可以这样去解读,有时候我们就是想要暂停一下这个进程,等待其它事件的发生,而非等待某种资源的就绪,我们可以将其设置为 T 状态,而 T 状态下,进程的代码就完全暂停了,一般而言也不接受其它信号了,并且 T 状态在某种程度上也算是一种阻塞状态。与 sleep 不同的是,sleep 一定是在等待某种资源,但是 stop 状态不一定是在等待资源,也可以是人为控制下的暂停。

那么为什么我们要暂停一个进程呢? ---- gdb 调试的时候,是不是就是 gdb 帮助我们暂停进程的?

在这里插入图片描述

借助 gdb,进程运行到断点处停下来了,此时的进程状态从 sleep 变为了 stop(只不过是 小 t 的暂停状态)。所以凭什么你运行到断点处,你的代码就很乖的停下来了,这一切不都是 gdb 这个调试工具帮你做的吗,而这种场景就是暂停进程的应用场景之一。、

2. X 与 Z 状态

X(dead) 状态,字面意思直接拿捏,它就是死亡状态!一个进程处于死亡状态,是什么含义?不就是这个进程因为各种原因然后停止运行了,而这个状态只是一个返回状态,也无法在任务列表里看到这个状态。

但是进程在进入 dead 状态之前,背后可是存在着一系列的事情,简单说,那就是,进程因为某种原因挂掉了,它并不会马上进入 X 状态,而是先进入 Z 状态,即僵尸状态。

那么背后是怎么一个事呢?讲个故事。

有一天早晨,张三和往日一样进行着晨跑。途中,有一个看起来较为专业的哥们,从张三的身边一闪而过,张三一开始也没多想,还是按照自己的节奏跑着。不久后,张三突然发现前面有个人 “躺平” 了,正好是刚刚一闪而过那哥们。张三哪见过如此场面,直接先后拨打了120,110。等待救护车来临之后,做了急救措施,最终宣判那哥们 dead 了,而此时帽子叔叔也已经赶到。所以既然现在人也已经彻底躺平了,于是救护人员也就离开。此刻,这个哥们已经彻底躺平是事实,但是帽子叔叔并没有宣布其躺平的消息,也没有立刻通知哥们的家属对其进行回收,而是叫了两法医对那哥们进行鉴定(判断是自杀?ta 杀?意外躺平?),毕竟好端端的一个人,突然在大庭广众之下彻底躺平,总得给社会一个交代吧?直到法医鉴定完毕,确定那哥们的躺平原因之后,帽子叔叔才正式通知其家属来认领并回收那哥们。

而在张三看到那哥们躺平开始,一直到法医鉴定躺平原因这段期间内,那哥们就一直需要在那躺平着,此时这个人的状态就称为 僵尸状态!当帽子叔叔那边鉴定完这哥们躺平的原因之后,准备通知家属进入到回收阶段了,那么这个人的状态就称为死亡状态。

所以进程也如此,一个进程退出了,并不是立刻进入 dead 状态,而是操作系统会将该进程的退出信息维持一段时间,以让关心这件事的主体得知该进程退出的原因等信息。所以对一个已经退出的进程,操作系统在维护其退出信息的这段时间内,这个进程的各种资源还没有得到释放的,我们就把这种进程称为 僵尸进程!

而一个进程退出之后,那么最关心这个进程的肯定是他的父进程。假设今天有一对父子进程,子进程退出了,但是它的父进程迟迟没有来 “关心” 它,自顾自的运行着,那么操作系统就必须把子进程的状态一直维持着,直到父进程前来回收子进程。所以再次强调,我们把这种已经死掉的进程,但是又需要有父进程前来回收的这种进程的状态,称为Z 状态,即僵尸状态。 到这里,讲了这么多,那总得见一见僵尸进程吧?

int main()
{pid_t pid = fork();if(pid == 0){// 子进程int cnt = 5;while(cnt){cout << "I am a child process, pid: " << getpid() << ", ppid: " << getppid() << ", cnt: " << cnt << endl;cnt--;sleep(1);}exit(0);}else{// 父进程while(1){cout << "I am a parent process, pid: " << getpid() << ", ppid: " << getppid() << endl;sleep(1);}}
}

在这里插入图片描述

在这次测试中,我们先退出了子进程,而在退出前,父子进程绝大部分时间都处于 sleep 状态,当子进程退出后,由于父进程并没有对子进程进行回收,因此子进程所呈现出来的状态并不是 dead 状态,而是 zombie 僵尸状态。

所以一个进程退出之后,没有及时被其父进程主动回收,这个进程资源就会一直被维持在内存当中,而这种进程既然已经变成 Z 状态了,那么它就一定不会被操作系统调度了,更不会被运行。所以这种问题就会导致 内存泄漏!而为什么在我们关闭我们的 test 进程之后,其创建出来的子进程变为 Z 状态(这现在我可以理解,因为父进程没有主动回收),那为什么其父进程却并没有呈现 Z 状态呢?而是直接退出了,难道是父进程的父进程对其进行了回收吗?

3. 孤儿进程

没错,在运行 test 这个程序之后,bash 这个进程会自动为 test 创建出进程,而 bash 作为 test 的父进程,当 test 这个进程退出时,bash 就有对它进行回收的义务!而事实就是如此,子进程是 test 这个进程创建出来的,但当子进程退出时,由于父进程并没有对其进行关心,因此该子进程的退出信息就要一直被维护下去(退出信息也是数据,保存在 task_sturct 中,也相当于在维护 PCB)。

那相反过来呢?如果是父进程退出了,子进程还在继续运行会是怎么样的现象?父进程提前退出,那子进程退出后变为 Z 状态,那是如何处理的呢?

int main()
{pid_t pid = fork();if(pid == 0){// 子进程int cnt = 500;while(cnt){cout << "I am a child process, pid: " << getpid() << ", ppid: " << getppid() << ", cnt: " << cnt << "\n";cnt--;sleep(1);}exit(0);}else{// 父进程int cnt = 5;while(cnt){cout << "I am a parent process, pid: " << getpid() << ", ppid: " << getppid() << ", cnt: " << cnt << "\n";cnt--;sleep(1);}exit(0);}
}

在这里插入图片描述

当父进程先退出了,留下子进程进行在跑的现象是,父进程退出那一刻,就立马被它的父进程(即 bash 回收了),所以也就检测不到父进程的进程信息了,但是子进程的 ppid 不再是一开始的父进程,而是变为了 1,无脑猜测,这个 pid 为 1的进程,就是我们的操作系统(也即 init 进程)!而我们把上述这种情况,父进程先退出,子进程就称之为“孤儿进程”!

所以现在也就可以回答一开始提出的问题了。父进程先退出,子进程就会被 1号 init 进程领养,所以当子进程退出,变为 Z 状态,自然就是由 1 号进程对其进行回收。而为什么要领养这个孤儿进程?如果不领养孤儿进程,那么当这些进程退出时,没有进程可以为其回收,释放系统资源,当这些进程越来越多,也就代表着系统中被占用的无用资源越来越多!所以必须要对孤儿进程进行领养,然后在其退出时将其资源释放回收。


到这里,linux 中常见的几个进程状态就已经交代完毕了,但是关于进程这个概念远远还没有结束。截止目前,我们知道了进程属性中的标识符(即 pid),知道了进程的状态(R, S, D, T, t, X, Z)。但是进程中还有一个 优先级 的概念,同样是进程中相当重要的组成信息,也会在之后的文章中进行介绍。

如果感觉该篇文章给你带来了收获,可以 点赞👍 + 收藏⭐️ + 关注➕ 支持一下!

感谢各位观看!

相关文章:

进程状态(三)----- linux 中具体的进程状态(下)

目录 前言1. T && t 状态2. X 与 Z 状态3. 孤儿进程 前言 继上一篇文章 进程状态&#xff08;二&#xff09;----- linux 中具体的进程状态&#xff08;上&#xff09; 介绍了 linux 系统中具体的 R、S、D 状态&#xff0c;而这篇文章继续介绍 linux 系统中剩下的三种…...

关系型数据库(RDBMS,Relational Database Management System)

关系型数据库&#xff08;RDBMS&#xff0c;Relational Database Management System&#xff09;是一种结构化数据存储系统&#xff0c;它使用表&#xff08;Tables&#xff09;、行&#xff08;Rows&#xff09;和列&#xff08;Columns&#xff09;的结构来组织和管理数据。关…...

使用RK Docker环境编译RK SDK

文章目录 前言Docker介绍实验环境获取RK Docker镜像加载RK Docker镜像使用RK Docker环境编译SDK其它 前言 作为一名嵌入式Linux的学习者&#xff0c;目前编译各种平台&#xff0c;用的都是同一个编译机&#xff08;Ubuntu虚拟机&#xff09;。之前一直在折腾全志&#xff0c;所…...

免费【2024】springboot 付费自习室管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…...

【学习方法】高效学习因素 ② ( 学习动机 | 内在学习动机 | 外在学习动机 | 外在学习动机的调整方向 | 保护学习兴趣 | 高考竞争分析 )

文章目录 一、高效学习的其它因素 - 学习动机1、学习动机2、内在学习动机3、外在学习动机4、外在学习动机的问题所在5、外在学习动机的调整方向6、保护学习兴趣7、高考竞争分析 上一篇博客 【学习方法】高效学习因素 ① ( 开始学习 | 高效学习因素五大因素 | 高效学习公式 - 学…...

【学习笔记】A2X通信的协议(四)- A2X PC5通信(二)

目录 6.1.2.4 A2X PC5单播链接释放程序 6.1.2.4.1 概述 6.1.2.4.2 发起UE启动A2X PC5单播链接释放程序 6.1.2.4.3 目标UE接受的A2X PC5单播链接释放程序 6.1.2.4.4 发起UE完成的A2X PC5单播链接释放程序 6.1.2.4.5 异常情况 6.1.2.4.5.1 发起UE的异常情况 6.1.2.5 A2X …...

注意!!可能这是《网络管理员》旧教程最后一次考试,赶紧学起来

网络管理员是软考初级资格热门科目之一。近日在国家版本数据中心&#xff0c;小编查到网络管理员官方教程已经有2024最新版出来了&#xff0c;现在这一版教程说实话有些内容已经过时了&#xff0c;尤其新版教材也已经出现&#xff0c;小编推测明年大概率依据新版考试大纲出题&a…...

array postgre gsql 剔除

进行某种过滤或比较操作&#xff0c;判断不匹配的&#xff0c;数组 array 中列出的所有字符串 and a.Repunittree not like all (array[‘%0001003549950003%’,‘%000100460041%’,‘%000100460047%’,‘%000105880001%’ ,‘%000100020007%’,‘%000105830009%’,‘%0001058…...

【Matlab】零阶保持法:连续状态空间方程(含噪声,非线性)离散化处理方法

常用的离散化方法&#xff1a;零阶保持器&#xff08;zero-order hold&#xff0c;ZOH&#xff09;、欧拉法&#xff08;Euler&#xff09;、一阶保持器&#xff08;First-order hold&#xff0c;FOH&#xff09;。最常用的是前两种。 0.零阶保持器&#xff08;ZOH&#xff09…...

web自动化6-pytest⑦一些基本情况

命名规则 1)import pytest 测试文件名要以test_ 开头或 _test结尾 2&#xff09;类名需要以Test开头&#xff08;T&#xff09;&#xff0c;不能带有init方法 3&#xff09;函数名以test_开头&#xff08;t&#xff09; 符合规则框架才能找到用例&#xff0c;一条用例代表一条函…...

apache 漏洞

影响版本 Apache HTTP Server 2.4.49 某些Apache HTTPd 2.4.50也存在此漏洞 环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid 漏洞复现 http://1.15.136.212:8080 1.使⽤poc curl http://1.15.136.212:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd...

简单的docker学习 第11章 镜像中心

第11章 镜像中心 Docker Hub 与阿里云都是 Docker 的公网镜像中心&#xff0c;用户可以将自己的镜像 push 到公网镜像中心中自己的镜像仓库&#xff0c;并可将仓库设置为私有库&#xff0c;使他人无法看到&#xff0c;更无法 pull&#xff0c;以保证镜像的安全性。不过&#x…...

PostgreSQL 15 使用物理复制槽 实现主从

一、系统环境 IP操作系统用途192.168.140.153CentOS 7.9.2009pg-主节点192.168.140.159CentOS 7.9.2009pg-从节点 二、单节点安装 2.1 主节点安装 参考前一篇文章 2.2 从节点安装 只需要先将rpm包安装即可&#xff0c;无需初始化数据库&#xff0c;无需启动服务。 三、主从…...

C# 中引用类型的探讨

引用类型的变量不直接包含其数据&#xff1b;它包含对其数据的引用。 如果按值传递引用类型参数&#xff0c;则可能更改属于所引 用对象的数据&#xff0c;例如类成员的值。 但是&#xff0c;不能更改引用本身的值&#xff1b;例如&#xff0c;不能使用相同引用为新对象分配内存…...

技术分享| 前端性能优化——虚拟滚动(Virtual Scroll)

前端遇到大量数据&#xff08;尤其是大数据表&#xff09;的DOM 渲染时&#xff0c;通常会卡顿&#xff0c;需要考虑优化性能问题&#xff0c;这里针对DOM 渲染引出“虚拟滚动”方案&#xff0c; 详细请在以下各文章中详细了解&#xff1a; vue插件 vue-virtual-scroll-list解决…...

Flink 实时数仓(四)【DWD 层搭建(二)流量域事实表】

前言 昨天刚搬到新校区&#xff0c;新校区小的可怜&#xff0c;好在之后出去实习交通可以方便点&#xff1b;待在学院太受限了&#xff0c;早点离开&#xff01; 今天开始完成 DWD 层剩余的需求&#xff0c;上一节我们把日志数据根据不同类型分流写入到了不同的主题&#xff1b…...

Go 1.19.4 接口-Day 10

1. 接口 1.1 基本介绍 接口中到底应该定义些什么&#xff1f; 在Go语言中&#xff0c;接口是声明函数的集合&#xff0c;但只有函数签名&#xff0c;没有具体的功能。 属于是面向对象中&#xff0c;行为的约束&#xff0c;面向对象中的类有自己的属性&#xff08;可以当成数据…...

智能编程新纪元:腾讯AI代码助手的高效编程体验

智能编程新纪元&#xff1a;腾讯AI代码助手的高效编程体验 智能编程新纪元&#xff1a;腾讯AI代码助手的高效编程体验引言一、配置开发环境二、AI助手实现高效编程2.1 AI助手自动补全2.2 AI助手实现编程思维2.3 AI助手高效注解2.4 AI助手打破语言壁垒 三、帮助和提升四、优化和…...

使用snap安装docker配置阿里云镜像加速

使用snap安装docker非常的简单&#xff0c;一条命令即可 snap install docker 但是通过这个命令安装的docker, 配置阿里云镜像跟常规安装的配置起来不太一样, 下面讲一下配置流程 修改docker配置文件/var/snap/docker/current/config/daemon.json 这个文件应该是已经创建好…...

安全编程的代码示例

一、python代码示例 一个安全编程的示例是对输入进行严格的验证和过滤。比如&#xff0c;当用户在网页上输入用户名和密码时&#xff0c;应该对这些输入进行验证&#xff0c;防止恶意用户输入恶意代码或进行 SQL 注入等攻击。下面是一个简单的示例代码&#xff1a; import…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...

【汇编逆向系列】四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型

一、汇编代码 上一节开始&#xff0c;讲到了很多debug编译独有的汇编方式&#xff0c;为了更好的区分release的编译器优化和debug的区别&#xff0c;从本章节开始将会提供debug和release的汇编用作对比 Debugb编译 single_double_param:00000000000000A0: F2 0F 11 44 24 08…...

【计算机网络】NAT、代理服务器、内网穿透、内网打洞、局域网中交换机

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a;【计算机网络】数据链路层——ARP协议 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、网络地址转…...