python进程之僵尸进程和孤儿进程

概念

进程:在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程再去创建新的进程。子进程和父进程运行在不同的内存池,是异步的,即父进程永远无法预测子进程什么时候结束。当一个进程完成它的工作之后,它的父进程需要调用wait()或waitpid()系统调用取得子进程的终止状态。

1. 僵尸进程

僵尸进程:(父进程没结束,子进程提前结束,父进程没有处理子进程的状态)(有害,应当避免)
一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取进程的状态信息,那么子进程的进程描述符仍保存在系统中,这种进程称为僵死进程。

2. 孤儿进程

孤儿进程:(父进程提前退出,子进程还没结束,子进程成为孤儿进程)(无害)
一个父进程退出,而它的一个或着多个子进程还在运行,那么这些子进程将称为孤儿进程。孤儿进程将被init进程(进程号1)所收养, 并由init进程对它们完成状态收集工作

详解

僵尸进程的危害

任何一个子进程(init除外)在exit()之后,并不是马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程去处理。这是每个子进程结束时都必须经过的阶段。如果子进程在exit()之后,父进程没有来的及处理,此时用ps命令查看状态的话就时Z状态。如果父进程能及时处理掉,则用ps就查看不到子进程的状态。

unix提供了一种机制去获取子进程结束时的状态信息。在每个进程退出的时候,内核释放所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号processid,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait/waitpid来取时才释放。如果父进程不调用wait/waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程,这就是讲师进程的危害,应当避免

python中fork函数生产子进程

Python中os模块中有fork函数生成子进程,生成的子进程和父进程有各自的地址空间,子进程复制一份父进程内存给自己,其执行顺序可以是不确定的,随机的,不可预测的,这点和多线程执行顺序相似。


import os  

def child():  
    print 'A new child:', os.getpid()  
    print 'Parent id is:', os.getppid()  
    os._exit(0)  

def parent():  
    while True:  
        newpid=os.fork()  
        print newpid  
        if newpid==0:  
            child()  
        else:  
            pids=(os.getpid(),newpid)  
            print "parent:%d,child:%d"%pids  
            print "parent parent:",os.getppid()         
        if raw_input()=='q':  
            break  

parent()  

newpid = os.fork()
fork()函数生成了一个子进程,返回值newpid有俩个,一个为0,用以表示子进程,一个是大于0的整数,用以表示父进程,这个常数正是子进程的pid。如果返回一个负值,则表明子进程创建失败。if和else的执行顺序是不确定的,子、父进程的执行顺序由操作系统的调度算法来决定。

参考链接:
1. http://www.cnblogs.com/Anker/p/3271773.html
2. https://blog.csdn.net/caikehe/article/details/18770071

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页