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