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ライブラリによって提供されます。)

別の現在のディレクトリでプロセスを開始する場合:fork 、chdir 、exec 。

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

ユーザーを切り替える場合:fork 、setuid 、exec 。

これらはすべて、必要に応じて組み合わせることができます。誰かが新しい種類のプロセス属性を思いついた場合、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のフォーク