僵尸进程与孤儿进程

僵尸进程

一个父进程利用fork创建子进程,如果子进程结束了,但是父进程没有等待(调用wait / waitpid)它,那么该子进程将变成一个僵尸进程。

僵尸进程对操作系统是有害的:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件、占用的内存等,但是仍然为其保留一定的信息(包括进程号、退出状态、运行时间等),如果父进程一直不调用wait / waitpid,那么保留的这些信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果产生大量的僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。

孤儿进程

一个父进程退出,而它的一个或多个子进程仍然在运行,那么这些子进程就会变成孤儿进程。孤儿进程将被init进程(进程号为1)所收养,init进程将在这些孤儿进程结束时第一时间回收它们的信息,保证它们不会成为僵尸进程。

僵尸进程的避免

  • 父进程通过wait / waitpid等待子进程,子进程工作完父进程再执行工作。
  • 父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程将变为孤儿进程从而被init接管,并且由孙进程接受本应子进程接受的任务。当孙进程结束后,init会回收它的信息,不过子进程的回收还是需要自己做。

补充

僵尸状态是每个子进程必经的状态,而之所以在进程结束后要进入僵尸状态是因为父进程可能要取得子进程的退出状态等信息。