我有一个庞大的应用程序,需要在某些时候自行解决。该应用程序是多线程的,具有大约200MB的已分配内存。我现在要做的是确保进程分配的数据不会重复,就是在这个线程内部启动一个新的线程和fork。根据我的阅读,只有调用fork
的线程会被复制,但分配的内存会发生什么?那仍然存在吗?这样做的目的是使用其他启动参数重新启动应用程序,当它分叉时,它将使用我的新参数调用main
,从而有希望获得同一程序的新进程。在您提出问题之前:我无法保证该流程的二进制文件仍然与我开始流程时的位置相同,否则我只能在fork
中exec
和/proc/self/exe
答案 0 :(得分:0)
线程是进程所处的大量资源中的执行单元。进程是您可以从进程中的任何线程访问的全部内容:所有线程,所有文件描述符,所有其他资源。因此内存绝对不依赖于线程,并且从线程分叉没有任何有用的效果。 Everything 仍需要复制,因为分叉点正在创建一个新流程。
也就是说,Linux有一些技巧可以让它更快。复制2千兆字节的RAM既不快速也不高效。因此,当您分叉时,Linux实际上为新进程提供了相同的内存(起初),但它使用虚拟内存系统将其标记为写时复制:只要一个进程需要写入该内存,内核拦截它并分配不同的内存,以便其他进程不受影响。