Linux基础之僵尸进程与孤儿进程

目录

一、僵尸进程

[1.1 什么是僵尸进程](#1.1 什么是僵尸进程)

[1.2 为什么要有僵尸状态](#1.2 为什么要有僵尸状态)

[1.3 观察我们的僵尸状态](#1.3 观察我们的僵尸状态)

[1.4 关于僵尸进程的小Tip](#1.4 关于僵尸进程的小Tip)

二、孤儿进程

[2.1 什么是孤儿进程](#2.1 什么是孤儿进程)


一、僵尸进程

1.1 什么是僵尸进程

在上一篇文章中,我们有提到过进程的死亡状态的概念,而我们的进程在其真正死亡之前还会有一个状态,叫做僵尸状态。

这里再给大家具体介绍一下什么是僵尸状态:

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

1.2 为什么要有僵尸状态

首先问一个问题,为什么我们要创建一个进程呢??

一定是因为我们要完成某种任务。那我们又怎么知道,我们的进程把任务完成的怎么样呢?

那么就一定需要我们的进程在退出时,返回一些信息,去表明自己把任务完成得怎么样。所以在当一个进程退出时,其退出信息会由我们的OS写入到我们程序对应的PCB中,这个时候可以允许我们的进程的代码和数据空间被释放,但是不能允许进程的PCB被立即释放,进程退出了,但是还没有被父进程或者我们的OS所读取,那么我们的OS就必须维护这个PCB,而在我们的PCB在被释放之前就会一直处于我们的Z状态。

1.3 观察我们的僵尸状态

先写这样一段代码:

然后我们来观察一下子进程的状态。

这里可以很清楚的观察到,当我们的子进程结束后,由于我的父进程还在跑,也没对子进程进行回收,可以看到我们的子进程处在Z+的状态,这也印证了我们所说。

1.4 关于僵尸进程的小Tip

如果我们的进程进入到了我们的Z状态,但是我们的父进程由于某些原因一直没有去回收它,这个时候如果我们没有及时的去回收我们的它,就会导致其在内存中一直占据着一段空间,造成我们的内存泄漏。

二、孤儿进程

2.1 什么是孤儿进程

当一个子进程还没有退出,没有被父进程回收。而我们的父进程就已经先退出了,这样的子进程我们称之为孤儿进程。

那孤儿进程我们就不管了吗,肯定不可能,因为如果我们不去管理我们的孤儿进程,由于其没有父亲去给它"收尸",使得其一直在我们的内存上占据着一定的空间,造成我们的内存泄漏,这种现象越积越多的话,最后很可能会导致我们的操作系统崩溃。

所以,当一个进程成为孤儿进程时,OS就会给其找一个"干爹",去回收它的资源。这里给大家看一下孤儿进程,同样先编写一段代码:

可以看到这段代码,父进程在子进程还没结束的时候就已经退出且回收,然我们观察一下其父进程会变成什么。

可以看到,当我们的父进程没了之后,我们的子进程从一个前台进程变成了一个后台进程,同样其父进程的PID变成了 1,那么这个1是谁呢,其实就是我们的操作系统,这也说明了,这个找的"干爹"其实就是OS它自己。

相关推荐
哲伦贼稳妥11 分钟前
一天认识一个硬件之电源
运维·其他·电脑·硬件工程
暗恋 懒羊羊16 分钟前
Linux 生产者消费者模型
linux·开发语言·ubuntu
安红豆.1 小时前
Linux基础入门 --13 DAY(SHELL脚本编程基础)
linux·运维·操作系统
..空空的人1 小时前
linux基础指令的认识
linux·运维·服务器
penny_tcf1 小时前
Linux基础命令halt详解
linux·运维·服务器
鱼跃鹰飞1 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
N1cez1 小时前
vscode 连接服务器 不用输密码 免密登录
服务器·vscode
杨哥带你写代码2 小时前
构建高效新闻推荐系统:Spring Boot的力量
服务器·spring boot·php
万界星空科技2 小时前
界星空科技漆包线行业称重系统
运维·经验分享·科技·5g·能源·制造·业界资讯