当年的问题:
linux system调用问题 虔诚求助
发表于 2009-08-05 16:33:18
最近遇到一个问题,我的一个linux进程(非常大,占用机器70%的内存),在进程运行过程中,我想执行一个shell命令,起初是调用
system("shell命令"),但是system会fork一个子进程来完成这个操作,但是这时内存已经不够用(不足以复制出新的子进程),
导致出错。
后来我做了一个测试例子,利用malloc+memset占用系统大部分内存,调用system,却可以成功,很奇怪,有可能我的测试例子不能模拟出我那个linux进程?
问题: system调用 会复制父进程的内容吗? 具体复制哪些呢? 为什么malloc的内存不会被复制(测试例子system成功,说明没有复制全部内容,负责剩余内存不够)
(system函数里调用的是fork,然后执行的exec,fork不是写时复制吗? 没有写 怎么会复制内存了呢?)
如果使用vfork是不是可以,vfork和父进程共享内存的吧 而没有单独复制内存。
不知道我有没有讲清楚,请大家多帮忙,任何回复都welcome的。
回答:
发表于 2012-04-28 22:46:36
啊!这么多年了! 我自己回复下这个问题吧
1) system 调用fork创建子进程
2) fork复制父进程的数据段,需要申请分配内存的
3) fork申请分配内存时会根据一个系统的配置文件 /proc/sys/vm/overcommit_memory
,判断是否满足分配内存的条件,我前面的问题中提到了,版本进程占用了系统大部分的内存,当该进程中的某块数据区大小大于剩余全部系统的剩余内存时(别怀
疑,我们的服务器就是有这种情况,2G内存,主进程占用了1.7G 其中一块连续的数据大于了300M )
,加之,当时的配置文件overcommit_memory
写入的是0,即:检查是否有足够的可用内存供应用进程使用。导致了system返回失败,分配内存失败。
PS: 该配置文件的解释:
/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
阅读(1075) | 评论(0) | 转发(0) |