Linux下僵尸进程(Zombie process)深入理解
僵尸进程最核心的问题是:为什么子进程的善后要父进程处理。
百度百科阐述道,一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵尸进程(Zombie)的数据结构,显然找不到我想要答案。
维基百科阐述道,On Unix and Unix-like computer operating systems, a zombie process or defunct process is a process that has completed execution but still has an entry in the process table.
现在我知道了,有个process table需要父进程处理。到底子进程退出时做了哪些事情呢?
首先,一个进程的结构如下:
task[]数组中一项,指向了该进程的task_struct和内核堆栈所在页面
GDT中两项,一项是TSS描述符,一项是LDT描述符
若干页目录项和若干页表
进程的占有的资源如下:
进程拥有的所有物理页面(包括页表和task_struct所占页面)
进程打开的所有文件
一个进程结束了,需要做如下的事情:
释放所有物理页面
关闭打开的文件
清除task[]数组中相关项
如果清除task[]数组中相关相,进程就不可能被调度函数schedule()再次选中了。子进程结束还需要通知父进程,所以最后一项是由父进程处理。所以就是为什么子进程的善后要父进程处理!!父进程正确处理会调用wait/waitpid对子进程进行最后的清除工作。
详细请见http://blog.csdn.net/yming0221/article/details/6334666