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它自己。

相关推荐
郝亚军4 小时前
ubuntu-18.04.6-desktop-amd64安装步骤
linux·运维·ubuntu
Konwledging4 小时前
kernel-devel_kernel-headers_libmodules
linux
Web极客码4 小时前
CentOS 7.x如何快速升级到CentOS 7.9
linux·运维·centos
一位赵4 小时前
小练2 选择题
linux·运维·windows
qq_312920114 小时前
Nginx+Keepalived双主架构:消除单点故障的最佳实践
运维·nginx·架构
代码游侠5 小时前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
LucDelton5 小时前
Java 读取无限量文件读取的思路
java·运维·网络
Lw老王要学习5 小时前
CentOS 7.9达梦数据库安装全流程解析
linux·运维·数据库·centos·达梦
蓝队云计算6 小时前
蓝队云部署OpenClaw深度指南:避坑、优化与安全配置,从能用做到好用
运维·安全·云计算
Kaede66 小时前
提示dns服务器未响应,需要做哪些事?
运维·服务器