免费注册 查看新帖 |

Chinaunix

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

进程内存分配问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-08 19:28 |只看该作者 |倒序浏览
在父进程中分配的内存,如果fork了多个子进程后,需不需要每个子进程都要释放一次?

论坛徽章:
0
2 [报告]
发表于 2010-01-08 20:54 |只看该作者
不需要。fork时,内核让子进程指向父进程的地址空间。当子进程发生写操作时。才把所写页面复制一份给子进程。
关键是子进程要知道自己在做什么

论坛徽章:
0
3 [报告]
发表于 2010-01-08 22:58 |只看该作者
原帖由 seskissinger 于 2010-1-8 20:54 发表
不需要。fork时,内核让子进程指向父进程的地址空间。当子进程发生写操作时。才把所写页面复制一份给子进程。
关键是子进程要知道自己在做什么


应该是需要的。在fork后,子进程和父进程拥有相同的内容。copy on write只是OS在实现fork是的一种优化方法,从逻辑上来说,在父进程中分配的内存,在子进程中仍然存在,因此子进程需要归还此内存。
在AIX上做了一个实验:
#include <unistd.h>
#include <stdio.h>

void p_mem(pid_t pid)
{
  char cmdbuf[256];
  printf("\n-------------------------------------------------------------------------------\n");
  sprintf(cmdbuf, "svmon -P %d -O summary=basic", pid);
  system(cmdbuf);
}

#define BUF_LEN (200 * 1024 * 1024)
int main()
{
  char * buf = (char *)malloc(BUF_LEN);
  memset(buf, 0, BUF_LEN);

  pid_t pid = fork();
  if (pid > 0)
  {
     printf("parent: %d, child = %d\n", getpid(), pid);
     free(buf);
     p_mem(getpid());
  }
  else if (pid == 0)
  {
      sleep(10);
     p_mem(getpid());
  }
  else
  {
    exit(0);
  }


  return 1;
}


编译后运行结果如下:
aix520/tmp/shiyb/fork>MALLOCOPTIONS=disclaim ./a.out
parent: 426126, child = 544814

-------------------------------------------------------------------------------
Unit: page
-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual
  426126 a.out            18027     7711        0    18025
aix520/tmp/shiyb/fork>
-------------------------------------------------------------------------------
Unit: page
-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual
  544814 a.out            69245     7711        0    69243

aix520/tmp/shiyb/fork>


从红色部分可以看出,在父进程free内存后,子进程中的内存仍然存在,需要手动free。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP