WindowsアプリケーションをLinuxに移植しています。私はCreateProcess
Windowsで子プロセスを実行し、すべての標準ストリーム(in、out、error)をリダイレクトするために使用しています。ストリームのリダイレクトは重要です。メインプロセスはデータを子に送信し、その出力とエラーメッセージを受信します。メインプロセスはメモリとスレッドを多く含む非常に大きなプロセスであり、子プロセスは小さなプロセスです。Linuxでは、そのfork
関数はCreateProcess
Windows と同様の機能を持っています。ただし、マニュアルには、fork
コード、データ、スタックを含む「親プロセスのコピーを作成する」と記載されています。それは、1 GBのメモリ自体を使用する非常に単純なコマンドラインツールを実行するためだけに1 GBのメモリを使用する巨大なプロセスのコピーを作成する場合、1 GBのメモリを最初に複製する必要があることを意味しますfork
、次にこの1 GBを1 MBプロセスに置き換えますか?それで、100のスレッドがある場合、100 MBのメモリを必要とする100のプロセスを実行するには、100 GBのメモリが必要ですか?またfork
、実行について「わからない」親プロセス内の他のスレッドについてはどうですか、それらは何をしますか?fork
「内部」ではどのような機能があり、巨大な親から多くの小さな子プロセスを作成することは本当に効果的な方法ですか?
呼び出すとfork()
、最初はVMのみがコピーされ、すべてのページがコピーオン書き込みとしてマークされます。新しい子プロセスには、親プロセスVMの論理コピーがありますが、実際に書き込みを開始するまで、追加のRAMを消費しません。
スレッドについてfork
は、呼び出しスレッドのコピーに似た子プロセスで新しいスレッドを1つだけ作成します。
また、呼び出しのexec
ファミリーのいずれかを呼び出したときに(私はそれを望んでいると思います)、プロセスイメージ全体が新しいイメージに置き換えられ、ファイル記述子のみが保持されます。
親プロセスに開いているファイル記述子がたくさん/proc/self/fd
ある場合は、必要がない子のすべてのファイル記述子を調べて閉じることをお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加