• 僵尸进程(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进程接管。

  • 相关阅读:
    [luogu p1996] 约瑟夫问题
    [luogu p1098] 字符串的展开
    [luogu p1035] 级数求和
    [luogu p1004] 方格取数
    [luogu p3383]【模板】线性筛素数
    [luogu p1223] 排队接水
    [luogu p1002] 过河卒
    [luogu p1001] A+B Problem
    Java BIO/NIO(Non-blocking I/O)详解
    Linux页框&伙伴算法以及slab机制
  • 原文地址:https://www.cnblogs.com/gattaca/p/4728249.html
Copyright © 2020-2023  润新知