【问题标题】:Linux: system() from a memory-intensive process without forkingLinux:来自内存密集型进程的 system() 没有分叉
【发布时间】:2014-12-05 01:30:32
【问题描述】:

我在 60 GB Linux 机器上有一个大型 C++ 进程(使用 35+ GB RAM),它需要 system() 来执行某些功能。但是,由于 system() 在内部分叉并执行新进程,因此它需要的虚拟内存空间是原始进程 RAM 的两倍。

我知道我可以使用 sysctl 来始终启用过度使用内存,从而允许我的进程分叉。但是,是否有替代 system() 的方法可以执行新进程而无需太多虚拟内存?

【问题讨论】:

    标签: c++ linux exec fork system


    【解决方案1】:

    如果您的实现包含 posix_spawn(),这是一个更可行的替代方案。

    #include <spawn.h>
    

    http://fixunix.com/unix/84486-difference-between-spawn-fork.html

    【讨论】:

    【解决方案2】:

    创建第二个较小的进程,仅接收命令并执行它们。

    选择您最喜欢的 IPC(套接字、管道、信号、消息队列,选择您最喜欢的 IPC),并在您需要执行一些小的系统操作时从庞大的进程中启动该进程。

    【讨论】:

      【解决方案3】:

      我们最终选择了 FB folly 库中的 Subprocess,因为我们最近添加了 folly 作为依赖项。他们在后台使用vfork(),它在不复制进程页面的情况下分叉进程,并冻结父进程直到子进程exec()。

      vfork() 有许多潜在的陷阱,似乎被广泛认为已弃用/使用起来很危险。例如,它要求分叉的进程除了 exec 之外什么都不做;因为进程的页面是共享的,如果任何内存被修改,它们可以修改和破坏父进程的状态。当我们只是想在没有内存开销的情况下启动一个进程时,将其抽象到一个精心编程的库中应该可以更容易避免错误。

      愚蠢的子进程库的标题:https://github.com/facebook/folly/blob/master/folly/Subprocess.h

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        相关资源
        最近更新 更多