免费注册 查看新帖 |

Chinaunix

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

[进程管理] 线程中fork进程提示【Cannot allocate memory】是否与线程库相关? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-24 16:54 |只看该作者 |倒序浏览
系统环境:linux2.6.37
硬件环境:ARM架构

问题描述:
嵌入式应用层采用多线程结构实现,现在一个功能需要另外起来一个进程实现(就是通过shell起来一个进程),调用fork&execl的形式实现,但是在fork的时候总是提示失败,把错误号打出来是这样的:Cannot allocate memory。

但是移植到另外一个平台上面可以运行正常,可以实现需要功能。

将有问题的平台以“平台A”表示,整成的以“平台B表示”

两个平台硬件结构不同,线程库不同(这个我比较怀疑)。

平台A:uclib
平台B:glib

注:我写了一个demo在平台A上面运行(直接调用fork启动进程),没有问题


为了在所有的平台上面都能实现功能,目前我采用两个线程来实现的,一个线程直接调用system来启动进程,另外一个进程来维护这个进程(通过进程名拿到进程id,如果获取id失败,认为进程退出了),检测这个进程是否退出,然后进行相关操作,但是这样的设计肯定有问题,因为可能会启动很多个类似的进程,如果出现相同进程名的进程就有问题了。


网上查了很多资料,好像都没有给出好的回答和解决方案,目前都还不知道到底是否是线程库的问题。


有没有兄弟遇到过类似的情况,望分享下经验哇,3Q

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-05-26 12:25 |只看该作者
看似commitlimit的限制,看看
cat /pro/meminfo
cat /proc/sys/vm/overcommit_memory

论坛徽章:
0
3 [报告]
发表于 2014-05-26 20:07 |只看该作者
回复 2# humjb_1983






不好意思,这两天公司事情比较多

这个我当时看多,free mem还高达48M,所以这个应该没有问题

   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-05-27 08:38 |只看该作者
Swayer_Chen 发表于 2014-05-26 20:07
回复 2# humjb_1983

这个不是空闲内存多少的问题,而是overcommit参数的问题,还请把上面的信息帖一下。

论坛徽章:
0
5 [报告]
发表于 2014-05-28 18:25 |只看该作者
大富大贵兄,你好
/ # cat /proc/meminfo
MemTotal:         125172 kB
MemFree:           45992 kB
Buffers:           10128 kB
Cached:            42332 kB
SwapCached:            0 kB
Active:            29932 kB
Inactive:          42584 kB
Active(anon):      20056 kB
Inactive(anon):       32 kB
Active(file):       9876 kB
Inactive(file):    42552 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         20072 kB
Mapped:             6600 kB
Shmem:                32 kB
Slab:               3528 kB
SReclaimable:       1256 kB
SUnreclaim:         2272 kB
KernelStack:        1032 kB
PageTables:          980 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      112652 kB
Committed_AS:      57368 kB
VmallocTotal:     778240 kB
VmallocUsed:        4692 kB
VmallocChunk:     765948 kB



/proc/sys/vm # cat overcommit_memory
2


以上为该平台的打印

请问你觉得该问题是否与线程库的实现机制有关?

uclib线程库是否不能在线程里面fork进程?

论坛徽章:
0
6 [报告]
发表于 2014-05-28 18:25 |只看该作者
回复 4# humjb_1983


    大富大贵兄,你好
/ # cat /proc/meminfo
MemTotal:         125172 kB
MemFree:           45992 kB
Buffers:           10128 kB
Cached:            42332 kB
SwapCached:            0 kB
Active:            29932 kB
Inactive:          42584 kB
Active(anon):      20056 kB
Inactive(anon):       32 kB
Active(file):       9876 kB
Inactive(file):    42552 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         20072 kB
Mapped:             6600 kB
Shmem:                32 kB
Slab:               3528 kB
SReclaimable:       1256 kB
SUnreclaim:         2272 kB
KernelStack:        1032 kB
PageTables:          980 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      112652 kB
Committed_AS:      57368 kB
VmallocTotal:     778240 kB
VmallocUsed:        4692 kB
VmallocChunk:     765948 kB



/proc/sys/vm # cat overcommit_memory
2


以上为该平台的打印

请问你觉得该问题是否与线程库的实现机制有关?

uclib线程库是否不能在线程里面fork进程?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2014-05-28 18:48 |只看该作者
可能是被fork的进程的虚拟地址空间占用太多,同时你的overcommit参数设置为2,当虚拟地址空间占用超过一定量(物理内存和swap计算)后,就会失败。
建议将/proc/sys/vm/overcommit_memory改为0,这个应该也是默认的。

论坛徽章:
0
8 [报告]
发表于 2014-05-28 22:52 来自手机 |只看该作者
如果不使能overcommit,且swap未开启,当前进程的实际占用物理内存数大于free的内存时,fork会提示“cannot allocate memory”,用vfork就行了,如果认为库的行为不同,可以用strace看下系统调用的参数确认。

论坛徽章:
0
9 [报告]
发表于 2014-06-03 10:44 |只看该作者
回复 8# guobamantou


    嗯,当时我使用vfork试过,vfork调用的结果一样,还是一样的提示不能分配内存~~~

论坛徽章:
0
10 [报告]
发表于 2014-06-03 10:45 |只看该作者
回复 7# humjb_1983


   /proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。


应该在2的时候才有可能成功吧?如果是0 ,那不是申请不到就直接失败了么?



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP