孤儿进程和僵死进程
前置知识
子进程是父进程创建的,子进程和父进程的运行是异步的,父进程不知道子进程什么时候结束。父进程需要调用wait()或者waitpid()系统调用获取子进程的终止状态。
init进程: init进程的PID为1,是在系统启动时由内核创建的,它不会终止,是所有进程的祖先
孤儿进程
一个父进程退出,而它的一个或者多个子进程还在运行,这些子进程叫做孤儿进程。孤儿进程会被init进程所收养,也就是说将这些孤儿进程的父进程设置为init进程。当孤儿进程结束了,会由Init进程回收这些孤儿进程的资源。
孤儿进程对系统没有什么危害性,因为孤儿进程结束后会由init进程负责它的善后。
僵死进程
僵死进程概念
当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到被它的父进程回收资源。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程,从此时开始,该进程就不存在了。一个终止了但还未被回收的进程称为僵死进程。
如果一个父进程终止了,内核会安排 init 进程成为它的孤儿进程的养父。如果父进程没有回收它的僵死子进程就终止了,那么内核会安排 init 进程去回收它们。
僵死进程危害
任何一个子进程(除了init进程)在exit()之后,内核释放该进程所有的资源(包括打开的文件,占用的内存等)。但是会留下一个称为僵尸进程(Zombie)的数据结构(包括进程号、退出状态、运行时间等等),等待父进程处理。系统所能使用的进程号是有限的,如果这个数据结构不被清除,并且有大量的僵死进程,系统将会因为没有可用的进程号而不能创建新的进程。
解决僵死进程
僵死进程不可以被kill掉,但是可以通过 kill 掉僵死进程的父进程,使这个僵死进程变为孤儿进程,让init进程处理它的后事。
也可以直接重启服务器。
版权声明:
作者:徐锦桐
链接:https://www.xujintong.com/2024/01/01/192/
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者:徐锦桐
链接:https://www.xujintong.com/2024/01/01/192/
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
THE END