在MPI多线程中使用vfork VS fork



我的程序非常非常大。所以,我不能在这里列出。我的程序使用openMPI &mutiple_thread。

问题已解决。(使用vfork()而不是fork())但我不知道它为什么有效。有人能给我解释一下吗?

问题是由free()引起的。我的程序中有一些代码段。所有这些段都在由pthread_create创建的线程中。这些段的逻辑如下:

{
    *p = malloc();
    fun(p);
    free(p);
}

所有错误都在free()中。它报告一个段故障错误。我把程序运行了一百多次。我发现总是有一个fork()在每次损坏之前被调用。

fork段的逻辑如下:

{
    MPI_program_code...
    if(!fork())
    {
        execv(exe_file,arg);
    }
    MPI_program_code...
}

(注意,在exe_file中没有使用MPI_function)

当我使用vfork()而不是fork()时,根本没有问题。但我不知道它为什么会起作用。

那么,有人能解释一下为什么它有效吗?

您可能会发现关于分支子进程的Open MPI FAQ主题非常有用。还有一个关于为什么使用fork()与InfiniBand是危险的解释可以在这里找到。

vfork(2)fork(2)的不同之处在于,它被专门设计为尽可能轻量级,并且只意味着与紧跟execve(2)(或其任何来自C库的包装器)或_exit(2)调用的一起使用。这样做的原因是vfork(2)创建了一个与父进程共享所有内存的子进程,而不是让它映射写时复制,也就是说,新的子进程更像一个线程,而不是一个成熟的进程。由于子进程也使用原始线程的堆栈,父进程被阻塞,直到子进程执行了另一个可执行文件或退出。

Open MPI使用pthread_atfork()注册fork()处理程序。在现代Linux系统上使用vfork()时不会调用处理程序,因此父进程在分叉时不会采取任何操作。

最新更新