Linux系列-僵尸状态

🌈个人主页:羽晨同学

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

进程退出

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

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

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

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

cpp 复制代码
getpid() --> return curr->pid;

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

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

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

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

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

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

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

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

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

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

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

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

cpp 复制代码
17228 17229 17228 15449 pts/2    17228 Z+    1000   0:00 [myprocess] <defunct>

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

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

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

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

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

cpp 复制代码
15501 20317 20317 15449 pts/2    20317 S+    1000   0:00 ./myprocess

这个是删除前的。

cpp 复制代码
20317 20318 20317 15449 pts/2    20317 Z+    1000   0:00 [myprocess] <defunct>

这个是删除之后的。

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

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

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

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

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

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

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

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

相关推荐
ICscholar5 小时前
ExaDigiT/RAPS
linux·服务器·ubuntu·系统架构·运维开发
sim20205 小时前
systemctl isolate graphical.target命令不能随便敲
linux·mysql
薛定谔的猫19825 小时前
RAG(二)基于 LangChain+FAISS + 通义千问搭建轻量级 RAG 检索增强生成系统
运维·服务器·langchain
米高梅狮子6 小时前
4. Linux 进程调度管理
linux·运维·服务器
再创世纪6 小时前
让USB打印机变网络打印机,秀才USB打印服务器
linux·运维·网络
fengyehongWorld7 小时前
Linux ssh端口转发
linux·ssh
昨夜见军贴06168 小时前
IACheck AI审核如何实现自动化来料证书报告审核,全面提升生产效率与合规水平
运维·人工智能·自动化
知识分享小能手9 小时前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的Shell编程详细知识点(含案例代码)(17)
linux·学习·ubuntu
浩子智控9 小时前
电子产品设计企业知识管理
运维·服务器·eclipse·系统安全·硬件工程
以太浮标9 小时前
华为eNSP模拟器综合实验之-BGP路由协议的配置解析
服务器·开发语言·php