您的位置:首页 > 其它

【学习笔记】孤儿进程和僵尸进程

2015-08-31 18:36 453 查看
正常情况:

子进程是通过父进程创建的,子进程再创建新的进程,父进程不能预测子进程的结束时刻。当一个
进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
  僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。


问题和危害

在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等,但是仍然为其保留一定的信息(如PID、运行时间、退出状态)直到父进程通过wait
/ waitpid来取时才释放。问题在于,进程不调用wait / waitpid,保留的信息不能释放,造成进程号的占用。而系统的进程号是有限的,到达极限后使得系统不能创建新进程。大量这样的僵尸进程使得系统瘫痪。

孤儿进程是没有父进程的进程,将由系统内核init接管,init会循环wait直到孤儿进程消亡。孤儿进程并不会有什么危害。

任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个
子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。 如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。

僵尸进程的场景和处理

系统有个进程只管产生新进程,而对产生的新进程不管不问,系统运行上一段时间之后,系统中就会存在很多的僵死进程,倘若用ps命令查看的话,就会看到很多状态为Z的进程。想要消灭这些僵尸进程,就要通过kill发送信号量干掉元凶的父进程,使得产生状态为Z的进程被init管理,从而让系统内核自动释放所占有的资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: