进程状态(三)----- 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. 孤儿进程 前言 继上一篇文章 进程状态(二)----- linux 中具体的进程状态(上) 介绍了 linux 系统中具体的 R、S、D 状态,而这篇文章继续介绍 linux 系统中剩下的三种…...
关系型数据库(RDBMS,Relational Database Management System)
关系型数据库(RDBMS,Relational Database Management System)是一种结构化数据存储系统,它使用表(Tables)、行(Rows)和列(Columns)的结构来组织和管理数据。关…...

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

免费【2024】springboot 付费自习室管理系统的设计与实现
博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围: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 …...

注意!!可能这是《网络管理员》旧教程最后一次考试,赶紧学起来
网络管理员是软考初级资格热门科目之一。近日在国家版本数据中心,小编查到网络管理员官方教程已经有2024最新版出来了,现在这一版教程说实话有些内容已经过时了,尤其新版教材也已经出现,小编推测明年大概率依据新版考试大纲出题&a…...
array postgre gsql 剔除
进行某种过滤或比较操作,判断不匹配的,数组 array 中列出的所有字符串 and a.Repunittree not like all (array[‘%0001003549950003%’,‘%000100460041%’,‘%000100460047%’,‘%000105880001%’ ,‘%000100020007%’,‘%000105830009%’,‘%0001058…...

【Matlab】零阶保持法:连续状态空间方程(含噪声,非线性)离散化处理方法
常用的离散化方法:零阶保持器(zero-order hold,ZOH)、欧拉法(Euler)、一阶保持器(First-order hold,FOH)。最常用的是前两种。 0.零阶保持器(ZOH)…...
web自动化6-pytest⑦一些基本情况
命名规则 1)import pytest 测试文件名要以test_ 开头或 _test结尾 2)类名需要以Test开头(T),不能带有init方法 3)函数名以test_开头(t) 符合规则框架才能找到用例,一条用例代表一条函…...

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 的公网镜像中心,用户可以将自己的镜像 push 到公网镜像中心中自己的镜像仓库,并可将仓库设置为私有库,使他人无法看到,更无法 pull,以保证镜像的安全性。不过&#x…...
PostgreSQL 15 使用物理复制槽 实现主从
一、系统环境 IP操作系统用途192.168.140.153CentOS 7.9.2009pg-主节点192.168.140.159CentOS 7.9.2009pg-从节点 二、单节点安装 2.1 主节点安装 参考前一篇文章 2.2 从节点安装 只需要先将rpm包安装即可,无需初始化数据库,无需启动服务。 三、主从…...

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

技术分享| 前端性能优化——虚拟滚动(Virtual Scroll)
前端遇到大量数据(尤其是大数据表)的DOM 渲染时,通常会卡顿,需要考虑优化性能问题,这里针对DOM 渲染引出“虚拟滚动”方案, 详细请在以下各文章中详细了解: vue插件 vue-virtual-scroll-list解决…...

Flink 实时数仓(四)【DWD 层搭建(二)流量域事实表】
前言 昨天刚搬到新校区,新校区小的可怜,好在之后出去实习交通可以方便点;待在学院太受限了,早点离开! 今天开始完成 DWD 层剩余的需求,上一节我们把日志数据根据不同类型分流写入到了不同的主题;…...
Go 1.19.4 接口-Day 10
1. 接口 1.1 基本介绍 接口中到底应该定义些什么? 在Go语言中,接口是声明函数的集合,但只有函数签名,没有具体的功能。 属于是面向对象中,行为的约束,面向对象中的类有自己的属性(可以当成数据…...

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

使用snap安装docker配置阿里云镜像加速
使用snap安装docker非常的简单,一条命令即可 snap install docker 但是通过这个命令安装的docker, 配置阿里云镜像跟常规安装的配置起来不太一样, 下面讲一下配置流程 修改docker配置文件/var/snap/docker/current/config/daemon.json 这个文件应该是已经创建好…...
安全编程的代码示例
一、python代码示例 一个安全编程的示例是对输入进行严格的验证和过滤。比如,当用户在网页上输入用户名和密码时,应该对这些输入进行验证,防止恶意用户输入恶意代码或进行 SQL 注入等攻击。下面是一个简单的示例代码: import…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...