zoukankan      html  css  js  c++  java
  • 孤儿进程与僵尸进程的区别以及僵尸进程的解决方案

    孤儿进程与僵尸进程的区别

    普通进程资源回收过程

    正常情况下,子进程由父进程创建,父子进程是一个异步过程,子进程结束之后父进程一般会调用wait()或者waitpid()取得子进程的终止状态,然后回收子进程的资源。

    孤儿进程

    孤儿进程: 父进程结束了,但是他的一个或者多个子进程还在运行,那么这些子进程就变成了孤儿进程(father died).子进程的资源由Init进程(进程号PID = 1)回收。

    僵尸进程

    僵尸进程:子进程退出了,但是父进程没有调用wait() 或者waitpid() 去获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称为僵尸进程。

    僵尸进程的危害

    系统所能使用的进程号是有限的,如果大量差生僵尸进程,将因为没有可用的进程号,导致无法产生新的进程,这就是僵尸进程的危害。孤儿进程是没有父进程,init 进程充当父进程,因此孤儿进程并没有什么危害。

    解决僵尸进程的方案

    任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个成为僵尸进程的数据结构,等待父进程去处理。如果父进程在子进程exit()之后,没有及时处理,出现了僵尸进程,并可以用ps命令去查看,它的状态是“Z”

    • Kill -9 父进程的pid值 将僵尸进程转换为孤儿进程然后由系统进行回收
    • 父进程调用wait 或者waitpid 等待子进程结束,但是性能不会太好,因为一直有父进程处于等待的状态下,没有起到多进程的作用。
    • 通过信号机制,子进程退出时向父进程发送SIGCHLD信号,父进程调用signal(SIGCHLD,sig_child)去处理SIGCHLD信号,在信号处理函数sig_child()中调用wait进行处理僵尸进程。什么时候得到子进程信号,什么时候进行信号处理,父进程可以继续干其他活,不用去阻塞等待。
      注意: 僵尸进程无法直接使用kill 杀死
  • 相关阅读:
    zookeeper 分布式锁
    mysql linux 安装
    分布式配置中心Apollo
    分布式任务调度平台xxl-job
    Java并发编程笔记之ThreadLocalRandom源码分析
    Java并发编程笔记之ThreadLocal源码分析
    SpringCloud实战10-Sleuth
    SpringCloud实战9-Stream消息驱动
    SpringCloud实战8-Bus消息总线
    SpringCloud实战7-Config分布式配置管理
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/14464953.html
Copyright © 2011-2022 走看看