• Unix/Linux僵尸进程


    1. 僵尸进程的产生

      一个进程调用exit命令结束自己生命的时候,其实它并没有真正的被销毁,而是留下一个称为“僵尸进程”的数据结构。这时它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置(它的内核栈还驻留在内存中),记载该进程的退出状态等有用的信息供其它进程收集。进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD信号,Linux默认是忽略该信号的,父进程可以显示安装该信号,在信号处理函数中调用wait或waitpid函数等待子进程结束并将其彻底清除。如果父进程没有这么做的话,子进程就沦为僵尸进程了。但是在父进程死掉后,它的所有进程都会过继给init进程,init进程会周期性的去调用wait系统调用来清除它的僵尸孩子。

     

    2. 僵尸进程的危害

      少数的僵尸进程并不会对系统的性能有什么影响,但是由于Linux系统对运行的进程数量是有限制的,所以如果产生的僵尸进程过多,占用了可用的进程号,这将会导致新的进程无法生成。

     

    3. 僵尸进程的避免

    (1)创建进程的时候调用两次fork,而且使紧跟的子进程直接退出,这样孙子进程成为孤儿进程,init进程将负责清除这个孤儿进程。

    (2)在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN,这样内核在子进程结束时不会产生僵尸进程。在SVR4中,如果调用signal或sigset将SIGCHLD的配置设置为忽略,也不会产生僵尸进程。

    (3)调用wait或waitpid等待子进程结束,收集僵尸进程留下的信息,同时使僵尸进程彻底消失。

    注:不能使用 kill 后接 SIGKILL 信号这样的命令像杀死普通进程一样杀死僵尸进程,因为僵尸进程是已经死掉的进程,它不能再接收任何信号。

     

  • 相关阅读:
    什么是 MyBatis?
    @RequestMapping 注解用在类上面有什么作用?
    如果你也用过 struts2.简单介绍下 springMVC 和 struts2 的区别有哪些?
    SpringMVC 流程?
    SpringMVC 工作原理?
    什么是 SpringMvc?
    依赖注入的三种实现方式?
    什么是IOC
    spring的作用
    什么是spring框架?
  • 原文地址:https://www.cnblogs.com/wujuntian/p/4785050.html
Copyright © 2020-2023  润新知