GNU/Linux >> Linux の 問題 >  >> Linux

デフォルトのプロセス作成メカニズムフォークはなぜですか?

プロセス作成のための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ライブラリによって提供されます。)

別の現在のディレクトリでプロセスを開始する場合:forkchdirexec

stdin / stdoutをリダイレクトする場合:fork 、ファイルを閉じる/開く、exec

ユーザーを切り替える場合:forksetuidexec

これらはすべて、必要に応じて組み合わせることができます。誰かが新しい種類のプロセス属性を思いついた場合、forkを変更する必要はありません。 およびexec

larsksが述べたように、最近のほとんどのUnixはコピーオンライトを使用しているため、fork 大きなオーバーヘッドはありません。


Linux
  1. プロセスをフォークすると、ファイルが無限に読み取られるのはなぜですか

  2. 画面のデフォルトのパスワードは何ですか?

  3. デフォルトで sed が拡張正規表現モードを使用しないのはなぜですか?

  1. なぜCdはプログラムではないのですか?

  2. 親プロセスが終了したときの新しい親プロセス?

  3. 子プロセスが作成直後に exec() または exit() を呼び出すときに vfork() が使用されるのはなぜですか?

  1. Nullglobがデフォルトではないのはなぜですか?

  2. なぜPython2.7はまだUbuntuのデフォルトのPythonバージョンなのですか?

  3. Glimpse –GIMPのフォーク