`
gaojingsong
  • 浏览: 1197308 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【Linux世界的僵尸】

阅读更多

1、Linux中僵尸定义

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)他, 那么他将变成一个僵尸进程.  在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。

 

 

2、僵尸进程如何产生的?

如果一个进程在其终止的时候,自己就回收所有分配给它的资源,系统就不会产生所谓的僵尸进程了。那么我们说一个进程终止之后,还保留哪些信息?为什么终止之后还需要保留这些信息呢?

 

一个进程终止的方法很多,进程终止后有些信息对于父进程和内核还是很有用的,例如进程的ID号、进程的退出状态、进程运行的CPU时间等。因此进程在终止时,回收所有内核分配给它的内存、关闭它打开的所有文件等等,但是还会保留以上极少的信息,以供父进程使用。父进程可以使用 wait/waitpid 等系统调用来为子进程收拾,做一些收尾工作。

 

因此,一个僵尸进程产生的过程是:父进程调用fork创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD 信号,父进程此时应该调用 wait() 系统调用来获取子进程的退出状态以及其它的信息。在 wait 调用之后,僵尸进程就完全从内存中移除。因此一个僵尸存在于其终止到父进程调用 wait 等函数这个时间的间隙,一般很快就消失,但如果编程不合理,父进程从不调用 wait 等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。

 

 

3、危害

保留的那段信息就不会 释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生 僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害。

 

4、 原理分析:

每个Unix进程在进程表里都有一个进入点(entry),核心进程执 行该进程时使用到的一切信息都存储在进入点。当用 ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个 进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。

 

子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。那么会不会因为父进程太忙来不及 wait 子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢?不会。因为UNIX提供了一种机制可以保证,只要父进程想知道子进程结束时的 状态信息,就可以得到。这种机制就是:当子进程走完了自己的生命周期后,它会执行exit()系统调用,内核释放该进程所有的资源,包括打开的文件,占用 的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出码exit code,退出状态the terminationstatus of the process,运行时间the amount of CPU time taken by the process等),这些数据会一直保留到系统将它传递给它的父进程为止,直到父进程通过wait / waitpid来取时才释放。

 

5、解决方法:

(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。

     执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler。在子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。

(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号

(4)fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。

 

 

6、如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程?

 

#ps -ef | grep defunct

或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思。

另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程。

Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   0 zombie

 

top命令中也统计了僵尸进程。或者使用下面的命令:

ps -ef | grep defunct | grep -v grep | wc -l

0
0
分享到:
评论

相关推荐

    Linux 的学习材料

    理解进程状态(如运行、睡眠、停止、僵尸)和进程间通信(IPC)概念也是必不可少的。 存储管理涉及文件系统和磁盘管理。Linux支持多种文件系统,如EXT4、XFS、FAT32和NTFS等。理解如何使用`df`和`du`检查磁盘空间,...

    Linux故障排除宝典教程.rar

    《Linux故障排除宝典教程》是一份全面深入的指南,专为解决Linux系统中的各种问题而设计。...无论你是初学者还是经验丰富的专业人士,这个教程都将提供宝贵的故障排除经验和技巧,帮助你在Linux世界中游刃有余。

    linux操作系统进程管理 课程设计

    总之,这个“Linux操作系统进程管理”课程设计将引导你进入Linux内核的世界,让你在实践中学习和掌握进程管理的精髓。这是一个挑战,但通过努力,你将收获丰富的知识和技能,为你的IT职业生涯添砖加瓦。

    Linux 程序设计入门

    在Linux系统中,程序设计是一项基础且至关重要的技能,它为开发者提供了强大的工具和灵活性。Linux作为开源操作系统,其程序设计涉及到的知识点广泛且深入,包括...继续努力,不断探索,你将在Linux世界中游刃有余。

    zps:一个用于在GNULinux上列出和获取僵尸进程的小实用程序

    zps一个用于在GNU / Linux上列出和获取僵尸进程的小实用程序。 在Unix和类似Unix的计算机操作系统上,或已解散进程是已完成执行(通过系统调用)但在进程表中仍具有条目的进程。 对于子进程会发生这种情况,在子进程...

    linux 高级教程(内核解释)

    在Linux的世界里,内核是操作系统的核心,它负责管理硬件资源、提供系统调用接口、调度进程、管理内存、处理中断和异常等关键任务。通过学习Linux内核,我们可以更深入地理解操作系统是如何工作的,这对于系统管理员...

    Linux编程白皮书

    《Linux编程白皮书》是一份详尽的教程,涵盖了从Linux系统的基础到高级主题的广泛内容。...无论你是初学者还是经验丰富的开发者,这份《Linux编程白皮书》都是一个宝贵的资源,可以帮助你在Linux世界中不断探索和进步。

    Linux机密培训文件PPT

    Linux是世界上最广泛使用的开源操作系统之一,它为各种规模的企业和个人提供了强大的服务器、开发环境和桌面体验。本"Linux机密培训文件PPT"涵盖了Linux系统的核心概念、管理和维护技巧,旨在帮助用户深入理解和掌握...

    Linux私房菜_基础学习篇全2

    这本书深入浅出地讲解了Linux的世界,帮助读者建立起对这个强大开源操作系统的理解。下面我们将详细探讨其中的知识点。 一、Linux简介 Linux是一种自由和开放源码的类UNIX操作系统,它基于Unix的设计理念,具有高度...

    打僵尸小遊戲混沌惡顯現 v0.4.rar

    Unity引擎是全球广泛应用的游戏开发平台,支持跨平台开发,包括Windows、Mac、Linux、Android以及iOS等多个操作系统。它提供了强大的3D和2D图形渲染能力,以及易用的脚本系统,使得开发者能够快速构建游戏场景和交互...

    计算机病毒与防护:Linux进程管理.pptx

    `STAT`字段提供了进程的状态,如R(正在运行)、D(不可中断)、S(睡眠)、T(停止)和Z(僵尸)等。`START`和`TIME`字段则显示进程的启动时间和累计CPU时间,`COMMAND`列显示了正在执行的命令。 Linux还支持作业...

    Linux 45 道面试题及答案.docx

    Linux是世界上最广泛使用的开源操作系统之一,对于IT专业人士来说,熟悉Linux是至关重要的。这里我们将深入探讨45道常见的Linux面试题及其答案,涵盖基础概念、文件管理、进程控制、权限设置等多个方面。 1. **绝对...

    mod_limitipconn和bw_mod实现Apache限速-linux-win32

    Apache是世界上最流行的Web服务器软件,它提供了丰富的功能和模块来满足各种需求。在高流量的网站或服务中,为了防止DDoS(分布式拒绝服务)攻击和优化服务器性能,限速功能变得至关重要。本文将深入探讨如何使用`...

    newZombies:僵尸猎人游戏

    Java游戏开发中,开发者可能使用Box2D或libGDX内置的物理引擎来实现这些效果,确保炸弹的运动轨迹符合真实世界的物理规律。 3. **碰撞检测**: 在newZombies中,僵尸与炸弹、玩家之间的碰撞检测至关重要。开发者可能...

    可怕的万圣节 Linux 命令

    在Linux世界中,有一些命令因其名字或功能而显得有些诡异,仿佛在万圣节的氛围中增添了一丝神秘色彩。让我们深入了解一下这些“可怕”的Linux命令。 首先,`crypt`命令,虽然名字听起来像是用来藏匿秘密的地方,...

    大灾变-DDA:大灾变-即将来临的黑暗日子。 在世界末日之后的回合制生存游戏

    《大地的裂变:黑暗的日子》是一款基于回合制的生存游戏,设置于后世界末日。 尽管有人将其描述为“僵尸游戏”,但《大灾变》的意义远不止于此。 努力在苛刻,持久,程序产生的世界中生存。 搜寻死去的文明遗留下的...

    The-Sprawl:僵尸生存策略

    《The Sprawl: 僵尸生存策略》是一款基于回合制的生存策略游戏,它将玩家带入一个充满僵尸的世界,挑战着你的微观管理能力。在这个游戏中,你需要智慧地分配资源,建立防御,确保幸存者的安全,同时探索并拓展你的...

    操作系统课程设计

    - **Linux的发展历程**:Linus Torvalds最初编写了Linux,并通过网络公开源代码,邀请世界各地的开发者共同参与开发。在大家的努力下,Linux迅速发展并不断完善。目前Linux内核已更新至2.5.X版本,并持续快速迭代。 ...

    剑齿虎:僵尸ORPG引擎

    【剑齿虎:僵尸ORPG引擎】是一款由Steven Fortune开发的独特游戏引擎,专注于结合角色扮演游戏(RPG)和射击...通过深入学习和实践,开发者可以充分利用剑齿虎引擎提供的各种工具和功能,打造属于自己的僵尸ORPG世界。

Global site tag (gtag.js) - Google Analytics