当前位置:嗨网首页>书籍在线阅读

21-僵尸进程

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.5.5 僵尸进程

正如前面所提到的那样,一个进程已经终止了,但是它的父进程还没有获取到其状态,那么这个进程就叫做僵尸进程。僵尸进程还会消耗一些系统资源,虽然消耗很少——仅仅够描述进程之前状态的一些概要信息。保留这些概要信息主要是为了在父进程查询子进程的状态时可以提供相应的信息。一旦父进程得到了想要的信息,内核就会清除这些信息,僵尸进程就不存在了。

然而任何用过UNIX系统的人都会或多或少地看到过僵尸进程。通常称这些进程为“幽灵进程(ghosts)”,这些进程没有相应的父进程。如果进程创建了一个子进程,那么它就有责任去等待子进程(除非它的生命周期很短,这种情况你很快就会看到),即使会丢弃得到的子进程信息。否则,如果父进程没有等待子进程,其所有子进程就会成为幽灵进程,并一直存在,占满系统的进程列表,导致应用非常慢,让人讨厌。

然而,如果父进程在子进程结束之前就结束了呢?或者父进程还没有机会等待其僵尸的子进程,就先结束了呢?无论何时,只要有进程结束了,内核就会遍历它的所有子进程,并且把它们的父进程重新设为init进程(即pid为1的那个进程)。这保证了系统中不存在没有父进程的进程。init进程会周期性地等待所有子进程,确保不会有长时间存在的僵尸进程——没有幽灵进程!因此,当父进程在子进程之前结束,或者在退出前没有等待子进程,那么init进程会被指定为这些子进程的父进程,从而确保了它们最终会退出。这种处理方式受到人们的推崇,不过这种安全措施也意味着生命周期短的进程没有必要等待它所有的子进程结束。