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 杀死
  • 相关阅读:
    Week03-面向对象入门
    Week02-Java基本语法与类库
    201621123056 《Java程序设计》第1周学习总结
    2.2确定一个字符是否在指定范围内
    2.1确定一个char包含何种字符
    1.自己写一个计算器demo
    1.23 确定一个Decimal或Double的整数部分
    1.5 测试奇偶性
    1.2度转化为弧度 1.3弧度转换为度
    1.1确定分数与浮点数值之间的近似相等性。
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/14464953.html
Copyright © 2011-2022 走看看