プロセス作成のためのUNIXシステムコールfork()は、親プロセスをコピーすることによって子プロセスを作成します。私の理解では、ほとんどの場合、これに続いてexec()が呼び出され、子プロセスのメモリスペース(テキストセグメントを含む)が置き換えられます。 fork()で親のメモリスペースをコピーすることは、常に無駄に思えました(ただし、メモリセグメントをコピーオンライトにして、ポインタのみをコピーすることで、無駄を最小限に抑えることができます)。とにかく、プロセスの作成にこの複製アプローチが必要な理由を誰かが知っていますか?
承認された回答:
インターフェースを簡素化することです。 forkの代替 およびexec WindowsのCreateProcess関数のようなものになります。 CreateProcessパラメータの数に注意してください があり、それらの多くはさらに多くのパラメーターを持つ構造体です。これは、すべて 新しいプロセスを制御したい場合は、CreateProcessに渡す必要があります 。実際、CreateProcess 十分なパラメータがないため、MicrosoftはCreateProcessAsUserとCreateProcessWithLogonWを追加する必要がありました。
fork/execを使用 モデルの場合、これらすべてのパラメータは必要ありません。代わりに、プロセスの特定の属性がexec全体で保持されます 。これにより、forkが可能になります 次に、必要なプロセス属性を変更し(通常使用するのと同じ関数を使用して)、次に exec 。 Linuxでは、fork パラメータがなく、execve 実行するプログラム、実行するコマンドライン、およびその環境は3つだけです。 (他にもexecがあります 関数ですが、これらはexecveの単なるラッパーです。 一般的なユースケースを簡素化するためにCライブラリによって提供されます。)
別の現在のディレクトリでプロセスを開始する場合:fork 、chdir 、exec 。
stdin / stdoutをリダイレクトする場合:fork 、ファイルを閉じる/開く、exec 。
ユーザーを切り替える場合:fork 、setuid 、exec 。
これらはすべて、必要に応じて組み合わせることができます。誰かが新しい種類のプロセス属性を思いついた場合、forkを変更する必要はありません。 およびexec 。
larsksが述べたように、最近のほとんどのUnixはコピーオンライトを使用しているため、fork 大きなオーバーヘッドはありません。