免费注册 查看新帖 |

Chinaunix

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

问个有深度的问题-Fork出来的子进程的内存问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-10 23:27 |只看该作者 |倒序浏览
一个进程,它如果占比较大的内存,如
定义了char sBuf[100*1024];
那至少占100k内存了,如果这个进程,fork了一个子进程,那么这个子进程,所占的内存是不是也继续了父进程的?
还是说,如果内存部分是只读的就不用占那么多了,父子共享这块内存,就是说父进程有了,子进程共享使用,不再开辟另外的内存?


这个问题有点意思吧,呵呵...

盼回...

论坛徽章:
0
2 [报告]
发表于 2010-03-10 23:39 |只看该作者
应该不是同一块内存吧,要不何来的shmget?

论坛徽章:
0
3 [报告]
发表于 2010-03-10 23:41 |只看该作者
...无语,stack啊。。。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
4 [报告]
发表于 2010-03-10 23:50 |只看该作者
copy on write 。

论坛徽章:
0
5 [报告]
发表于 2010-03-10 23:53 |只看该作者
char sBuf[100*1024];

如果是在函数内定义的, 是栈内存, 子进程拷贝代码段的时候,就算是拷贝了这个了。

如果是全局的或者静态的,那基本是在子进程用的时候拷贝。也就是写时拷贝。

这个不同的系统实现不一样。 大概是这样的。

论坛徽章:
0
6 [报告]
发表于 2010-03-11 09:29 |只看该作者
从原理上讲,子进程复制父进程的内存空间,父子进程的内存空间是独立的。从实现上讲,Linux的实现就是上面irp说的Copy on Write。也就是Fork进程的时候Kernel并没有立刻给子进程开辟一块新内存,而是等到父进程或子进程要改写这块内存的数据的时候再进行:分配内存,复制内存,写入新值。当然也不是立刻复制整个进程空间,而是被改写的那一页内存。

说的乱了,具体的看Kernel的虚拟内存管理部分吧。

论坛徽章:
0
7 [报告]
发表于 2010-03-11 09:38 |只看该作者
4楼正解啊~其实楼主 这个问题没什么深度~回去好好看看APUE就知道了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP