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

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.kler.cn/a/408411.html

相关文章:

  • 《C++智能合约与区块链底层交互全解析:构建坚实的去中心化应用桥梁》
  • 第三十九篇 ShuffleNet V1、V2模型解析
  • <硬件有关> 内存攒机认知入门,内存的选择 配置 laptop PC 服务器
  • 虚幻引擎---术语篇
  • [RabbitMQ] 重试机制+TTL+死信队列
  • Spring |(四)IoC/DI配置管理第三方bean
  • Java基于SpringBoot+Vue的藏区特产销售平台
  • 【创建型设计模式】单例模式
  • flink学习(1)——standalone模式的安装
  • GMAN解读(论文+代码)
  • 【面向对象】Java处理异常的方式
  • STM32抢占优先级不生效
  • 对于相对速度的重新理解 - 插一句
  • MySQL原理简介—10.SQL语句和执行计划
  • 编程中的字节序问题
  • 海信Java后端开发面试题及参考答案
  • 基于python的长津湖评论数据分析与可视化,使用是svm情感分析建模
  • docker 配置代理
  • 如何在 .gitignore 中仅保留特定文件:以忽略文件夹中的所有文件为例
  • hyperf 配置步骤
  • 深入理解CRC:通信可靠性的关键
  • CSS中flex:1是什么属性
  • Milvus实操
  • Adobe Illustrator 2024 安装教程与下载分享
  • docker拉取镜像问题解决
  • 【Linux】gcc/g++使用