当我们使用 ps -ef 检视程式时,发现 defunct,这就是所谓的僵尸程序,它是一个已死亡的程式,但在程式表(processs table)中仍占了一个位置(slot)。由于程式表的容量是有限的,所以 defunct 程序不仅占用系统的内存资源,影响系统的效能,而且如果其数目太多,还会导致系统瘫痪。
每个 Linux 的程序在程序表里都有一个进入点(entry),核心程式执行该行程时所使用的一切资讯都储存在进入点。当用 ps 命令察看系统中的程序资讯时,看到的就是程序表中的相关资料。而当使用 fork() 建立一个新的程序后,核心就会在程序表中给这个新行程分配一个进入点,然后将相关资讯储存在该进入点所对应的程序表内,而这些资讯中有一项是父程式的识别码。当这个程序结束后,它会执行 exit() 的系统呼叫,此时原来程序表中的资料会被该程式的退出码(exit code)执行时所用的 CPU 时间等资料所取代,这些资料会一直保留到系统将它传递给它的父程式为止。
说了这么多,defunct 的出现时间是在子程式终止后,但是父程式尚未读取这些资料之前。简单地说,子程序是由父程序产生的,但如果程式消失并且父程式未得到相关资料,就会出现 defunt 。