免费注册 查看新帖 |

Chinaunix

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

[C] exec 后,地址空间的疑惑 [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-17 16:20 |只看该作者 |倒序浏览
我们知道在 fork 后,子进程会拷贝父进程的地址空间内容。
exec 后,会用新的程序内容(正文段、数据段等)来覆盖当前进程

那么,有这样一个问题:
父进程占用地址空间很大,比如 100M。在此继承上 fork 一个进程,然后在子进程中 exec 另外一个程序,而这个程序只需要很少的内存,比如 1K,如此,很多的内存是不是没有得到充分的利用呢?还是 Linux有什么特殊的机制来处理这种情况?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2012-12-17 16:34 |只看该作者
copy on write.
只要Copy页表就行了。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-21 06:20:00
3 [报告]
发表于 2012-12-17 16:54 |只看该作者
@folklore 解答的信息量太少。

怎么能把fork的100m 变成1k ? 拷贝页表是怎么搞定的?

牛儿们,再不来,我就开始吹啦。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2012-12-17 17:07 |只看该作者
@moxies
你先吹吧。。

Google CopyOnWrite

至于楼主的
然后在子进程中 exec 另外一个程序,而这个程序只需要很少的内存,比如 1K,如此,很多的内存是不是没有得到充分的利用呢?

那是因为Exec后,继承自父进程的空间被简单丢弃了。进程页表被重新建立。没有这个问题。

此外,进程空间和进程实际分到的内存是两回事。

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
5 [报告]
发表于 2012-12-17 17:22 |只看该作者
folklore 发表于 2012-12-17 16:34
copy on write.
只要Copy页表就行了。


copy on write 是在子进程需要写是才给它重新分配进程空间,对吧?
此时的分配进程空间,我们是否可以等价于分配内存?

copy 页表是指什么呢? 什么时候 copy

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
6 [报告]
发表于 2012-12-17 17:25 |只看该作者
简单说,如果有100M的空间,那么我不需要拷贝100M,我只需要拷贝100M/4K=25K的索引即可,我将索引直接拷贝出来,拷贝出来的索引都指向相同的100M空间。

这样,父子进程都持有相同空间的索引。当然还有其他操作,否则一个进程的更改会被另外的进程感知,那就不好玩了。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
7 [报告]
发表于 2012-12-17 17:30 |只看该作者
@socay2
进程空间!=于分配内存

理论上第个进程的空间都可以是4G(32Bit),或是2^64(64Bit机器)。
哪来那么多内存。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2012-12-17 17:31 |只看该作者
@socay2
copy on write 是在子进程需要写是才给它重新分配进程空间,对吧?

这个错的,
改为:
copy on write 是在子进程需要写是才给它重新分配内存,对吧?

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
9 [报告]
发表于 2012-12-17 17:42 |只看该作者
回复 6# liuiang


    计算公式错误哈,大概约莫着看看,理解意思就行了。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2012-12-17 17:58 |只看该作者
说了半天的各位, 可曾真正读过相关代码?
就我所读的过时 linux 源码, fork 确实会拷贝页表项, 但在 exec 的时候又全部重置了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP