Linux系列-僵尸状态

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

进程退出

进程退出之后,代码就不会执行了,而是由PCB维护起来,我们可以通过PCB来查看退出信息。 

进程退出时首先可以立即释放的就是进程对应的程序信息数据。

进程退出,要有退出信息,也就是进程的退出码,保存在自己的task_struct内部。task_struct这个结构体里面包含的是成员属性,要有退出信息(int,code,其它)。

这个可以管理进程的结构(task_struct)必须被OS维护起来,方便用户未来进行获取进程退出的信息。就像下面的这个示例一样。

getpid() --> return curr->pid;

emmm,其实这个进程退出像什么呢?就像是自己从学校毕业,虽然自己人不在了,但是个人的信息还是在学校里面的。

这个个人信息就是进程的退出信息,在PCB里面。

所以,这个时候我们想一下进程的创建的过程,是先有代码和数据,还是先有对应的内核数据结构。

很明显的,是不是得先有对应的内核数据结构,当管理信息建立好的时候,才能放进去对应的代码和数据,就像是,你去上学,学校里面肯定是先有你的信息的,然后你的人再去那里。

对吧,那么在没有传入代码和数据的时候,进程是已经创建好的,但是啊,它不可以调度。

是不是很明显,其实这个时候你也就没什么可以调度的。

这个时候如果我们要给这个状态一个概念,就叫做僵尸状态

操作系统释放进程,先释放代码和数据,把task_struct维护起来,这个时候就叫做僵尸状态。

所以说,task_struct是最早产生,但是是最后删除的。

那么,如果我想要看到僵尸状态,我应该怎么设计测试用例呢?

我们创建出子进程,这个时候父子同时存在,然后我们让子进程退出,父进程还存活,但是父进程什么都不做(尽管我们也不知道它可以做什么)。

这个时候的子进程就会出现短暂的僵尸状态。

17228 17229 17228 15449 pts/2    17228 Z+    1000   0:00 [myprocess] <defunct>

 这个时候,这个进程就从S变成了Z,就是变成了僵尸状态。

所以,Z是进程的僵尸状态,这个状态是为了维护自己的task_struct。方便未来父进程读取子进程的退出状态。

这个时候我们使用kill命令来删除子进程,删除了子进程之后父进程是不会对子进程进行回收的。

所以这个时候子进程是无效的,失效的。

接下来,我们举一个删除前后子进程状态的对比。

15501 20317 20317 15449 pts/2    20317 S+    1000   0:00 ./myprocess

这个是删除前的。

20317 20318 20317 15449 pts/2    20317 Z+    1000   0:00 [myprocess] <defunct>

这个是删除之后的。

在这个时候,如果没有人处理这个子进程,那么这个子进程就会一直处于僵尸状态,这个子进程的task_struct就会一直存在,从而一直消耗内存,这就造成了内存泄漏

一般父进程是需要读取子进程信息的,一旦读取完了之后,子进程才会自动退出。

而一旦回收之后,这个进程也就没了。

我们是无法杀掉一个在概念上已经死掉的进程的,所以这个时候必须要父进程来进行回收。

malloc开辟的是属于数据的,当关闭这个进程的时候,数据会直接进行删除。若是有一个不退出的进程,常驻内存的进程,若是这个时候不断的malloc,那么会导致资源越来越少。

所以,其实对于语言层面的内存泄漏问题,若是对于那种会自动退出的程序而言,问题是不算太大的,若是发生在常驻内存的进程当中,这个时候问题会比较大。

而我们写的大部分软件都是常驻内存的。

好了,本次的文章就到这里了,我们下次再见。 

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

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

相关文章

DBeaver中PostgreSQL数据库显示不全的解决方法

本文介绍在DBeaver中&#xff0c;连接PostgreSQL后&#xff0c;数据库显示不全的解决方法。 最近&#xff0c;在DBeaver中连接了本地的PostgreSQL数据库。但是连接后打开这个数据库时发现&#xff0c;其所显示的Databases不全。如下图所示&#xff0c;Databases只显示了一个pos…

pycharm中配置pyqt5

pycharm中配置pyqt5 Python提供了多种图形界面库&#xff0c;包括但不限于Tkinter、PyQt、wxPython、Kivy等。Tkinter由于其轻量级和跨平台特性&#xff0c;通常作为入门首选。PyQt和wxPython则提供了更多的控件和更强大的功能&#xff0c;适合于需要复杂用户界面的应用程序。…

SpringBoot+Vue 2 多方法实现(图片/视频/报表)文件上传下载,示例超详细 !

目录 一、主流方法介绍 1. Base 64 2. 二进制流传输 3. multipart/form-data 4. FTP/SFTP 5. 云存储服务API 二、multipart/form-data 方式上传单个文件 1、前端部分 2、后端部分 三、multipart/form-data 方式上传多个文件 1、前端部分 2、后端部分 四、Base 64 方…

数据库迁移--laravel进阶篇

本地开发中的数据库和线上发布的数据库是不一样的,每进行一个线上版本的更新,很可能也涉及大量数据库的改动,那么这些数据库的改动在laravel中可以使用数据库迁移来处理。 比如我想创建一张flights数据表 执行php artisan make:migration create_flights_table命令就能自动生…

uni-app 修改复选框checkbox选中后背景和字体颜色

编写css&#xff08;注意&#xff1a;这个样式必须写在App.vue里&#xff09; /* 复选框 */ /* 复选框-圆角 */ checkbox.checkbox-round .wx-checkbox-input, checkbox.checkbox-round .uni-checkbox-input {border-radius: 100rpx; } /* 复选框-背景颜色 */ checkbox.checkb…

