【问题标题】:What happens to allocated memory of other threads when forking分叉时其他线程的分配内存会发生什么
【发布时间】:2016-02-10 16:44:37
【问题描述】:

我有一个庞大的应用程序需要在某个时候自行分叉。该应用程序是多线程的,分配了大约 200MB 的内存。为了确保进程分配的数据不会重复,我现在要做的是启动一个新线程并在该线程内分叉。根据我的阅读,只有调用fork 的线程会被复制,但是分配的内存会发生什么?那还会在那里吗?这样做的目的是使用其他启动参数重新启动应用程序,当它分叉时,它将使用我的新参数调用main,从而有望获得同一程序的新进程。现在在你问之前:我不能保证该进程的二进制文件仍然与我启动该进程时相同,否则我只能 forkexec /proc/self/exe 中的内容。

【问题讨论】:

标签: linux exec fork


【解决方案1】:

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

也就是说,Linux 有一些技巧可以让它更快。复制 2 GB 的 RAM 既不快速也不高效。所以当你 fork 时,Linux 实际上给新进程 same 内存(一开始),但它使用虚拟内存系统将其标记为写时复制:只要一个进程需要写入该内存,内核会拦截它并分配不同的内存,以便其他进程不受影响。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多