资讯专栏INFORMATION COLUMN

关于僵死进程

LuDongWei / 2169人阅读

摘要:首先介绍一下什么是僵死进程此时程序运行后,在子程序结束后,父进程尚且没有完成,此时查看一下进程信息,可以得到可以看到两个进程,其中子程序的进程已经处于状态,此时子进程已经代码执行完毕,但是这个进程并没有终止,这就对的进程资源造成了很多的浪

首先介绍一下什么是僵死进程
  int main()
  {
      int n = 0;
      char *s = NULL;
 
      pid_t pid = fork();
      assert(pid != -1);
  
      if(pid == 0)
      {
          n = 3;
          int i = 0;
          for(; i < n; i++)
          {
              sleep(1);
              printf("child running
");
          }
      }
      else
      {
          n = 7;
          int i = 0;
          for(; i < n; i++)
          {
              sleep(1);
              printf("parent running
");
          }
      }
}

此时程序运行后,在子程序结束后,父进程尚且没有完成,此时查看一下进程信息,可以得到

可以看到两个signalttt进程,其中子程序的signalttt进程已经处于defunct状态,此时子进程已经代码执行完毕,但是这个进程并没有终止,这就对CPU的进程资源造成了很多的浪费,如果说短时间内产成了大量的僵死进程,那么此时因为进程号等信息占用,此时不能创建新的进程

为什么会出现僵死进程呢?

我们来改一下代码:

int main()
{
int n = 0;
    char *s = NULL;
    if(pid == 0)
    {
       n = 7;
       int i = 0;
       for(; i < n; i++)
       {
          sleep(1);
          printf("child running
");
       }
     }
     else
     {
        n = 3;
         int i = 0;
         for(; i < n; i++)
         {
            sleep(1);
            printf("parent running
");
         }
      }
}

再次在运行途中查看ps


此时并没有和之前一样出现僵死进程,而我们仅仅是将子进程改的运行的时间比父进程长了一些,然后再次查看时候,发现僵死进程就消失了???
所以我们可以得到条件,僵死进程中,父进程一定要“活得久”~


这里本质上是因为,在Linux系统中,进程是有父子关系的,从init进程开始展开,是一个大的进程树,而子进程的结束都会由子进程向它的父进程发送一个信号(SIGCHLD),而此时如果父进程在运行中没有获取子进程的退出码,这样就出现了僵死进程

关于僵死进程的处理

在Linux系统中有一个特殊的处理方法,signal(SIGCHLD,SIG_IGN);子进程在结束时候会向父进程发送一个子进程结束的信号,我们调用signal函数去忽略掉这个信号,那么这时候子进程就会变成了孤儿进程,会自动的被init接收处理,init进程会在进程表中挨个查找孤儿进程,也就是说,进程表越大那么这个过程造成的资源占用也就越多

也可以在父进程中用wait();函数,这样在执行到这句时,父进程会等待到子进程结束后,但是这句会造成父进程的挂起

同样的,也可以用signal(SIGCHLD,fun);去实现一个处理子进程信号的函数,让父进程接收到信号之后,调用wait()将子进程结束掉

还有一种特殊的是利用两次fork(),这样父进程在第一次创建的子进程1中,再次创建一个子进程2,子进程2负责执行子进程的工作,而子进程1只做一件事件--------wait(子进程2);专心致志等待子进程2结束,这样就处理了wait导致的进程挂起的问题

`

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/33276.html

相关文章

  • 【学习笔记】2. 各种不同的进程

    摘要:僵死进程僵死进程子进程退出。想想一下,同时运行多个脚本,子进程退出,但是没有释放,进程资源优先。新来的任务就无法出新的子进程当然,系统会做一个清理的工作。同样的孤儿进程,就是找不到父进程的子进程。 0. 同系列索引 进程与进程组 各种不同的进程 一个进程的演变 1. 进程组 具体的介绍,请参考 进程和进程组的概念 showImg(https://segmentfault.com/i...

    ckllj 评论0 收藏0
  • 进程管理

    摘要:作业调度在批处理系统中,当作业调度程序按照一定的算法调度到某作业时,便将该作业装入到内存,为它分配必要的资源,并立即为它创建进程,再插入到就绪队列中。异常结束在进程运行期间,由于出现某些错误和故障而迫使进程终止。 博文参考 http://www.178linux.com/48784 http://share.zhbor.com/article/20278.html showImg(ht...

    Reducto 评论0 收藏0
  • Linux 命令 top 拆解

    摘要:命令是下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。任务信息僵尸进程表示已经终止,但仍然保留一些信息的进程。中没有固定大小,根据使用情况自动增加或删除。交互式使用命令显示系统实时状态,支持交互操作。 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。 一、内容介绍 top 命令运行图: showImg(https://segment...

    wayneli 评论0 收藏0
  • 进程管理工具、作业控制

    摘要:已终止已终止查看进程的内存映像信息常用它对应的文件是号内存中起始地址大小内存区域访问权限文件匿名内存,不是该进程私有的 ps 显示系统当前进程状态,PID代表进程的ID;TTY中?代表与终端无关;STAT代表终端状态【S:可中断睡眠,D:不可中断睡眠,R:运行或可运行,Z:僵死,T:停止,s:session leader 某个会话的主进程,l:多线程进程,+:前台进程,一般跟终端有关,...

    MASAILA 评论0 收藏0
  • linux下查询进程占用的内存方法总结

    摘要:下查询进程占用的内存方法总结假设现在有一个的进程,进程为。表示休眠,表示正在运行,表示僵死状态,表示该进程优先值为负数进程占用的使用率进程使用的物理内存和总内存的百分比该进程启动后占用的总的时间,即占用使用时间的累加值。 linux下查询进程占用的内存方法总结 假设现在有一个「php-cgi」的进程 ,进程id为「25282」。现在想要查询该进程占用的内存大小。linux命令行下有很多...

    PingCAP 评论0 收藏0

发表评论

0条评论

LuDongWei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<