美文网首页
僵尸进程

僵尸进程

作者: eesly_yuan | 来源:发表于2016-05-15 18:39 被阅读215次

僵尸进程会导致系统资源的泄漏,其主要涉及父子进程、孤儿进程等概念,详细内容如下:

子进程

每个子进程都是由其父进程调用fork()\vfork()\clone()等系统调用而生成的。例如,在 shell 中执行一个命令时,shell 进程就会调用 fork() 产生一个子进程,然后子进程调用 exec() 执行命令程序,进程结束后返回控制至父进程 shell 进程。
子进程退出的时候会向其父进程发送一个SIGCHLD信号。

僵尸进程

对于终止的进程,内核会释放其使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。
僵尸进程就是指:一个进程执行了exit系统调用退出,而其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态)的进程。

孤儿进程

如果一个进程终止,而该进程有子进程处于僵尸状态,子进程被称为孤儿进程,孤儿进程由 init 进程收养,它的 PPID 变为 1。

如何避免僵尸进程

  • 1、通过signal(SIGCHLD, SIG_IGN)通知内核对子进程的结束不关心,由内核回收。
  • 2、父进程调用wait/waitpid等待子进程结束,(wait会阻塞父进程直至子进程退出、waitpid可以通过WNOHANG参数使父进程不阻塞立即返回)
  • 3、注册signal处理函数,在处理函数调用wait/waitpid等待子进程退出。这里需要关注的一点是:Linux的信号机制是不排队的,假如在某一时间段多个子进程退出后都会发出SIGCHLD信号,但父进程来不及一个一个地响应,所以最后父进程实际上只执行了一次信号处理函数
  • 4、通过两次调用fork。
父进程A fork子进程1, 然后父进程waitpid等待子进程1退出
子进程1 fork孙进程1, 然后子进程1退出。

这里子进程1退出后会被父进程A回收。而对于孙子进程其父进程已经退出,故孙进程->孤儿进程,程由init进程接管,孙进程结束后,init会等待回收。

reference

linux下的僵尸进程处理SIGCHLD信号
Linux 基础 —— Linux 进程的管理与监控

相关文章

  • 僵尸进程处理方案

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

  • 如何杀死僵尸进程?

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

  • 104-僵尸进程

    多进程编程要注意僵尸进程。子进程没有可执行代码后将变成僵尸进程,如果父进程一直运行,又没有处理僵尸进程的代码,僵尸...

  • linux上关闭僵尸进程

    查看所有僵尸进程: 之后kill -9杀死僵尸进程的父进程。

  • 孤儿进程、僵尸进程与进程回收

    孤儿进程与僵尸进程 孤儿进程:父亲死了,子进程被init进程领养僵尸进程:子进程死了,父进程没有回收子进程的资源(...

  • 示例说明僵尸进程的危害及解决方法

    简述 首先简要说明下僵尸进程和孤儿进程的概念(前提都是父进程调用fork产生子进程) 僵尸进程:子进程终止,父进程...

  • 进程之其他进程

    僵尸进程 定义 子进程先于父进程退出,父进程没有对子进程的退出做出相应的处理,此时子进程就会变成僵尸进程 影响 进...

  • 僵尸进程&孤儿进程

    僵尸进程概念 孤儿进程概念

  • 僵尸进程的产生和防范

    僵尸进程 僵尸进程的产生 fork产生的父进程和子进程有退出的先后顺序,如果子进程在父进程前退出就会产生,而父进程...

  • PHP的多进程--防止僵尸进程

    何为僵尸进程 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一...

网友评论

      本文标题:僵尸进程

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