- 论坛徽章:
- 0
|
不敢苟同的意见,僵死进程在某些应用中必须很好的解决。
我们就是在进程池中没处理好子进程的退出状态,而使整个系统不能工作。
一个进程回收不到就会占用一个我们的一个进程表,也就是占用一个进程池的位置,当僵死进程达到一定限度后,程序就会不再FORK新进程,而这些僵死进程已经退出,无法处理请求,所以整个系统不在工作。
以前我们的程序就是按版主所说的方式进行循环接收,但根本无法避免大批量并发快速请求。
事实证明我所采用的让SIGCHLD进行排队回收机制可以很好的处理了这个问题。
我觉得这个问题要看应用在什么系统中,以前的程序我也是循环接收,不是太多的并发请求也是没有问题的,所以也没怀疑过这个办法。
代码我就不贴了,我只说说原理吧:
主进程创建一个队列,我用的是一个线程循环接收队列的信息,没有的时候阻塞。waitpid的时候也是采用阻塞的方式,防止子进程退出的时间大于父进程接到信号的时间(队列结构包含一个进程号)
waitpid(队列中的PID号, &status, 0);
子进程退出之前要往队列发送自已的PID,然后才退出。
[ 本帖最后由 linternt 于 2006-9-18 10:59 编辑 ] |
|