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 杀死
  • 相关阅读:
    《页面优化》-- 一个大话题,也是一个面试比较老俗的问题
    Single-SPA 前端微服务化 动态路由多系统合并
    浏览器的DNS缓存查看和清除
    es6 的类 class
    数据驱动表格| 根据json数据,自动生成合并式table
    隐式调用 以及使用技巧
    柯里化currying + 隐式调用 = 一个有名的add面试题
    工作笔记
    php升级版本
    git使用
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/14464953.html
Copyright © 2011-2022 走看看