2014-03-05 46 views
0

我正在嘗試利用COW併爲Linux系統內存允許的許多子進程分叉。我將開始父進程,直到分叉部分(此時進程正在使用一定量的內存),然後一次分叉一個孩子,直到fork返回ENOMEM錯誤。在那種情況下,我會等待任何孩子完成分岔之前完成一個新的。子進程不會分配任何新的內存,而只是工作。但是這不起作用,我的所有進程都被Linux系統殺死,沒有任何內存錯誤。根據可用的空閒內存控制多少個子進程分叉

這樣做的最佳方法是什麼?

+0

不要這樣做。你不應該有大量的進程:幾十個進程是好的,其中成千上萬的進程可能是壞的。進程使用更多的資源,只是內存。至少測試'fork'(不只是'errno == ENOMEM')的失敗。另外,編輯你的問題來解釋*爲什麼*你想這樣做! –

回答

0

根據COW的定義,這是不可能的。

您的進程可能不會明確分配內存,但他們肯定會隱式地執行它。當進程試圖修改標記爲寫時拷貝的頁面時,操作系統需要暫停操作並分配一個新頁面。這種分配可能會失敗,並且程序中沒有地方可以返回錯誤。唯一可能的行動是殺死進程。

您可以做的最好的方法是估計您的程序在其高峯期需要多少內存,並將此信息與可用內存信息(例如/ proc/meminfo)結合使用。

禁用COW的根本解決方案也應該工作,但AFAIK Linux沒有這個選項。

+0

感謝您的回答。我所做的解決方法如您所說,估計每個進程使用的內存,並預測可用空閒內存可能達到的最大分叉子數。 – user3381475