当我们调用fork时,会创建一个线程,该线程与父进程共享堆内存。如果我用不同的过程映像(使用exec)覆盖此线程的地址空间会发生什么
1)每个段都会被新进程的相应段覆盖,或者是这样,完整的虚拟地址空间是否会被新进程的完整地址空间覆盖?
2)操作系统会为此新流程分配额外堆内存? &安培;堆(以前共享)将不再可供新进程访问?
3)所有这些混乱是因为我不知道可执行文件(准备加载)是否有堆段。
答案 0 :(得分:1)
Fork创建写入时复制的内存 - 运行exec时,页面会被覆盖,但由于它们在写入时被标记为副本,因此会为子进程分配新页面。旧页面不再可用。
来自维基百科的更多信息:http://en.wikipedia.org/wiki/Fork_(operating_system)#Fork_and_page_sharing
答案 1 :(得分:1)
Fork创建在写入时标记为副本的内存,以便进程不会通过此路径相互影响。
Exec释放对共享内存的访问权限,将其留给另一个进程。然后它为新的过程映像分配全新的内存。
实际上比这更复杂,维护打开的文件描述符等,但这是一个有用的近似值。
编辑:我认为你想知道的第三点是:新进程初始化为一个新的空堆区域。但它可能在调用main()之前由运行时库执行一些分配。