免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5984 | 回复: 20
打印 上一主题 下一主题

C,多个进程同时运行,当一个进程可能死循还的情况下,怎么办 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-23 15:58 |只看该作者 |倒序浏览
我用execlp同时开了三个进程A,B,C,可是当A,B,C执行一半时候都有可能会死循环,而死循环的时候,其它几个进程就一直等待状态了,有没有办法,就是让每个进程自动执行每一段时间,就让出资源,给其它进程执行?这样的话就算是死循还也不会使其它进程无法执行了.等待高手回答.谢过了先.

论坛徽章:
0
2 [报告]
发表于 2007-04-23 16:06 |只看该作者
top看那个进程占的CPU多,killall -9

论坛徽章:
0
3 [报告]
发表于 2007-04-23 16:53 |只看该作者
大哥,我说的是编程里啊,而且我也不能把那个进程杀死.

论坛徽章:
0
4 [报告]
发表于 2007-04-24 08:36 |只看该作者
原帖由 jist12321 于 2007-4-23 15:58 发表
我用execlp同时开了三个进程A,B,C,可是当A,B,C执行一半时候都有可能会死循环,而死循环的时候,其它几个进程就一直等待状态了,有没有办法,就是让每个进程自动执行每一段时间,就让出资源,给其它进程执行?这样的话就算 ...

还要再写一个OS到你的APP里?

论坛徽章:
0
5 [报告]
发表于 2007-04-24 08:53 |只看该作者
问题的关键是你为什么允许这些占用资源的进程进入死循环而不先释放资源呢。

论坛徽章:
0
6 [报告]
发表于 2007-04-24 09:05 |只看该作者
你需要为你的进程创建锁机制.

论坛徽章:
0
7 [报告]
发表于 2007-04-24 10:10 |只看该作者
原帖由 zyzgcy 于 2007-4-24 09:05 发表
你需要为你的进程创建锁机制.

对不起,我是刚碰这方面的新手,能说得清楚一定吗,还有如果进程要死循环的话,有没有进程的挂起这样的函数?

论坛徽章:
0
8 [报告]
发表于 2007-04-24 10:26 |只看该作者
原帖由 jist12321 于 2007-4-23 15:58 发表
我用execlp同时开了三个进程A,B,C,可是当A,B,C执行一半时候都有可能会死循环,而死循环的时候,其它几个进程就一直等待状态了,有没有办法,就是让每个进程自动执行每一段时间,就让出资源,给其它进程执行?这样的话就算 ...


这是不可能的,你的进程跑在用户态,即使死循环也会被内核调度出去。并且死循环是cpu消耗型进程,其优先级会越来越低,最后只能得到5ms的时间片(2.6内核)。所以其中一个进程死循环并不会干扰其它进程的执行。
除非是你死循环的进程持有了临界资源,而其它进程又会申请这些临界资源,才会出现你说的情况。这种情况你想主动让出cpu,可以用sched_yield()

论坛徽章:
0
9 [报告]
发表于 2007-04-24 13:13 |只看该作者
zx_wing,
这个听起来很有意思,换句话说,如果一个进程死循环了,内核(2.6)能够检测出来,并降低其优先级,最终让其只能得到5ms的时间片。能不能具体说说是怎么实现的,我实在觉得很新鲜,内核是如何分别一个进程是在做你所谓的“cpu消耗型”工作,还是在做它应该做的工作,比如便利一个巨大的单链表?

没有question你的答案的意思,只是想多了解一些对我来说新鲜的东西,谢谢!

另外,我所知道的解决这类死循环进程的方法是,启动一个独立的进程,暂且叫它“watchdog”进程, 这样记起来方便一些。watchdog会以如下的方式监控每一个你让他监控的所有进程。
1. 对每一个进程做heartbeat,具体来说就是给每一个进程定期的发消息(request),进程受到来自watchdog的消息时会一个Response。
2. 在watchdog生成一份对每一个进程“生存特性”(暂且这么命名吧,没想到更好的)的表格,如果 watchdog给进程A发送了100个request,并且收到了多于90个的来自A的response,那么标准该进程为“healthy”,如果只受到了小于60~80个,标记为“warning”,小于50个,watchdog会杀死该进程。

解释:
这个方法能够鉴别出某个进程陷于死循环的原理是:
如果进程没有死循环,那么进程就有机会去check 自己的 demand queue(watchdog把发给进程的request放在这个queue上,参见IPC),并处理每一个queue上的消息,并把response返回给watchdog。反之,如果进程处于死循环,那么这个queue上的消息就会越来越长,watchdog没有收到的response的数目也会随之增大,那么watchdog就能够了解每个进程的“健康程度”


完毕。

原帖由 zx_wing 于 2007-4-24 10:26 发表


这是不可能的,你的进程跑在用户态,即使死循环也会被内核调度出去。并且死循环是cpu消耗型进程,其优先级会越来越低,最后只能得到5ms的时间片(2.6内核)。所以其中一个进程死循环并不会干扰其它进程的执行 ...

论坛徽章:
0
10 [报告]
发表于 2007-04-24 14:55 |只看该作者
死循环对内核是没有意义的吧,在内核看来,应该就是一个执行的进程而已,因为内核的进程调度策略,到了一定时间,该进程就应该不能使用CPU资源,而是其他进程来使用CPU。而优先级计算也是有一定策略的,那可能该进程的优先级就会降低。
这是我的理解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP