- 僵尸进程
- 造成的原因
- 并非网上疯传的父进程没有调用wait().
- 真正原因:Linux内核结束一个进程时,主要分为两步.首先释放用户空间的资源;其次才会释放内核空间的资源(内核栈,task_struct,thread_info),而这些内核资源会保存子进程的执行状态,父进程可能会通过这些资源信息来判断子进程的执行结果,因此内核结束一个进程时,只会先单独执行第一步,而不能直接自己做主将内核资源也是放掉.
- 这样就会导致一个问题,如果父进程不做任何处理,那么就会导致子进程的内核资源不会被释放.这也正是僵尸进程产生的原因.
- 解决办法
- 从原因角度来看,内核完全是为了给父进程提供子进程执行状态信息而导致内核资源没有被释放.那么也应该由父进程主动通知内核,我已经知道子进程的执行状态,子进程资源可以被完全释放.
- 办法很简单,父进程执行wait()即可.
- 造成的原因
再想一个问题,如果父进程比子进程先exit.那么,岂不是说子进程的内核资源永远都不会被释放,然而写内核的那一群生物是来自外星球的,N年前就想到这种问题并解决.
- 孤儿进程
- 原因
- 上文中已经指出
- 解决办法
- Linux系统上的所有进程都来自两个init和kthread.因此即使父进程结束,子进程的父进程设为init进程即可(有的书上提到可能会被设置为父进程的父进程,但是这可能会有问题,即该进程多了一个子进程,但不知道,有待翻出来源码看看.经证实,是后者[http://lxr.free-electrons.com/source/kernel/exit.c]的find_new_reaper函数).而init进程又会隔一段时间执行wait,这样两个问题同时被解决.
- 原因