僵死进程
来源:互联网 发布:天猫和淘宝的盈利模式 编辑:程序博客网 时间:2024/05/16 16:31
僵死进程:
定义:
产生原因:
子进程先于父进程结束,父进程没有获取子进程的退出码
一、僵死进程的产生
在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等,但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等), 直到父进程通过wait/waitpid来取时才释放。此时该进程处于僵死状态,该进程成为僵死进程(Zombie Process)。 这保证了父进程可以获取到子进程结束时的状态信息。
在Linux进程的状态中,僵死进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵死进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵死状态,如果这时父进程结束了,僵死的子进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵死进程,它产生的所有僵死进程也跟着消失(每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管他,成为他的父进程)。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵死状态,这就是为什么系统中有时会有很多的僵死进程。怎么查看僵死进程,利用命令ps,可以看到有标记为Z的进程就是僵死进程
二、僵死进程的危害
如果父进程不调用wait/waitpid的话, 那么保留的那段信息就不会释放,其进程号会一定被占用,但是系统所能使用的进程号是有限的,如果产生了大量的僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
三、僵死进程的避免
1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起
2、如果父进程很忙,那么可以用signal函数为SIGCHLD安装信号处理函数。子进程结束后,父进程会收到该信号,可以在信号处理函数中调用wait回收 。
3、如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程
发送信号。
或用sigaction函数为SIGCHLD设置SA_NOCLDWAIT,这样子进程结束后,就不会进入僵死状态
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sa.sa_flags = SA_NOCLDWAIT;
sigemptyset(&sa.sa_mask);
sigaction(SIGCHLD, &sa, NULL);
4、fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要父进程来做。
eg:
如果用 ./jiangsi &命令运行上面的程序,然后在子进程结束后父进程结束前使用ps命令,就会看到僵死进程产生: main <defunct>.
解决僵死进程
1、程序中显示的调用signal(SIGCHLD, SIG_IGN)来忽略SIGCHLD信号,这样子进程结束后,由内核来wait和释放资源。
2、对子进程的退出捕获它们的退出信号SIGCHLD。这样就可以释放它们的资源。父进程一般没工夫在那里守着,等着子进程的退出,所以,一般使用信号的方式来处理,在收到SIGCHLD信号的时候,在信号处理函数中调用(wait)waitpid()操作来释放他们的资源。
如果此时父进程异常终止,子进程将自动把PID为1的进程(init)作为自己的父进程,子进程就不是一个僵死进程了。
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 僵死进程
- 孤儿进程、僵死进程
- 出现僵死进程解决方法
- 如何查看僵死进程
- 如何避免僵死进程。
- 僵死进程的问题
- Dart语言语法特性简介(1)
- ES6 Map类型
- 超实数及其标准部分
- 前端框架技术--jQuery基础应用
- HDU 4911 Inversion【归并排序||线段树】
- 僵死进程
- java网络编程之Netty实战数据通信(七)
- 对vector/string执行insert/erase操作后迭代器的情况说明
- matplotlib命令与格式:图例legend语法及设置
- c语言中部分字符串操作函数
- Mybatis Collection查询集合只出现一条数据
- 基于FullCalendar插件的简单个人日程安排系统(1)
- ZigZag Conversion
- 欢迎使用CSDN-markdown编辑器