私は大学院生であり、プロセスを生成しなければならないLinux関連の実験をしています。システムコールを介して生成する方法を知っていますが、fork()
呼び出すプロセスを複製せずに生成できる他の方法があるかどうか疑問に思います。
答え1
新しいプロセスが作成されると、親プロセスは、新しいプロセスが事実上独立したプロセスになるまで、新しいプロセスによって消費されるすべてのリソースを担当する必要があります。これを処理することはfork()
動作を処理するよりも複雑になるかもしれませんが、Fish and Chipsの@Derekがコメントしたように、clone()
スレッド/プロセス生成の詳細をより効果的に制御できるシステムコールがあります。
システムfork()
コールは、実際に書き込み時にコピーメモリ管理を使用して可能な限りメモリコピーを防止しようとします。実行されるとfork()
、新しいプロセスとその親プロセスは最初に同じメモリにアクセスします(最初は親プロセスのページテーブルのみが実際にコピーされます)、そのメモリはプロセッサのメモリ管理デバイスによって「書き込み時にコピー」とマークされます。子プロセスがexecve()
新しいプログラムをロードするためにすぐに使用される場合、子プロセスはそのメモリ割り当てをその一部として取得し、親プロセスのexecve()
書き込み時にコピー制限が削除されます。最適化は期待どおりに機能します。
ただし、子プロセスが実行される前に親または子プロセスが一時共有メモリページを変更すると、書き込み時にコピービットはexecve()
実際に書き込みが行われる前にページエラーを引き起こす可能性があり、カーネルはメモリの2番目のコピーを作成します。ページを変更すると、親プロセスと子プロセスの両方が予想される内容を含むメモリーページの書き込み可能な通常のコピーを取得します。したがって、プロセスがfork()
Withoutを使用している場合、execve()
実際のコピーは、後で実際に作成されたページに基づいてメモリページごとの粒度で発生します。
システムvfork()
コールはこれらの最適化を明示的にします。親プロセス/スレッドvfork()
は、子プロセスがまたはexecve()
を呼び出すまで実行中に一時停止します_exit()
。vfork()
edサブプロセスが実行される前に、特定のタスクのexecve()
実行を自分で制限する必要があります。これにより、メモリコピーが必要になる可能性が最小限に抑えられます。
私が知る限り、システムコールfork()
を使用する以外に、ユーザースペース内で新しいプロセスを作成する他の方法はありません。カーネルコードを使用している場合、現在のカーネルのどの部分にあるかによって、利用可能なオプションが異なる場合があります。vfork()
clone()