Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34045
  • 博文数量: 11
  • 博客积分: 355
  • 博客等级: 二等列兵
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-07 18:18
文章分类
文章存档

2012年(11)

分类: LINUX

2012-04-28 22:47:39

当年的问题:
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) |
给主人留下些什么吧!~~