您的位置:首页 > 其它

僵死进程的意义

2016-11-14 13:17 183 查看
看了很多关于僵死进程的目的,都没有一个形象化的解释,这里结合自己个人的经验,来说明一下个人的理解。

我们假设根本不存在僵死进程,那么会发生什么?我们来进行一个CASE设计:

父进程记录所有子进程的pid记录下来,后来父进程需要查看某个子进程的信息,这里我们只能通过该子进程pid来获取进程信息,可是,如果没有僵死进程,我们能否判定这个pid是个有效的pid?

这就是一个很典型的异步问题。我们知道进程的终止是可以自我控制的(当然也可以有一些内核发送的信号指令控制),基于此,我们可以有如下的情况:

a.子进程还没有终止,父进程通过查看pid得到该子进程的信息,正常

b.子进程已经终止,pid还没有分配给其他进程,父进程通过查看pid得到该子进程的信息,错误

c.子进程已经终止,pid分配给了其他进程,父进程通过查看pid得到该子进程的信息,错误(此时的pid所指向的进程可能已经不是父进程的子进程)

从上面的分析可以看出,如果我们仅仅终止子进程,而没有通知父进程,可能会产生b和c的错误,从c可以看出,如果我们暂时不保留此pid,该pid可能会被重新分配。所以,这就是僵死进程存在的意义,另外,这是一个异步的问题,操作系统如何通知父进程呢?这里我们就有了一个信号的概念。

操作系统通过发送SIGCHLD信号告知父进程,有个子进程已经终止了,这时候父进程可以通过waitpid(wait)来获得这个终止子进程的pid,另外这个函数可以真正释放子进程的pid资源,供操作系统重新分配。信号的处理可以通过信号处理函数来实现(详细参考《unix网络编程》第三版第五章)

------------------------------------------------------------------------------------------------------------------------------------------------------------

之所以僵死进程的理解出现了问题,其实有个本质的问题,这一系列的动作是一个异步操作。我们说个类似的同步操作,这个操作比较容易理解(基于C语言的知识)。

我们给一个指针变量申请空间,然后释放这个指针变量,并且将这个指针变量设置成nullptr。这样我们就可以正常使用的这个指针变量了,我们的操作是这样的:

a.如果指针变量是nullptr,我们重新申请空间(或者不用释放该指针变量的空间)

b.如果指针变量是非nullptr,我们可以直接使用该变量(或者释放该指针变量的空间)

这个操作是一个同步的操作,我们随时可以在一个进程查看这个指针变量是不是nullptr。其实僵死进程就类似于我们释放了指针变量的空间,但是,我们还没有把该变量设置成nullptr值。

从上面的类比我们发现,对于计算机上的概念,我们要找寻雷同的部分,因为,计算模型其实就那么多,如果能做类似比较,我们理解起来会比较容易。还有一个高级抽象,我们下面会说。

---------------------------------------------------------------------------------------------------------------------------------------------------------------

计算机的计算模型大部分是基于空间和时间来考虑的。僵死进程唯一占用的空间是pid空间,这个空间如果不能合理的应用就会造成浪费,之所以保留这个空间,是为了让父进程感知子进程已经终止这个行为。时间方面,这个感知过程是一个异步的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: