僵尸进程和孤儿进程的比较

    在Unix类系统中,这两类进程非常常见。一种叫Zombie,一种叫Orphan。由于名字的关系,容易混淆。


Unix的进程关系的机制:
    unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到。
    在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 


僵尸进程:一个子进程在其父进程还没有来得及调用wait()或waitpid()来获取子进程的信号状态的情况下退出,那么这个子进程就是僵尸进程。子进程结束后会向父进程发出SIGCHLD信号。

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


僵尸进程对系统的影响:
    如果进程不调用wait()或waitpid()的话,那么保留的信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。


外部解决办法:

    kill掉父进程,使僵尸进程变为孤儿进程。
内部解决办法:
    1、父进程处理SIGCHLD信号,在信号处理函数中调用wait处理僵尸进程。
    2、fork两次:借助一个中间进程,父进程只wait中间进程,让中间进程再fork出孙进程。孙进程结束后会变成僵尸进程,等中间进程一结束,孙进程就成孤儿进程了。


孤儿进程对系统的影响:
    孤儿进程并不会有什么危害,init进程会接管并处理掉它。

你可能感兴趣的:(僵尸进程和孤儿进程的比较)