プロセス作成のための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
大きなオーバーヘッドはありません。