zoukankan      html  css  js  c++  java
  • 僵尸进程(zombie process)

    首先了解一下linux中进程的5大状态:

    
    
    R        Running or runnable (on run queue)
    S Interruptible sleep (waiting for an event to complete)
    D Uninterruptible sleep (usually IO)
    T Stopped, either by a job control signal or because it is being traced.
    Z Defunct ("zombie") process, terminated but not reaped by its parent.

    状态转换关系图:

                   

    僵尸进程是指一个已经结束运行,但是其父进程尚未对其进行善后处理的进程。那么为什么一个进程结束运行之后,父进程要对它进行善后处理呢?善后处理做了什么事呢?

    具体来说就是,一个进程结束运行之后,该进程并没有被彻底销毁,内核仍然为该进程维护了一些信息(进程ID、该进程的终止状态以及该进程使用的CPU时间总量)。父进程可以通过调用wait()/waitpid()来获取这些信息,并最终销毁该进程。

    如何避免僵尸进程的产生呢?

    1. 父进程通过调用wait()/waitpid()等待子进程结束。(这会导致父进程被挂起)

    2. 如果父进程很忙,不想被挂起,可以通过signal函数设置SIGCHLD信号的handler,在handler中调用wait()/waitpid()。

          (子进程结束时,内核会向父进程发送SIGCHLD信号,父进程对该信号的默认处理是忽略。)

    3. 父进程通过signal(SIGCHLD, SIG_IGN)显示忽略SIGCHLD信号,这样子进程结束后,内核不在向父进程发送SIGCHLD信号,内核负责回收子进程。

    4. 两次fork()。

        父进程fork()出子进程,子进程fork()出孙进程后退出,孙进程结束运行后,由于其父进程已经退出,因此由init进程接管。init进程会负责该进程的销毁工作。

    如何清除僵尸进程呢?

        kill命令无法杀死僵尸进程,但是我们可以kill僵尸进程的父进程,这样僵尸进程就会变成孤儿进程,然后由init进程接管。

  • 相关阅读:
    Linux下新磁盘挂载
    Centos6.5下Haproxy负载均衡搭建
    Linux下redis搭建与配置
    iptables-nat实现反向代理功能
    iptables防火墙规则的添加、删除、保存
    [Python]-tools
    [Python]-Game
    .[Linux]-部署Nagios监控
    [HTML]-web前端
    [Linux]-部署Zabbix监控
  • 原文地址:https://www.cnblogs.com/gattaca/p/4728249.html
Copyright © 2011-2022 走看看