【Linux系统编程】僵尸进程与孤儿进程

news2024/11/22 12:12:13

文章目录

  • 1. 僵尸进程
  • 2. 僵尸进程的危害
  • 3. 孤儿进程

1. 僵尸进程

上一篇文章进程的状态中最后我们提出了僵尸状态:

为了方便子进程退出后父进程或操作系统获取该进程的退出结果,Linux进程退出时,进程一般不会立即死亡,而是要维持一个Z状态即——僵尸状态。

那处在僵尸状态的进程即僵尸进程,那首先我们就要来重点理解一下僵尸进程

那我们来给大家讲一个故事:

假如你呢是一名非常自律上进的大学生,每天早晨都有到外面跑步的好习惯。
今天早上呢你正在跑步的时候,忽然后面来了一个程序员,也在跑步,但他跑的非常快,边跑边掉头发,很快就超过你跑到前面去了,你依然在后面慢慢的跑着。
突然,这个程序员跑到在你前面100M左右的地方,口吐白沫,一阵抽搐,就倒下了。
后面不远处的你看到了这个情况,非常慌张,赶紧打了120并报了警。
然后警察很快就到了,到了之后发现这个人已经不行了。
然后请问大家警察会怎么做?
会不会直接把这个人弄走,通知它的家属,然后销毁现场。
那正常情况呢应该是不会这样的。
警察应该会封锁现场,然后刚好120的人过来了,警察说,你帮我们确认了,这个人是不是已经不行了,120的医务人员说确实不行了。
然后呢警察可能会通知法医来确认这个人的死因,是自己死亡,还是被谋杀了啥的,然后进行一些相关的调查啥的。
假设最后发现这个人是自己发病死亡了,那然后警察就通知家属,让它们把人带走,然后就可以撤离现场了。

那上述的故事中:

警察发现这个人死亡后应不应该立即把这个人弄走,然后销毁现场。
不应该,而是要维护好现场,便于调查它的死因啥的…
那其实这就对应了我们上面提到的一个进程退出后不会立即死亡,而是维持一个僵尸状态,便于父进程或者操作系统获取该进程的退出结果。

那么简单总结一下:

僵尸状态(Zombies)是一种比较特殊的状态。当进程退出并且其父进程没有读取到该进程退出的返回代码时就会产生僵死(尸)进程。
僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,但父进程还在运行,且父进程没有读取子进程退出的返回代码,子进程就会进入僵尸状态。

那我们写个代码给大家演示一下:

在这里插入图片描述
代码就不解释了,都是之前讲过的内容
我们运行一下
在这里插入图片描述
那我们用ps命令查看一下进程
在这里插入图片描述
我们看到现在父子进程两个的状态都是S。
那按我们上面讲的,子进程退出,父进程还在运行,且没有回收子进程获取返回码(我们现在也不会),那么子进程就会进入僵尸状态
🆗,那我们现在干掉子进程
在这里插入图片描述
然后我们再来查看
在这里插入图片描述
子进程就变成了僵尸进程

2. 僵尸进程的危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?
是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?
是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存泄漏?
是的!因为数据结构对象本身就要占用内存,如果一直不释放那就内存泄漏了。
如何避免?后面讲

等这个进程真正被回收了,它的状态才会变成X死亡状态,此时该进程的所有资源才会被释放。

至此,值得关注的进程状态全部讲解完成,下面来认识另一种进程:

3. 孤儿进程

首先,我们给出孤儿进程的概念:

孤儿进程指的是在其父进程执行完成退出或被终止后仍继续运行的一类进程。

即如果父进程先退出,子进程继续还在运行,那么该子进程就被称为孤儿进程。

那下面我们还是写写代码来帮助大家理解:

这里我们写这样一个程序
在这里插入图片描述
子进程循环打印运行,父进程打印10次退出
写个Makefile
在这里插入图片描述
然后这里给大家解释一下这两个之前没见过的符号:
$@就代表:左边的目标文件;
$^代表:右边的所有的依赖文件

所以后续如果我们开发的时候,这个依赖文件列表里面有多个文件,我们不用一个个都列在后面,直接用这个符合就行了。

那下面我们就运行这个程序并观察一下对应的现象:

那这里呢我们要用到一条shell语句
while :; do ps axj | head -1&&ps axj | grep mytest|grep -v grep; sleep 1;echo "--------"; done
大家看不懂没关系,它的作用其实就是每个1秒去显示一下对应搜索的进程信息,并打印了一个“----------”的分割线
在这里插入图片描述
那现在我们把程序跑起来
在这里插入图片描述
那我们发现呢?
运行一段时间之后,父进程就结束退出了,后面就只剩子进程在运行了。

