5.1.4 网络编程进程---僵尸进程与孤儿进程
Posted beallaliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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这个继父进程管理。
以上是关于5.1.4 网络编程进程---僵尸进程与孤儿进程的主要内容,如果未能解决你的问题,请参考以下文章