java实现ModbusCRC16校验

1. 目的 电流数据采集器是RS485 Modbus协议&#xff0c;想通过java实现串口数据的采集&#xff0c;因为涉及到串口通信的CRC校验&#xff0c;所以需要通过java来实现对采集的电流值进行校验&#xff0c;确保每次读到的电流值都是正常的。 2. 什么是ModbusCRC16校验 Modbus协议…

aws上安装ssm-agent

aws-cloudwatch 连接机器 下载ssm-agent aws-ec2 安装ssm-agent aws-linux安装ssm-agent 使用 SSM 代理查找 AMI 预装 先运行&#xff1a;systemctl status amazon-ssm-agent 查看sshm-agent的状态。 然后安装提示&#xff0c;执行 systemctl start amazon-ssm-agent 启动即…

springboot+vue+SseEmitter数据流推送实战

业务场景 SseEmitter介绍 SseEmitter 是 Spring Boot 中用于实现服务器发送事件&#xff08;Server-Sent Events, SSE&#xff09;的一种机制。SSE 允许服务器向客户端推送实时数据&#xff0c;而不需要客户端频繁地发起请求。这对于实现实时通知、更新等场景非常有用。 Sse…

阿里云 DevOps 资源安全扫描实践

随着企业上云进程的加速&#xff0c;云资源的使用量日益增长&#xff0c;云环境中资源的安全性和稳定性成为了企业业务运营的关键要素 面对多样化的云资源和复杂的应用场景&#xff0c;传统的安全管理手段已无法完全满足企业日益严苛的安全需求。为了确保云上资源的安全性&…

python之sklearn--鸢尾花数据集之数据降维(PCA主成分分析)

python之sklearn–鸢尾花数据集之数据降维(PCA主成分分析) sklearn库&#xff1a;Scikit - learn&#xff08;sklearn&#xff09;是一个用于机器学习的开源 Python 库。它建立在 NumPy、SciPy 和 matplotlib 等其他科学计算库之上&#xff0c;为机器学习的常见任务提供了简单…

sourceInsight常用设置和功能汇总(不断更新)(RGB、高亮、全路径、鼠标、宏、TODO高亮)

文章目录 必开配置设置背景颜色护眼的RGB值&#xff1f;sourceInsight4.0中如何设置选中某个单词以后自动高亮的功能&#xff1f;sourceinsight中输入设置显示全路径&#xff1f; 常用sourceInsight4.0中文乱码怎么解决&#xff0c;注意事项是什么&#xff1f;如何绑定鼠标中键…

oracle ogg学习和ogg常见变更操作

oracle ogg学习和ogg常见变更操作 OGG&#xff08;Oracle GoldenGate&#xff09; OGG 是一种基于日志的结构化数据复制软件&#xff0c;它通过解析源数据库在线日志或归档日志获得数据的增删改变化&#xff08;数据量只有日志的四分之一左右&#xff09; OGG 能够实现大量交…

游戏引擎学习第19天

介绍 这段内容描述了开发者在进行游戏开发时&#xff0c;对于音频同步和平台层的理解和调整的过程。以下是更详细的复述&#xff1a; 开发者表达了他希望今天继续进行的工作内容。他提到&#xff0c;昨天他讲解了一些关于音频的内容&#xff0c;今天他想稍微深入讲解一下他正…

Flink错误:一historyserver无法启动,二存在的文件会报错没有那个文件或目录

一.historyserver无法启动 historyserver执行了启动命令后却没有启动&#xff0c;而且也没有报错&#xff0c;如果日志无法启动的话网页8082是无法访问的 只能去查看日志 去flink的log文件查看日志&#xff1a; 发现应该是缺包了&#xff0c;导入jar包后可以解决 &#xff1a…

归一化/标准化对神经网络的训练是否有影响?

一、背景 归一化&#xff08;Normalization&#xff09;和标准化&#xff08;Standardization&#xff09;是数据预处理中的两种常见技术&#xff0c;旨在调整数据的范围和分布&#xff0c;以提高机器学习模型或者深度学习模型的性能和训练速度。虽然它们的目标相似&#xff0c…

Redis、TongRDS 可视化工具使用之 Redis Insight

题外话&#xff1a;除了可以连接 redis&#xff0c;也可以用来连接 TongRDS 1&#xff09;官网下载 Redis Insight 2&#xff09;安装 3&#xff09;连接 4&#xff09;使用 这里只是给一个使用例子

oracle查看锁阻塞-谁阻塞了谁

一 模拟锁阻塞 #阻塞1 一个会话正在往一个大表写入大量数据的时候&#xff0c;另一个会话加字段&#xff1a; #会话1 #会话2 会话2被阻塞了。 #阻塞2 模拟一个会话update一条记录&#xff0c;没提交。 另一个会话也update这一条记录&#xff1a; 会话2被阻塞了。 二 简单查…

django基于django的民族服饰数据分析系统的设计与实现

摘 要 随着网络科技的发展&#xff0c;利用大数据分析对民族服饰进行管理已势在必行&#xff1b;该平台将帮助企业更好地理解服饰市场的趋势&#xff0c;优化服装款式&#xff0c;提高服装的质量。 本文讲述了基于python语言开发&#xff0c;后台数据库选择MySQL进行数据的存储…

STM32单片机CAN总线汽车线路通断检测-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…

golang对日期格式化

1.对日期格式化为 YYYY-mm-dd, 并且没有数据时&#xff0c;返回空 import ("encoding/json""time" )type DateTime time.Timetype SysRole struct {RoleId int64 gorm:"type:bigint(20);primary_key;auto_increment;角色ID;" json:&quo…