您的位置:首页 > 其它

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

2017-07-03 10:29 190 查看
在学习进程时,一定会学到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.故而我们可以想到,如果父进程一直不终止,且一直不获取子进程退出状态,子进程这个僵尸进程将持续占用系统资源,永远不释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息