2016-02-10 24 views
0

我有一个巨大的应用程序,需要在某个时刻自行分叉。该应用程序是多线程的,有大约200MB的分配内存。我现在要做的事情是确保进程分配的数据不会被重复,以便在此线程内启动一个新的线程和分支。从我读过的内容来看,只有调用fork的线程才会被复制,但分配的内存会发生什么情况?那还会在那里吗?这样做的目的是用其他启动参数重新启动应用程序,当它分叉时,它将用我的新参数调用main,从而有希望获得同一程序的新进程。现在,在你问:我不能保证该进程的二进制文件与我开始进程时的位置保持一致,否则我只能在/proc/self/exe中使用forkexec什么。分叉时分配给其他线程的内存会发生什么

+0

相关:http://stackoverflow.com/questions/27161412/how-does-copy-on-write-work-in-fork – zneak

回答

0

线程是执行单元内的一大进程资源。一个进程是您可以从进程中的任何线程访问的全部内容:所有线程,所有文件描述符以及所有其他资源。所以内存绝对不是绑定到一个线程,并从一个线程分叉没有有用的影响。 由于分叉点正在创建一个新进程,因此仍然需要复制一切

也就是说,Linux有一些技巧可以让它更快。复制2千兆字节的内存既不快也不高效。因此,当你分叉时,Linux实际上给予新进程相同的内存(起初),但它使用虚拟内存系统将其标记为写时复制:一旦一个进程需要写入该内存,内核拦截它并分配不同的内存,以便其他进程不受影响。

相关问题