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

【Linux世界的僵尸】相关推荐

  1. Unix / Linux世界里的4-2-1

    Unix / Linux世界里的4-2-1 在Unix / Linux世界里,4代表可读( r ),2代表可写入 ( w ),1代表可执行 ( x ) 如果拥有7 = 4+2+1 的权限,即代表这个人 ...

  2. linux系统日志_第十二章:走进Linux世界——系统日志管理,日志轮转。

    1.关心问题:哪类程序---> 产生的什么日志----> 放到什么地方 2.处理日志的进程 (1) 第一类: rsyslogd: 系统专职日志程序. 处理绝大部分日志记录, 系统操作有关的 ...

  3. linux结束进程_生人勿近之Linux里养僵尸

    Linux里养僵尸是怎么回事呢?Linux相信大家都很熟悉,但是Linux里养僵尸是怎么回事呢,下面就让小编带大家一起了解吧. - 1 - 上一篇挖了个 SIGHUP 的坑,这篇试着填一下. 之前在& ...

  4. linux 挂载硬盘_第七章:走进Linux世界——储存管理1

    一.基本分区 1)磁盘介绍 名词:磁盘/硬盘/disk是同一个东东,不同于内存的是容量比较大. 类型:机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓 ...

  5. 计算机自爆命令,《我的世界》僵尸自爆指令一览 简单实用!

    原标题:<我的世界>僵尸自爆指令一览 简单实用! 在<我的世界>游戏中,僵尸是非常烦人的怪物,其实要对付它们也很简单,就是让僵尸自爆,那么各位玩家知道自爆指令是什么吗?如果你还 ...

  6. linux crontab 每5分钟执行一次_第十一章:走进Linux世界——源码包管理and任务计划。...

    一.文件管理 (1)概述 Source Code 源代码经过GCC.C++编译环境编译才能运行 可以设定个人设置,开关功能 (2)源码包管理 获取源码包--官网下载到真机,然后 rz 命令上传到虚拟机 ...

  7. linux下的僵尸进程 - Zombie

    在linux中你可能进程听到有僵尸进程,那么究竟什么是僵尸进程,他又是怎样产生的呢?下面我们通过1个例子来说明一下. 我们知道退出一个进程用系统调用exit, 但是这并不意味着该进程马上就消失了,事实 ...

  8. linux如何kill僵尸进程,linux 如何杀死僵尸进程——原理及操作

    linux 如何杀死僵尸进程 Posted on 2011 年 9 月 20 日 by Open-Source In UNIX System terminology, a process that h ...

  9. linux世界里类似source insight的工具(zz)-如梦初醒-中国教育人博客

    linux世界里类似source insight的工具(zz)-如梦初醒-中国教育人博客 linux世界里类似source insight的工具(zz)-如梦初醒-中国教育人博客 sourcenav ...

最新文章

  1. Tempdb数据库详细介绍
  2. python自建包的根目录可以直接import的方法
  3. BZOJ-3190-赛车-JLOI2013-暴力枚举
  4. jmeter之ip欺骗
  5. android compile使用方法,自己创建一个android studio在线依赖compile
  6. python手势识别_Python|使用opencv进行简单的手势检测
  7. vsftpd 的配置项目
  8. 37 FI配置-财务会计-固定资产-组织结构-复制参考折旧表/折旧范围表
  9. var _ 接口 = 结构体{}
  10. Delphi 2007 先睹为快
  11. 伍斯特理工学院计算机专业,伍斯特理工学院计算机科学专业
  12. SpringBoot静态资源处理(九)
  13. python编写水仙花数(超完全数字不变数、自恋数、自幂数、阿姆斯特朗数)
  14. 你的支付授权失败。请核对你的信息并重试,或尝试其他支付方式。 解决方案
  15. html表格上方的标题怎么相对表格居中
  16. Win10 win11 同一个Wifi网络(其实不是) 网络共享找不到对方主机办法
  17. SecureCRT的设置
  18. Python爬虫任务4
  19. [Android]如何做一个崩溃率少于千分之三噶应用app(17)-组件化SDK
  20. fat32转ntfs解决大于4G文件不能保存问题

热门文章

  1. js实现点击空白部分隐藏div
  2. 努力做一个灵魂画师、Affinity Designer使用(一)
  3. 计算机的幼儿教育,计算机科学在幼儿教育中的探讨
  4. 教懂你什么是 “ 流量劫持 ”
  5. 什么是“常用联系人”,如何添加\删除联系人?
  6. c语言常见的排序方法
  7. oracle biee 修改密码,Oracle BIEE
  8. 数据库设计方法论 - 继承
  9. OpenSCA用开源的方式做开源风险治理:Why? What? How?
  10. 面试题不会做,到底应不应该上网查?