`
rgcyc
  • 浏览: 2771 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

僵尸进程...

 
阅读更多
转载自http://hi.baidu.com/xuym04/blog 

1.什么是僵尸进程?
In UNIX System terminology, a process that has terminated,but whose

parent has not yet waited for it, is called a zombie.

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,

那么他将变成一个僵尸进程.

但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,

因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,

看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init

来接管他,成为他的父进程,从而保证每个进程都会有一个父进程.

而Init进程会自动wait 其子进程,因此被Init接管的所有进程都不会变成僵尸进程.

    一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,

而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是

使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)




2. 僵尸进程的危害
由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程

到底什么时候结束. 那么不会因为父进程太忙来不及waid子进程,或者说不知道

子进程什么时候结束,而丢失子进程结束时的状态信息呢?

不会.因为UNIX提供了一种机制可以保证 只要父进程想知道子进程结束时的状态信息,

就可以得到. 这种机制就是:

在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等.

但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination

status of the process,运行时间the amount of CPU time taken by the process等),

直到父进程通过wait / waitpid来取时才释放.

但这样就导致了问题,如果你进程不调用wait / waitpid的话, 那么保留的那段信息就不会

释放,其进程号就会一定被占用,但是系统所能使用的进程号是有限的,如果大量的产生

僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程.

此即为僵尸进程的危害,应当避免.

3.僵尸进程的避免
1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起

2. 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,

父进程会收到该信号,可以在handler中调用wait回收


3. 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)

通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,

并不再给父进程发送信号

4. 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一

个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收

还要自己做。 下面就是Stevens给的采用两次folk避免僵尸进程的示例.

Example
Recall our discussion in Section 8.5 about zombie processes. If we want to write a process so that it forks a child but we don't want to wait for the child to complete and we don't want the child to become a zombie until we terminate, the trick is to call fork twice. The program in Figure 8.8 does this.

We call sleep in the second child to ensure that the first child terminates before printing the parent process ID. After a fork, either the parent or the child can continue executing; we never know which will resume execution first. If we didn't put the second child to sleep, and if it resumed execution after the fork before its parent, the parent process ID that it printed would be that of its parent, not process ID 1.

Executing the program in Figure 8.8 gives us

$ ./a.out   $ second child, parent pid = 1


Note that the shell prints its prompt when the original process terminates, which is before the second child prints its parent process ID.



Figure 8.8. Avoid zombie processes by calling fork twice





#include "apue.h"
#include <sys/wait.h>

int
main(void)
...{
     pid_t    pid;

    if ((pid = fork()) < 0) ...{
         err_sys("fork error");
     } else if (pid == 0) ...{     /**//* first child */
        if ((pid = fork()) < 0)
             err_sys("fork error");
        else if (pid > 0)
             exit(0);    /**//* parent from second fork == first child */
        /**//*
          * We're the second child; our parent becomes init as soon
          * as our real parent calls exit() in the statement above.
          * Here's where we'd continue executing, knowing that when
          * we're done, init will reap our status.
         */
         sleep(2);
         printf("second child, parent pid = %d ", getppid());
         exit(0);
     }
   
    if (waitpid(pid, NULL, 0) != pid)  /**//* wait for first child */
         err_sys("waitpid error");

    /**//*
      * We're the parent (the original process); we continue executing,
      * knowing that we're not the parent of the second child.
     */
     exit(0);
}







3、僵尸进程的处理:

     **它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态;
       存在的问题:如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程,系统的性能可能会收到影响。
     ** 如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。

4、子进程结束后为什么要进入僵尸状态?

    * 因为父进程可能要取得子进程的退出状态等信息。

5、僵尸状态是每个子进程比经过的状态吗?
      是的。
     * 任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
      * 如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。

6、如何查看僵尸进程:
     $ ps -el
     其中,有标记为Z的进程就是僵尸进程
     S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;Z代表僵死状态;T代表停止或跟踪状态
分享到:
评论

相关推荐

    java-ssm+vue旅游资源网站实现源码(项目源码-说明文档)

    旅游资源网站的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、景点信息管理、购票信息管理、酒店信息管理、客房类型管理、客房信息管理、客房预订管理、交流论坛、系统管理,用户:首页、个人中心、购票信息管理、客房预订管理、我的收藏管理,前台首页;首页、景点信息、酒店信息、客房信息、交流论坛、红色文化、个人中心、后台管理、客服等功能。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    【高创新】基于粒子群优化算法PSO-Transformer-BiLSTM实现故障识别Matlab实现.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    这里收集那些神奇的产品经理为我们带来的意想不到的产品功能和改版,又称_MDZZ_PM_awesome-pm.zip

    这里收集那些神奇的产品经理为我们带来的意想不到的产品功能和改版,又称_MDZZ_PM_awesome-pm

    AI City track 5数据集-voc-xml格式

    有戴头盔的人、未戴头盔的人、摩托车三种类别,包含736张图像、对应voc格式标签(xml)

    4-3_Business_BLUE_2017_16-CL-20180524MTAX.potx

    微软演示材料

    VB075期刊信息管理系统(SQL).7z

    VB075期刊信息管理系统(SQL).7z

    西门子SMART200程序 PID的控制写法,突破8路,PID直接做成子程序,无密码,直接调用

    西门子SMART200程序 PID的控制写法,突破8路,PID直接做成子程序,无密码,直接调用。

    VBATM校园自动银行系统设计(源代码+论文).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、5资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    基于深度学习的移动物体检测分类源码

    基于YOLOv5的物体检测识别与分类系统,可根据不同的权重模型对不同的物体进行识别,整体分为图片、视频和摄像头三个检测模块,具体检测能力依据模型而定。

    PMSM滑模控制仿真无位置 永磁电机 可提供文档if启动 如果没有收敛,将1e-4搞小一点 e-6或者e-5试下 本次滑模模型

    PMSM滑模控制仿真无位置 永磁电机 可提供文档if启动 如果没有收敛,将1e-4搞小一点 e-6或者e-5试下 本次滑模模型文档包括: 1 simulink界面调整,由于使用这个仿真的时候很可能会出现因为软件环境不同导致无法使用, 或者导致的波形错误,特写了一个关于参数界面的设置,按照那个设置,结合主框图,能够 避免使用出问题。 2 波形记录,将转速波形,转矩波形,位置估计+实际位置波形,三项定子电流波形, 给定转速(蓝绿色)+实际转速(红色)+估算转速(蓝色) 3 另外仿真程序内部,里面标注了各个功能模块的位置及部分原理。 4 lunwen的话推荐看 13 16 开头的lunwen,其他的可以拓展性的看。

    60-AspNet8-jQery-Datatables-5-Code.zip

    构建使用jQuery组件DataTables.net的Asp.Net 8 MVC应用程序的实用指南。

    皮层微创脑机接口传感器的发展现状与未来趋势

    内容概要:文章探讨了皮层微创脑机接口(BCI)传感器作为神经电信号采集与调控装置,在临床上的应用现状与科研进展,并分析了传感器在未来可能的发展趋势和技术革新点。介绍了现有商业化及实验级别的电极器材,并讨论了其如何进一步向着高通量、软界面与更持久的生命设计演化。 适合人群:神经工程专业科研工作者,尤其是关注BCI传感器领域的研究生、教师和其他相关专业的科研人士。 使用场景及目标:旨在增进从业者对于皮层微创BCI的理解,特别是传感器的设计、制作工艺和未来可能的方向;有助于科研与产品研发。 其他说明:文章还强调了技术创新在材料与设计理念层面的重要性,为BCI传感器在实际医疗与神经科研中发挥作用打下了坚实的基础。

    基于python实现的社会力模型仿真+源码+文档(毕业设计&课程设计&项目开发)

    基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~

    2024.9.18 作业

    2024.9.18 作业

    Python环境一键安装脚本,适用于Linux_lxspacepy.zip

    Python环境一键安装脚本,适用于Linux_lxspacepy

    昕一 - 一样的月光 [qmms2].mp3

    昕一 - 一样的月光 [qmms2].mp3

    【高创新】基于凌日优化算法TSOA-Transformer-BiLSTM实现故障识别Matlab实现.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    http服务器的实现.7z

    http服务器的实现.7z

    java-ssm+vue高校奖学金管理系统实现源码(项目源码-说明文档)

    高校奖学金管理系统的主要实现功能包括:管理员:首页、个人中心、学生管理、辅导员管理、教务处管理、奖学金类型管理、奖学金信息管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理。学生:首页、个人中心、奖学金信息管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理,辅导员;首页、个人中心、学生管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理,教务处;首页、个人中心、学生管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    Palo Alto Networks PA-220 管理员指导手册

    Palo Alto Networks PA-220 管理员指导手册

Global site tag (gtag.js) - Google Analytics