请容忍我,因为我不擅长安排问题。据我所知,这不是重复的问题。这肯定不是家务活。
当我们调用叉时,将创建一个线程,该线程与父进程共享堆内存。如果我用不同的进程映像(使用exec)覆盖这个线程的地址空间,会发生什么?
1)每个段将被新进程的相应段覆盖,还是说,完整的虚拟地址空间将被新进程的全地址空间覆盖?
2)操作系统将为这个新进程分配额外的堆内存,?&堆(在此之前共享)将不再被新进程访问?
3)所有这些混乱是因为我不知道可执行文件(准备加载)是否有堆段。
发布于 2010-12-06 19:30:28
叉创建在写时标记为复制的内存,以便进程不能通过此路径相互影响。
Exec释放对共享内存的访问,将其留给另一个进程处理。然后它为新的进程映像分配全新的内存。
实际上,维护打开的文件描述符等比这更复杂,但这是一个有用的近似。
编辑:我想你在第三点想知道的是:新进程是用一个新的空堆区域初始化的。但是,在调用main()之前,运行库可能会执行一些分配。
发布于 2010-12-06 19:16:34
Fork创建在写时复制的内存--当运行exec时,页面被覆盖,但是由于它们在写时被标记为复制,所以新的页被分配给子进程。旧页不再可用了。
更多信息来自维基百科:http://en.wikipedia.org/wiki/Fork_(operating_system)#Fork_and_page_sharing
https://stackoverflow.com/questions/4369925
复制相似问题