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

 

 

 

 

posted @ 2013-01-30 21:49  smallmaple  阅读(3147)  评论(0编辑  收藏  举报