1. zombie process是什么?
zombie process是那些在系统中已经死掉的process,
通过ps -A | grep defunct可以查看系统中有多少zombie process。
2. zombie process是如何产生的?
当一个process被kill掉,比如通过
kill -SIGKILL child_process_pid或者
kill -SIGTERM child_process_pid
去kill child process。
而其parent process却没有调用wait()或waitpid()系统调用时,
这个child process就会变成zombie process。
3. zombie process有什么危害?
你的系统中如果只有一个或几个zombie process,可能并不会对你产生多大影响。
虽然zombie process已经释放了绝大部分资源,但是仍然占用着一个process descriptor。
而系统中的process的数量是有限制的,并不是可以无限申请的。
通过
sh-3.2# cat /proc/sys/kernel/pid_max
32768
可以最大的process个数为32768个(这个应该是configurable的)。
所以如果zombie process占用了太多的process descriptor的话,
可能会导致fork新的进程失败。
所以,如果系统中出现zombie process,最好要查什么原因。
4. 如何删掉系统中已经存在的zombie process?
kill -9 zombie_process_pid无法kill掉zombie process。
要想kill掉zombie process,只能先kill掉他的parent process,
然后zombie process会变成orphan process,接着init process会
接管orphan process成为zombie process的parent process,
接着调用wait(),这样zombie process才会从process descriptor table中
移除。
5. 为什么要调用wait()系统调用?
parent process调用wait()系统调用,相当于parent process确认了child process的结束,
这样kernel就会释放掉child process所占有的资源,这里说的资源可能特别指的是
process descriptor。
6. parent process应该在什么时候去调用wait()系统调用?
parent process调用wait()比较合适的时机是去monitor SIGCHILD这条signal,
child process结束时会发送SIGCHILD。
pseudo code如下:
#include <signal.h>
struct sigaction t_act, t_old_act;
t_act.sa_flags = SA_NODEFER;
t_act.sa_handler = signal_handler;
sigaction(SIG_CHILD, &t_act, &t_old_act);
static void _signal_handler()
{
wait(NULL);
}
以上如果有理解错误的地方,还请大家帮忙指出来,谢谢!