(转载)Linux 僵尸进程与孤儿进程
2013-05-01 22:30
495 查看
[b](1)zombie进程(僵尸进程):[/b]
任何一个进程,当其运行结束(exit)之后,其使用的所有资源和内存空间都会释放,以供其他进程使用;但其在OS内核的process table中仍旧保留一条记录,包含该进程的process ID,退出状态exit status,运行时间等信息。这些信息是方便该进程的父进程随时获取它的exit status(即子进程结束后为什么要进入zombie状态)。
Unix/Unix-like系统中,把已经执行结束但process table中记录未被清除的进程称为zombie进程。任何进程都会进入该状态。zombie只有在父进程调用wait(system call)的时候才会被清除。
子进程在运行结束的时候会发送一个SIGCHLD信号给父进程,因此一般通过在父进程的代码中为该信号指定一个handler,并在handler中执行wait系统调用,即可立即清除子进程的zombie信息。
假如父进程没有或未能清除子进程的zombie信息自己运行结束,则该子进程会被init(process ID 1)收养,该进程会每隔一段时间自动调用wait清除其所有子进程的zombie信息。因此zombie进程早晚都会被清除掉。
[b](2)zombie的危害:[/b]
zombie状态的进程不会占据任何资源和内存空间,唯一的危害是在process table中占据一行,且占据一个process ID,如果进程过多可能系统没有过多的process ID来生成新的进程。
由上面可知zombie进程早晚都会被清除掉,因此常见的zombie problem是指父进程运行时间较长,且父进程产生大量子进程,那么可能在较长一段时间内存在大量zombie进程,出现process ID不够用的问题。
什么情况下容易产生过多的zombie进程?常见的产生zombie进程的情况有:
(a)父进程中没有处理SIGCHLD的handler,且其运行时间较长(一个循环)产生子进程过多,这样一定时间内zombie进程就过多
最常见的是socket编程中,如果对每个新的client进程都生成一个子进程专门处理,切记在父进程中添加SIGCHLD的handler(其中调用wait),否则处理client过多之后会产生大量的zombie进程
(b)fork两次,当父进程fork一个子进程,然后子进程又fork一个孙进程的情况注意。
查看进程的zombie状态:
kill等命令只可以杀死正在运行的进程,并不能清除zombie进程的zombie信息;
通过ps aux命令可以查看哪些进程处在zombie状态:STAT列为Z的。另外S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;T代表停止或跟踪状态。
orphan进程(孤儿进程)
注意:zombie process和orphan process的区别。orphan进程指正在运行的进程其父进程died,orphan进程不是zombie进程。当一个进程变为orphan进程之后,init进程(process ID 1)会收养它称为其新的父进程。
相关文章推荐
- Linux中孤儿进程和僵尸进程的解释
- Linux产生僵尸进程和孤儿进程及区别
- .linux进程知识 程序存储、crontab、fork与vfork、exec、_exit()、wait()与waitpid()、孤儿和僵尸 文件读写 文件锁、select、poll
- !!!!Linux系统开发 系列 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程
- linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程
- Linux进程之僵尸进程和孤儿进程简析
- Linux-僵尸进程,孤儿进程
- Linux-孤儿进程与僵尸进程[总结]
- Linux中的僵尸进程与孤儿进程
- Linux _孤儿进程和僵尸进程 浅见
- Linux中僵尸进程和孤儿进程详解
- Linux 僵尸进程 孤儿进程
- 转载有关孤儿进程和僵尸进程
- Linux之僵尸进程和孤儿进程【总结】
- 【Linux应用开发】之孤儿进程和僵尸进程
- 【Linux编程】僵尸进程和孤儿进程
- linux进程知识 程序存储、crontab、fork与vfork、exec、_exit()、wait()与waitpid()、孤儿和僵尸
- Linux中的 僵尸进程 和 孤儿进程
- Linux进程理解与实践(二)僵尸&孤儿进程 和文件共享