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