但是呢?这里有些问题值得我们去思考和探索:

首先第一个问题:父进程也是一个进程啊,那按照我们前面学的内容,一个进程退出时,并不会立即变为X死亡状态,而是要维持一个僵尸状态,但是这里这个父进程退出之后为啥我们没有看到Z状态呢?它直接就没了?

🆗,那大家想一下僵尸状态存在的意义是啥?
其实我们前面已经说了,是为了方便子进程退出后父进程或操作系统获取该进程的退出结果。
所以如果子进程一直没有被回收的话,那么它就会一直处在僵尸进程,那它就会一直占据资源,进而导致内存泄漏,这都是我们前面讲过的。
那这里为什么没有看到父进程处于僵尸状态,是不是因为它退出后就被回收了呢?
🆗,是的!
大家说这里的这个父进程它的父进程是谁啊?
是不是bash啊,这也是我们前面讲过的内容——命令行启动的所有程序,最后变成进程其对应的父进程都是bash。
所以,我们这里之所以没有看到父进程处于僵尸状态,就是它的父进程bash把它直接回收了

然后第二个问题我们发现

在这里插入图片描述
原来这个子进程的父进程的PID是2618,但是它的父进程退出后,它的父进程的PID变成了1,它被一个新的爹领养了
那这里我们得出一个结论:
如果一个进程的父进程退出了,而这个进程自己还在运行,那么它将会被1号进程(init进程)自动领养,那么这个被领养的进程即孤儿进程。

那大家想一下为什么?为什么操作系统要领养孤儿进程?

或者大家思考一下如果不领养孤儿进程,会发生什么?
那其实这个问题可以说我们前面已经讲过了。
如果孤儿进程不被领养,那它就没有父进程了嘛,那这样的话未来这个孤儿进程退出的时候谁来回收它,给它收尸呢?
那退出后没有人回收它,它就会一直处于僵尸状态,等待回收而没有人回收,那么就导致内存泄漏。

那再来总结一下:

在操作系统领域中,孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

除此之外,还有一个细节也提一下:

在这里插入图片描述
我们还可以发现,它的父进程退出后,它的状态由S+变成了S,+没了。
那进程状态里面的这个+其实我们前面也提过:
带+的是前台进程,不带的是后台进程。
那他变成后台进程后呢我们CTRL+c就终止不掉它了
在这里插入图片描述
这个我们前面也演示过,而且它在后台运行我们还可以正常执行命令
在这里插入图片描述
但是这样很影响我们的使用。
所以我们可以使用kill命令把它杀掉
在这里插入图片描述
这也是之前讲过的
那这里我们再补充一个方法
killall +进程名称
在这里插入图片描述
就可以杀掉指定名称的进程。

那以上就是关于僵尸进程和孤儿进程的相关内容…
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring底层原理】BeanFactory的实现

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 容器实现 一、BeanFactory实现的特点1.1 Be…

2023年中国半导体IP行业发展概况及趋势分析:半导体IP的市场空间广阔[图]

半导体指IP指芯片设计中预先没计、验证好的功能模块,处于半导体产业链最上游,为芯片设计厂商提供设计模块。半导体IP按交付方式可分为软核、硬核和固核;按产品类型可分为处理器IP、接口IP、其他物理IP及其他数字IP。 半导体IP分类 资料来源&…

