5.1.4 网络编程进程---僵尸进程与孤儿进程

 

僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
 
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害 [2]  。
 
我自己的理解:

僵尸进程:

当子进程优先于父进程结束,因为这段期间父进程未调用wait()或waitpid()的这段期间,这些子进程就叫做僵尸进程。

因为只有当父进程结束时,才会去调用wait()或waitpid()去清理自己子进程的僵尸进程。

每个子进程都会经历僵尸进程。

查看进程是否是僵尸进程的命令:

ps -eo pid,ppid,args,command,stat | grep 907

僵尸进程有害: 比如一个父进程永远不结束,那么就会有很多僵尸进程,占用进程的数量。当进程数目达到一定数量之后,系统就无法再创建新的进程。

 1 from multiprocessing import Process
 2 import time
 3 import os
 4 
 5 
 6 class MyProcess(Process):    # 继承Process类
 7     def __init__(self, name):
 8         super().__init__()
 9         self.name = name
10 
11     def run(self):   # 必须重写run方法
12         print('%s is running; 父进程id是:%s' % (os.getpid(), os.getppid()))
13         time.sleep(1)
14         print('%s is ending; 父进程id是:%s' % (os.getpid(), os.getppid()))
15 
16 
17 if __name__ == '__main__':
18     p = MyProcess('xxx')
19     p.start()     # start自动绑定到run方法
20     print('主进程ID是:%s; 主进程的父进程ID是: %s' % (os.getpid(), os.getppid()))  # 主进程的父进程是pycharm或执行该脚本的进程
21     time.sleep(60)
22     exit()
23 
24 # 输出结果:
25 # 主进程ID是:906; 主进程的父进程ID是: 540
26 # 907 is running; 父进程id是:906
27 # 907 is ending; 父进程id是:906
28 
29 # 在父进程未结束之前,查看子进程的状态,是Z僵尸进程
30 # BealladeAir:~ beallaliu$ ps -eo pid,ppid,args,command,stat | grep 907
31 #   907   906 (Python)                                                         (Python)         Z   
32 #   909   803 grep 907                                                         grep 907         R+ 

 

孤儿进程: 某种情况下,父进程比子进程优先结束,那么子进程就没有父亲了。系统就会将子进程托管给init进程(孤独院),该子进程就叫孤儿进程。

孤儿进程对系统无害。因为孤儿进程只是由父进程变成init这个继父进程管理。

 

posted @ 2018-06-16 10:09  beallaliu  阅读(197)  评论(0编辑  收藏  举报