免费注册 查看新帖 |

Chinaunix

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

system调用引出的问题,貌似是个比较NB的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-09 12:59 |只看该作者 |倒序浏览
我有一个较大型的程序,运行在mipsel的嵌入式平台上,程序开始运行system调用是成功的,启动后调用system会失败,进行如下分析:

1.跟踪:
system()
         -> fork(): Cannot allocate memory【自己实现system发现fork调用失败】
         -> clone(child_stack=0, flags=0x100012)    = -1 ENOMEM (Cannot allocate memory) (errno 12)【strace】
以上均显示错误确为ENOMEM(ENOMEM fork failed to allocate the necessary kernel structures because memory is tight.)
应该是内核空间不足!可malloc的内存很充足。

2.测试
在该程序运行的同时运行一个小进程,system调用是成功的。

综上分析为:单独进程的内核内存空间有限制

·尝试过
~ 修改overcommit_ratio -- NO
~ 增加cmdline中的mem参数 -- 略有改善而已
~ 增大ulimt相关限制 -- 情况更差

另:内核为linux 2.6.18,工具链为uClibc-nptl-0.9.29-20070423。

C版藏龙卧虎,向大家请教,N人给个提示~~

论坛徽章:
0
2 [报告]
发表于 2010-06-09 14:00 |只看该作者
先在你的嵌入式平台上写一个最简单的fork或者system调用的程序测试一下效果。

论坛徽章:
0
3 [报告]
发表于 2010-06-09 15:11 |只看该作者
就是内存不足了.
malloc空间很多不代表真有空间。
你malloc后调用memset(mm, 0, sizof)看有无空间?是否也是没?

论坛徽章:
0
4 [报告]
发表于 2010-06-09 22:34 |只看该作者
回复 3# 思一克


   /proc/overcommit_memory=2,malloc内存可以肯定是有的。我确认过。

论坛徽章:
0
5 [报告]
发表于 2010-06-09 22:35 |只看该作者
回复 2# 没本


    我的帖子有说,运行应用程序的同时,再运行一个小进程做system调用是正常的。

论坛徽章:
0
6 [报告]
发表于 2010-06-09 22:36 |只看该作者
感谢楼上两位关注!继续分析中...

论坛徽章:
0
7 [报告]
发表于 2010-06-09 22:50 |只看该作者
那就是你的程序太大了,比如你的程序占了100MB的内存,还剩余50MB内存。如果这时候程序fork,fork时系统会复制你的整个程序地址空间到新进程(尽管是copy on write优化的,并不物理复制),这样就造成内存不足了。
解决办法是过ipc机制,通知一个小进程做system()就可以了。

论坛徽章:
0
8 [报告]
发表于 2010-06-10 10:15 |只看该作者
那就是你的程序太大了,比如你的程序占了100MB的内存,还剩余50MB内存。如果这时候程序fork,fork时系统会复 ...
没本 发表于 2010-06-09 22:50



    是了!应该是这个问题。非常感谢。

论坛徽章:
0
9 [报告]
发表于 2010-06-10 10:33 |只看该作者
用测试程序测试了一下,确认是我的程序占用内存过多导致。非常感谢“没本”大侠提示。

论坛徽章:
0
10 [报告]
发表于 2010-06-10 11:51 |只看该作者
嗯,不错,学到了经验
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP