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 信号这样的命令像杀死普通进程一样杀死僵尸进程,因为僵尸进程是已经死掉的进程,它不能再接收任何信号。

时间: 2024-11-02 11:43:03

Unix/Linux僵尸进程的相关文章

Linux 僵尸进程查杀

僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.通过ps命令查看其带有defunct的标志.僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot). 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程.因为每个进程结束的时候,系统都会扫描

【笔记整理】unix/linux的进程管理(一)

Unix/Linux 下的进程管理 1. 进程与程序 ~~~~~~~~~~~~~ 1) 进程就是运行中的程序.一个运行着的程序, 可能有多个进程.进程在操作系统中执行特定的任务. 2) 程序是存储在磁盘上, 包含可执行机器指令和数据的静态实体. 进程或者任务是处于活动状态的计算机程序. 2. 进程的分类 ~~~~~~~~~~~~~ 1) 进程一般分为交互进程.批处理进程和守护进程三类. 2) 守护进程总是活跃的,一般是后台运行. 守护进程一般是由系统在开机时通过脚本自动激活启动, 或者由超级用户

1.5 常用UNIX/Linux命令 -进程控制类命令

进程控制类命令 ?查看系统中的进程命令:ps top ?控制系统中的进程命令:kill killall nice renice ?进程后台运行命令 ?进程的挂起和恢复 程序和进程的区别: 程序是一个包含可执行代码的文件,它放在磁盘等介质上. 当程序被操作系统装载到内存并分配给它一定资源后,此时可称为进程. 程序是静态概念,进程是动态概念. Unix/Linux中的进程状态 1.查看系统中的进程命令之ps命令: 功能:ps命令是用来显示系统瞬间的进程信息,它可以显示出在用户输入ps命令时系统的进程

linux僵尸进程

由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束. 那么会不会因为父进程太忙来不及wait子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢? 不会.因为UNIX提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到.这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等. 但是仍然为其保留一定的信息(包括进程号.退出状态.运行时间等).直到父进程通过wait / waitpid来

linux僵尸进程产生的原因以及如何避免产生僵尸进程

给 进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存 使用量等等).如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程).继承这些子进程的 init进程将清理它们(init进程将wait它们,从而去除僵尸状态). 但通常情况下,我们是不愿意留存僵尸进程的,它们占用内核中的空间,最终可能导致我们耗尽进程资源.那么为什么会产生僵尸进程以及如何避免产

Linux 僵尸进程 孤儿进程

今天有人问到了僵尸进程 和孤儿进程,以前遇到过,但是没有太注意,这里mark 一下 僵尸进程 :进程 fork 出来子进程,但是 父进程没有调用wait 或waitpid 获取子进程的状态信息,子进程的进程描述符任然保存在系统中 查找僵尸进程 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 孤儿进程 :父进程退出,子进程任然在继续,孤儿进程将被init( 1) 收养,并由Init完成对他们的信息采集 僵尸进程的危害:进程退出时候,内核将释放所有资源,包括打

笔记整理--Linux守护进程

Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:27) Linux多进程开发(三)进程创建之守护进程的学习 2013-07-04 17:25:35 标签:守护进程 daemon Linux多进程开发 系统编程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liam2199.bl

Unix/Linux系统中僵尸进程是如何产生的?有什么危害?如何避免?

如题 Unix/Linux系统中僵尸进程是如何产生的?有什么危害?如何避免? 一个进程在调用exit命令结束自己的生命的时候,其实他并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,他的作用是使进程退出,但是也仅仅限于一个正常的进程变成了一个僵尸进程,并不能完全将其销毁).在linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态信息供其他进程收集

Linux中的僵尸进程和孤儿进程

在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程.        操作系统内核以进程标识符(Process Identifier,即PID)来识别进程.进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)