我在60 GB Linux机器上有一个大型C ++进程(35 GB以上的RAM使用率),需要system()来执行某些功能。但是,因为system()内部分叉并执行新进程,所以它需要的虚拟内存空间是原始进程RAM的两倍。
据我所知,我可以使用sysctl来始终启用过度使用内存,从而允许我的进程进行分叉。但是,有没有system()可以执行新进程而不需要这么多虚拟内存?
答案 0 :(得分:3)
如果你的实现包含posix_spawn(),这是一个更可行的选择。
#include <spawn.h>
http://fixunix.com/unix/84486-difference-between-spawn-fork.html
答案 1 :(得分:0)
创建第二个较小的进程,只接收命令并执行它们。
选择您喜欢的IPC(套接字,管道,信号,消息队列,挑选您最喜欢的IPC),并在需要执行一些小型系统操作时从您的大型流程中抓取该流程。
答案 2 :(得分:0)
我们最终使用FB folly库中的Subprocess,因为我们最近添加了愚蠢作为依赖。他们在引擎盖下使用vfork()
,它会在不制作进程页面副本的情况下执行进程,并冻结父进程直到子进程exec()为止。
vfork()
有许多潜在的陷阱,似乎被广泛认为已弃用/危险使用。例如,它要求分叉进程除exec之外什么也不做;因为进程的页面是共享的,如果修改了任何内存,它们可以修改和破坏父进程的状态。将它抽象到一个精心编程的库中,当我们只想在没有内存开销的情况下启动一个进程时,可以更容易避免错误。
愚蠢的子流程库的标题:https://github.com/facebook/folly/blob/master/folly/Subprocess.h