2014-03-05 23 views
0

我正在尝试利用COW并为Linux系统内存允许的许多子进程分叉。我将开始父进程,直到分叉部分(此时进程正在使用一定量的内存),然后一次分叉一个孩子,直到fork返回ENOMEM错误。在那种情况下,我会等待任何孩子完成分岔之前完成一个新的。子进程不会分配任何新的内存,而只是工作。但是这不起作用,我的所有进程都被Linux系统杀死,没有任何内存错误。根据可用的空闲内存控制多少个子进程分叉

这样做的最佳方法是什么?

+0

不要这样做。你不应该有大量的进程:几十个进程是好的,其中成千上万的进程可能是坏的。进程使用更多的资源,只是内存。至少测试'fork'(不只是'errno == ENOMEM')的失败。另外,编辑你的问题来解释*为什么*你想这样做! –

回答

0

根据COW的定义,这是不可能的。

您的进程可能不会明确分配内存,但他们肯定会隐式地执行它。当进程试图修改标记为写时拷贝的页面时,操作系统需要暂停操作并分配一个新页面。这种分配可能会失败,并且程序中没有地方可以返回错误。唯一可能的行动是杀死进程。

您可以做的最好的方法是估计您的程序在其高峰期需要多少内存,并将此信息与可用内存信息(例如/ proc/meminfo)结合使用。

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

+0

感谢您的回答。我所做的解决方法如您所说,估计每个进程使用的内存,并预测可用空闲内存可能达到的最大分叉子数。 – user3381475