免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: socay2
打印 上一主题 下一主题

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

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

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

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
2 [报告]
发表于 2012-12-17 17:22 |显示全部楼层
folklore 发表于 2012-12-17 16:34
copy on write.
只要Copy页表就行了。


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

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

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
3 [报告]
发表于 2012-12-17 18:00 |显示全部楼层
folklore 发表于 2012-12-17 17:31
@socay2

这个错的,


那么,我在子进程中 exec 的时候,肯定是 write 的时候了,因此,也就会为该进程分配新的内存地址。
这个时候系统是否是先试探性的分配一块内存,比如1K,如果,不够,继续分配?

如果上面的说法正确,那么子进程的所用的实际空间就和父进程的没有关系了。
好像是这样的吧,父子进程在内存大小上没有什么依赖关系

期待继续指正!

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
4 [报告]
发表于 2012-12-17 18:02 |显示全部楼层
zylthinking 发表于 2012-12-17 17:58
说了半天的各位, 可曾真正读过相关代码?
就我所读的过时 linux 源码, fork 确实会拷贝页表项, ...


全部重置,指的是什么,重新分配页表和物理地址吗?

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
5 [报告]
发表于 2012-12-17 18:20 |显示全部楼层
liuiang 发表于 2012-12-17 18:11
exec 确实楼上所说,看来大家都挺无聊的~~~~~~


你的意思是说,exec 就完成了13 楼的重置么?
那么exec结束后,重新映射的地址空间大小和父进程映射的地址空间大小就不一样了。视exec调用的程序大小来决定。

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
6 [报告]
发表于 2012-12-18 00:36 |显示全部楼层
moxies 发表于 2012-12-17 23:41
http://en.wikipedia.org/wiki/Fork-exec 看这个文章,同时还说了点别的,摘录如下:

When the child p ...

在CU的讨论我看到这样一句
但子进程也有与父进程不同的属性,这点很重要:
. 进程号, 子进程号不同与任何一个活动的进程组号. 
. 父进程号. 
. 子进程继承父进程的文件描述符或流时,具有自己的一个拷贝并且与父进程和其它子进程共享该资源. 
. 子进程的用户时间和系统时间被初始化为0. 
. 子进程的超时时钟设置为0. 
. 子进程的信号处理函数指针组置为空. 
. 子进程不继承父进程的记录锁. 

但是我用如下代码测试:
  1. void fun(int signo)
  2. {
  3.         printf("%d\n", getpid());
  4. }
  5. int main(int argc, char **argv)
  6. {
  7.         signal(SIGINT, fun);
  8.         if(fork()) {
  9.                 printf("parent: %d\n", getpid());
  10.                 while(1);
  11.         }
  12.         else {
  13.                 printf("child: %d\n", getpid());
  14.                 while(1);
  15.         }
  16. }
复制代码
子进程的信号处理函数并没有被置为空,还是继承了父进程的处理方式。

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
7 [报告]
发表于 2012-12-18 09:50 |显示全部楼层
回复 21# liuiang


    我的目的就是想了解下,在子进程里 exec 装入另外一个程序后,它所占用的实际内存大小会不会是从父进程那里继承过来的。

不过进过上面朋友们的讨论,好像 exec 后的大小有新加进来的程序决定。系统会重新映射内存

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
8 [报告]
发表于 2012-12-18 09:52 |显示全部楼层
moxies 发表于 2012-12-18 08:55
@socay2擦,真刻苦。

你看的那段,好像有个前提就是fork 后 exec 。。。 对也不对?


待会我继续验证。

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
9 [报告]
发表于 2012-12-19 21:08 |显示全部楼层
终于明白 COW == copy on write 了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP