堆内存何时为进程分开? exec系统调用会发生什么?

时间:2010-12-06 19:00:10

标签: linux multithreading heap exec fork

请耐心等待,因为我不擅长框架问题。据我所知,这不是重复的问题。而且肯定这不是家庭作业。

当我们调用fork时,会创建一个线程,该线程与父进程共享堆内存。如果我用不同的过程映像(使用exec)覆盖此线程的地址空间会发生什么

1)每个段都会被新进程的相应段覆盖,或者是这样,完整的虚拟地址空间是否会被新进程的完整地址空间覆盖?

2)操作系统会为此新流程分配额外堆内存? &安培;堆(以前共享)将不再可供新进程访问?

3)所有这些混乱是因为我不知道可执行文件(准备加载)是否有堆段。

2 个答案:

答案 0 :(得分:1)

Fork创建写入时复制的内存 - 运行exec时,页面会被覆盖,但由于它们在写入时被标记为副本,因此会为子进程分配新页面。旧页面不再可用。

来自维基百科的更多信息:http://en.wikipedia.org/wiki/Fork_(operating_system)#Fork_and_page_sharing

答案 1 :(得分:1)

Fork创建在写入时标记为副本的内存,以便进程不会通过此路径相互影响。

Exec释放对共享内存的访问权限,将其留给另一个进程。然后它为新的过程映像分配全新的内存。

实际上比这更复杂,维护打开的文件描述符等,但这是一个有用的近似值。

编辑:我认为你想知道的第三点是:新进程初始化为一个新的空堆区域。但它可能在调用main()之前由运行时库执行一些分配。