免费注册 查看新帖 |

Chinaunix

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

关于全局变量,急!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-19 10:10 |只看该作者 |倒序浏览
看个代码先:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>

  5. char* tmp = NULL;

  6. main()
  7. {
  8.   pid_t pid_tmp;

  9.   tmp = malloc(40);
  10.   strcpy(tmp,"parent");
  11.   pid_tmp = fork();
  12.   switch(pid_tmp)
  13.   {
  14.         case  -1 :
  15.                  printf("!!!!!!fork err!!!!!!!!!!\n");
  16.                  exit(1);
  17.         case   0 :
  18.                                          printf("tmp in child process before mod:%s\n", tmp);
  19.                                          memset(tmp, 0, 40);
  20.                  strcpy(tmp,"child");
  21.                  printf("tmp in child process after mod:%s\n",tmp);
  22.                  exit(0);
  23.   }
  24.   wait(&pid_tmp);
  25.   printf("%s\n",tmp);
  26.   exit(0);
  27. }
复制代码


运行结果如下:
tmp in child process before mod:parent
tmp in child process after mod:child
parent

我的问题是,在上面的主进程fork子进程的时候是不是在子进程对主进程中的指针变量和指针变量所指的内存都做了一份内存拷贝呢?

如果是的话,假如我主进程中的指针变量指向的是一个很大的内存块,那样的话,fork进程的时候拷贝内存是不是花很多的时间??

这是我现在项目中遇到的问题,麻烦各位解答以下:)

论坛徽章:
0
2 [报告]
发表于 2007-07-19 10:11 |只看该作者
这个代码是网上搜的同样的问题的例子,稍微改了以下,只是为了方便说明问题:)

论坛徽章:
0
3 [报告]
发表于 2007-07-19 10:18 |只看该作者
子进程复制父进程的堆和栈

论坛徽章:
0
4 [报告]
发表于 2007-07-19 10:21 |只看该作者
哦,谢谢,以前没有考虑这么多,那我现在程序fork一个进程的代价太大了,我的父进程里的动态申请的空间很大,是一个很大的hash表,然后当新的连接来的时候,我是fork一个子进程然后再从hash里面查的。太恐怖了!

论坛徽章:
0
5 [报告]
发表于 2007-07-19 10:25 |只看该作者
内存拷贝当然是会花很多时间的。但也是有方法可以避免的。
你希望得到怎样一个效果?

论坛徽章:
0
6 [报告]
发表于 2007-07-19 10:25 |只看该作者
刚查到的一段关于这个问题的解释:

如果一个大程序在运行中,它的数据段和堆栈都很大,一次fork就要复制一次,那么fork的系统开销不是很大吗?其实UNIX自有其解决的办法,大家知道,一般CPU都是以“页”为单位分配空间的,象INTEL的CPU,其一页在通常情况下是4K字节大小,而无论是数据段还是堆栈段都是由许多“页”构成的,fork函数复制这两个段,只是“逻辑”上的,并非“物理”上的,也就是说,实际执行fork时,物理空间上两个进程的数据段和堆栈段都还是共享着的,当有一个进程写了某个数据时,这时两个进程之间的数据才有了区别,系统就将有区别的“页”从物理上也分开。系统在空间上的开销就可以达到最小。

论坛徽章:
0
7 [报告]
发表于 2007-07-19 10:27 |只看该作者

回复 #5 vafls_scott 的帖子

恩,我知道,我以前是没有考虑到fork进程时的内存拷贝开销。
其实我这个程序完全可以做成多线程的,多个线程之间共享全局的hash表结构就是了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2007-07-19 10:48 |只看该作者
原帖由 喇嘛疤瘌 于 2007-7-19 10:25 发表
刚查到的一段关于这个问题的解释:

如果一个大程序在运行中,它的数据段和堆栈都很大,一次fork就要复制一次,那么fork的系统开销不是很大吗?其实UNIX自有其解决的办法,大家知道,一般CPU都是以“页”为单 ...

yep,COW(copy on write).

论坛徽章:
0
9 [报告]
发表于 2007-07-19 10:49 |只看该作者
这是一个初始话的全局变量,在全局静态区,其值是一个内存地址,经赋值后指向堆区, fork后应该是多个这样的地址指向同一块堆空间,真会复制堆区吗?如果如我所说的,那竞争怎么解决?

论坛徽章:
0
10 [报告]
发表于 2007-07-19 10:58 |只看该作者
原帖由 linux_ha 于 2007-7-19 10:49 发表
这是一个初始话的全局变量,在全局静态区,其值是一个内存地址,经赋值后指向堆区, fork后应该是多个这样的地址指向同一块堆空间,真会复制堆区吗?如果如我所说的,那竞争怎么解决?




用IPC  信号量
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP