0

私は COW を利用して、Linux システム メモリが許す限り多くの子プロセスをフォークしようとしています。fork 部分 (プロセスが一定量のメモリを使用している時点) まで親プロセスを開始し、次に fork が ENOMEM エラーを返すまで一度に 1 つの子を fork します。その場合、新しい子をフォークする前に、子が完了するのを待ちます。子プロセスは新しいメモリを割り当てませんが、動作します。しかし、これは機能しません。すべてのプロセスが Linux システムによって強制終了され、メモリ エラーは発生しませんでした。

それを行う最良の方法は何ですか?

4

1 に答える 1

0

これは、COW の定義そのものでは不可能です。

あなたのプロセスはメモリを明示的に割り当てていないかもしれませんが、確かに暗黙的に割り当てています。プロセスがコピー オン ライトとマークされたページを変更しようとすると、OS は操作を中断し、新しいページを割り当てる必要があります。この割り当ては失敗する可能性があり、プログラムにはエラーを返す場所がありません。唯一可能なアクションは、プロセスを強制終了することです。

あなたができる最善の方法は、プログラムがピーク時に必要とするメモリ量を見積もり、この情報を空きメモリ情報 (たとえば /proc/meminfo から) と組み合わせることです。

COWを完全に無効にする根本的な解決策も機能するはずですが、AFAIK Linuxにはこのオプションがありません。

于 2014-03-05T06:48:35.443 に答える