Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 根据可用的可用内存控制分支的子进程数_Linux_Fork_Enomem - Fatal编程技术网

Linux 根据可用的可用内存控制分支的子进程数

Linux 根据可用的可用内存控制分支的子进程数,linux,fork,enomem,Linux,Fork,Enomem,我试图利用Linux系统内存允许的尽可能多的子进程。我将启动父进程,直到fork部分(此时进程正在使用一定量的内存),然后一次fork一个子进程,直到fork返回ENOMEM error。在这种情况下,我会等待任何一个孩子完成,然后再分出一个新的。子进程不会分配任何新内存,只会工作。但这不起作用,我的所有进程都被Linux系统杀死,没有任何内存错误 最好的方法是什么?根据奶牛的定义,这是不可能的 您的进程可能没有显式分配内存,但它们肯定是隐式分配内存的。当进程试图修改标记为“写入时复制”的页面时

我试图利用Linux系统内存允许的尽可能多的子进程。我将启动父进程,直到fork部分(此时进程正在使用一定量的内存),然后一次fork一个子进程,直到fork返回ENOMEM error。在这种情况下,我会等待任何一个孩子完成,然后再分出一个新的。子进程不会分配任何新内存,只会工作。但这不起作用,我的所有进程都被Linux系统杀死,没有任何内存错误


最好的方法是什么?

根据奶牛的定义,这是不可能的

您的进程可能没有显式分配内存,但它们肯定是隐式分配内存的。当进程试图修改标记为“写入时复制”的页面时,操作系统需要挂起该操作并分配一个新页面。此分配可能会失败,并且程序中没有可返回错误的位置。唯一可能的操作是终止进程

您所能做的最好的事情是估计您的程序在其峰值时需要多少内存,并将此信息与可用内存信息相结合(例如,从/proc/meminfo)


完全禁用COW的根本解决方案也应该可行,但AFAIK Linux没有这个选项。

不要这样做。你不应该有太多的进程:几十个进程是可以的,数千个进程可能是不好的。进程使用的资源比内存更多。至少测试
fork
(不仅仅是
errno==ENOMEM
)的故障。另外,编辑你的问题来解释你为什么要这样做!谢谢你的回答。我所做的变通方法是,正如您所说的,估计每个进程使用的内存,并预测可用空闲内存中可能出现的分叉子进程的最大数量。