K-Means(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

ubuntu 18.04 LTS安装opencv 3.4.16 + opencv_contrib 3.4.16

1.下载 opencv 3.4.16 opencv_contrib 3.4.16 其中,opencv_contrib解压后的多个文件夹复制到opencv内、合并 2.安装 参考博文: https://zhuanlan.zhihu.com/p/650792342 https://zhuanlan.zhihu.com/p/87197806 其中 (1)cmake前…

【设计模式】五、原型模式

文章目录 概述示例传统的方式的优缺点原型模式原理结构图-uml 类图 原型模式解决克隆羊问题的应用实例Sheep类实现clone()运行原型模式在 Spring 框架中源码分析 深入讨论-浅拷贝和深拷贝浅拷贝的介绍 小结 概述 示例 克隆羊问题 现在有一只羊 tom,姓名为: tom, 年…

nginx隐藏版本号和标识

1.隐藏版本号:nginx-服务器banner泄漏风险_banner信息泄露_javachen__的博客-CSDN博客 2.隐藏nginx标识 cd /usr/local/nginx-1.24.0/src/corevi nginx.h在第14行 cd /usr/local/nginx-1.24.0/src/httpvi ngx_http_special_response.c在第22,29,36行 cd /usr/local/nginx-1.2…

踩坑日记 uniapp 底部 tabber遮挡住购物车结算

tabbar 被购物车结算遮挡 在小程序上tabbar没有将固定栏遮挡,如果直接调高,浏览器H5页面是对了,但在小程序上面离底部的定位就太高了 原代码 // 底部结算样式.shop-foot {border-top: 2rpx solid #F7F7F7;background-color: #FFF;position: …

法国心理健康平台【Teale】完成1000万欧元A轮融资

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,位于法国巴黎的心理健康平台【Teale】今日宣布已完成1000万欧元的A轮融资。 本轮融资由Alter Equity和Bpifrance的Digital Venture基金领投,目前的支持者ISAI和Evolem也参与其中。 该公…

ChatGPT的截图识别功能测评:开启图像中的文字与信息的新纪元

文章目录 根据截图,识别菜品根据截图,识别数学公式根据截图生成前端UI代码可视化图像复现案例一案例二 更多可以使用的方向 制作人:川川 辛苦测评,如果对你有帮助支持一下书籍:https://item.jd.com/14049708.html 根据…

spring boot整合常用redis客户端(Jedis、Lettuce、RedisTemplate、Redisson)常见场景解决方案

Java操作redis有三种客户端供选择:Jedis、Lettuce、Redisson。 在实际项目中运用最多的客户端还是Redisson、RedisTemplate;其中RedisTemplate并非是一个新的redis客户端实现,RedisTemplate是Spring Data Redis中提供的封装好的redis操作模板…

闪击笔试题

选择题 ping命令不涉及什么协议? A:DNS B: TCP C: ARP D: ICMP B,ping基于ICMP协议,解析路由会用到ARP和DNS a、b、c三人参加学科竞赛,每个学科按一二三名次给x、y、z分,已知a得22分,b和c得9分&#xf…

进程控制以及相关原语的使用(创建,终止,阻塞,唤醒,切换)

1.基本概念 1.进程控制 进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 进程控制就是要实现进程状态转换。 2.实现进程控制(原语) 1.原语 原语是一种特殊的程序,它的执行具有原子性。也就是…

初阶数据结构(四)带头双向链表

💓博主csdn个人主页:小小unicorn ⏩专栏分类:数据结构 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 带头双向链表 链表的相关介绍初始化链表销毁链…

一文带你搞懂Redis持久化

Redis持久化 Redis的数据是存储在内存的,当程序崩溃或者服务器宕机,那么内存里的数据就会丢失。所以避免数据丢失的情况,需要将数据保存到其他的存储设备中。 Redis提供两种方式来持久化,分别是 RDB(Redis Database)&#xff1a…

格拉姆角场GAF将时序数据转换为图像并应用于凯斯西储大学轴承故障诊断(Python代码,CNN模型)

1.运行效果: 格拉姆角场GAF将时序数据转换为图像并应用于凯斯西储大学轴承故障诊断(Python代码)_哔哩哔哩_bilibili 环境库 只要tensorflow版本大于等于2.4.0即可运行 同样的模型应用于东南大学轴承数据集:格拉姆角场GAF将时序…

ios telegram iOS telegram二次开发

二次开发方案 一、方案的确定及要实现的效果 首先,最多的信息获取还是官方文档:https://lw.microstrategy.com/msdz/MobileUpdates/941_iOSU5/docs/mergedProjects/mobile_sdk/mobilesdk.htm 在本项目的一小部分,项目需求也是改来改去…

虚拟机中对已经存在的磁盘扩容

如图所示,将虚拟机中已经存在的磁盘进行扩容: 扩展之后重启虚拟机,然后输入命令:lsblk进行查看虚拟机大小;发现这个盘的大小已经改变,如果想要给某个卷组或者逻辑卷进行扩容的话还需要将这个磁盘进行新建分…

osg实现鼠标框选

目录 1. 需求的提出 2. 具体实现 2.1. 禁止场景跟随鼠标转动 2.2. 矩形框前置绘制 3. 附加说明 3.1. 颜色设置说明 3.2.矩形框显示和隐藏的另一种实现 1. 需求的提出 有时需要在屏幕通过按住键盘上的某个键如Ctrl键且按住鼠标左键,拖出一个矩形,实现框…

MongoDB 2023年度纽约 MongoDB 年度大会话题 -- 企业级从传统数据库到NOSQL,你会更好...

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群&…

Android学习之路(17) Android Adapter详解

Adapter基础讲解 本节引言 从本节开始我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用这个Adapter很重要, Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,提供 给用户看…