孤儿进程与僵尸进程的区别以及僵尸进程的解决方案

孤儿进程与僵尸进程的区别

普通进程资源回收过程

正常情况下,子进程由父进程创建,父子进程是一个异步过程,子进程结束之后父进程一般会调用wait()或者waitpid()取得子进程的终止状态,然后回收子进程的资源。

孤儿进程

孤儿进程: 父进程结束了,但是他的一个或者多个子进程还在运行,那么这些子进程就变成了孤儿进程(father died).子进程的资源由Init进程(进程号PID = 1)回收。

僵尸进程

僵尸进程:子进程退出了,但是父进程没有调用wait() 或者waitpid() 去获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称为僵尸进程。

僵尸进程的危害

系统所能使用的进程号是有限的,如果大量差生僵尸进程,将因为没有可用的进程号,导致无法产生新的进程,这就是僵尸进程的危害。孤儿进程是没有父进程,init 进程充当父进程,因此孤儿进程并没有什么危害。

解决僵尸进程的方案

任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个成为僵尸进程的数据结构,等待父进程去处理。如果父进程在子进程exit()之后,没有及时处理,出现了僵尸进程,并可以用ps命令去查看,它的状态是“Z”

  • Kill -9 父进程的pid值 将僵尸进程转换为孤儿进程然后由系统进行回收
  • 父进程调用wait 或者waitpid 等待子进程结束,但是性能不会太好,因为一直有父进程处于等待的状态下,没有起到多进程的作用。
  • 通过信号机制,子进程退出时向父进程发送SIGCHLD信号,父进程调用signal(SIGCHLD,sig_child)去处理SIGCHLD信号,在信号处理函数sig_child()中调用wait进行处理僵尸进程。什么时候得到子进程信号,什么时候进行信号处理,父进程可以继续干其他活,不用去阻塞等待。
    注意: 僵尸进程无法直接使用kill 杀死
原文地址:https://www.cnblogs.com/wsl-hitsz/p/14464953.html