美文网首页
浅议Unix的defunct进程(“僵尸”进程)

浅议Unix的defunct进程(“僵尸”进程)

作者: IT软件技术分享 | 来源:发表于2020-09-17 10:51 被阅读0次

最近在看Stevens的《Unix环境编程》,其中第八章讲到了进程的控制,里面有关于僵死进程的描述,但看完后还是不是很了解。

网上有一篇《浅议Unix的defunct进程》的文章,其原理描述的比较详细有用,所以转载到此。

本文出自:http://www2.ccw.com.cn 作者: 张道新 赵国明

在Unix系统管理中,当用ps命令 观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表 (processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数 目太多,还会导致系统瘫痪。

我们知道,每个Unix进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息 都存储在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程 表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期 后,它会执行exit()系统调用,此时原来进程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进 程终止后,但是父进程尚未读取这些数据之前。利用这一点我们可以用下面的程序建立一个defunct 进程:

1#include <stdio.h> 2#include <sys/main.h> 3#include <stdlib.h> 4#include <unistd.h> 5 6int main() 7{ 8    if(!fork()) 9    {10        printf(“child pid=%d\n”, getpid());11        exit(0)12    }13    sleep(20);14    printf(“parent pid=%d \n”, getpid());15    exit(0);16}

当 上述程序以后台的方式执行时,第8行强迫程序睡眠20秒,让用户有时间输入ps -e指令,观察进程的状态。当父进程执行终止后,再用ps -e命令观察时,我们会发现defunct进程也随之消失。这是因为父进程终止后,init 进程会接管父进程留下的这些“孤儿进程”(orphan process),而这些“孤儿进程”执行完后,它在进程表中的进入点将被删除。如果一个程序设计上有缺陷,就可能导致某个进程的父进程一直处于睡眠状态 或是陷入死循环,那么当该子进程执行结束后就变成了defunct进程,这个defunct 进程可能会一直留在系统中直到系统重新启动。

如果我们将上述程序略作修改,在第8行sleep()系统调用前执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

由于调度程序无法选中Defunct 进程,所以不能用kill命令删除Defunct 进程,惟一的方法只有重启系统。

相关文章

  • 浅议Unix的defunct进程(“僵尸”进程)

    最近在看Stevens的《Unix环境编程》,其中第八章讲到了进程的控制,里面有关于僵死进程的描述,但看完后还是不...

  • [Linux]僵尸进程以及杀掉他们

    一、什么是defunct进程(僵尸进程)?在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wa...

  • Linux中的defunct进程(僵尸进程)

    一、什么是defunct进程(僵尸进程)?在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wa...

  • 孤儿进程与僵尸进程

    孤儿进程与僵尸进程[总结] 1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直...

  • 僵尸进程查杀

    僵尸进程,是指在Linux/Unix系统中,一个进程结束了,但是他的父进程没有等待(调用wait/waitpid)...

  • multithreading多进程的使用

    先了解一下主要的关键点: 在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸...

  • 僵尸进程处理方案

    僵尸进程介绍 Z(zombie)-僵尸进程(子进程终止,父进程没有wait子进程) 僵尸进程产生原因 僵尸进程是当...

  • 什么是僵尸进程以及如何处理

    在UNIX系统中,一个进程结束了,但是其父进程没有等待(调用wait/waitpid)它,那么它将变成一个僵尸进程...

  • 神奇的Java'僵尸'进程问题

    神奇的"僵尸"进程问题(java defunct) 现象描述 大概1个月多以前 在启动脚本中增加了tail -f ...

  • 如何杀死僵尸进程?

    僵尸进程定义?查看僵尸进程,利用命令ps,可以看到有标记为Z(zombie)的进程就是僵尸进程。 僵尸进程的危害?...

网友评论

      本文标题:浅议Unix的defunct进程(“僵尸”进程)

      本文链接:https://www.haomeiwen.com/subject/vphlyktx.html