进程——孤儿进程与僵尸进程

来源:互联网 发布:java switch 例子 编辑:程序博客网 时间:2024/05/20 16:36

在学习进程时,一定会学到fork函数创建子进程,由此引出两个概念:

孤儿进程

当父进程已经退出而子进程仍在运行时,此时子进程就相当于一个孤儿,即为孤儿进程。孤儿进程会立即被init进程(1号进程)收养,此后的收尾工作均由init进程负责。
形象的解释,init进程就好像一个民政局,每出现一个孤儿,init会立即领养,知道该孤儿完成自己的所有使命,凄凉地结束了它的一生时,init会代表党和政府做好它的所有善后工作。
因此,孤儿进程并不会有什么危害。

僵尸进程

当子进程已终止而父进程没有调用wait或waitpid获取子进程的退出状态信息,该信息将一直占用系统资源以等待父进程获取。
僵尸进程终止的三种情况:
父进程获取退出状态
父进程退出,该进程组资源全部被回收
显然,如果某父进程产生的僵尸进程过多,会对系统造成较大影响。

下面进行两进程情景的模拟(环境:CentOS7)。
(一)孤儿进程

1.写一个简单的c程序,流程图如下:

孤儿进程模拟程序流程图

2.具体代码为
这里写图片描述

3.运行结果为
这里写图片描述

4.如上图,两个黄色的箭头分别指向了子进程在父进程退出前后的ppid值,即父进程的进程号。显然,父进程退出前,子进程的ppid与父进程pid相同,父进程退出后,子进程的ppid立即更改为1,即被init进程立即收养。

(二)僵尸进程

1.写一个简单的c程序,流程图如下:

这里写图片描述

2.具体代码为
这里写图片描述

3.在编译执行该代码前,写一句命令行shell脚本,用来实时监控子进程与父进程状态,如下:
while :; do ps axj | grep mypro | grep pts/2 ; echo '------------------------------------------' ; sleep 1 ; done
4.运行代码,结果为
这里写图片描述

5.这期间,监视窗口结果为
这里写图片描述

6.综上,
- 在子进程运行2s期间,其状态为S+;
- 子进程运行结束后,父进程运行期间,子进程状态变为Z+;
- 直至父进程运行结束,两进程同时终止。
7.故而我们可以想到,如果父进程一直不终止,且一直不获取子进程退出状态,子进程这个僵尸进程将持续占用系统资源,永远不释放。

原创粉丝点击