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

fork()、vfork()、exec()、clone()の違い

<オール>
  • fork() - 親プロセスの完全なコピーである新しい子プロセスを作成します。子プロセスと親プロセスは異なる仮想アドレス空間を使用しますが、最初は同じメモリ ページによって設定されます。次に、両方のプロセスが実行されると、オペレーティング システムがこれら 2 つのプロセスのいずれかによって書き込まれるメモリ ページの遅延コピーを実行し、変更されたページの独立したコピーを割り当てるため、仮想アドレス空間はますます異なります。各プロセスのメモリ。この手法は、コピー オン ライト (COW) と呼ばれます。
  • vfork() - 親プロセスの「クイック」コピーである新しい子プロセスを作成します。システムコール fork() とは対照的 、子プロセスと親プロセスは同じ仮想アドレス空間を共有します。ノート!従来の fork() の場合と同様に、同じ仮想アドレス空間を使用して、親と子の両方が同じスタック、スタック ポインター、および命令ポインターを使用します。 !同じスタックを使用する親と子の間の不要な干渉を防ぐために、親プロセスの実行は、子がいずれかの exec() を呼び出すまで凍結されます。 (新しい仮想アドレス空間を作成し、別のスタックに移行) または _exit() (プロセス実行の終了)。 vfork() fork() の最適化です 「fork-and-exec」モデル用。 fork() よりも 4 ~ 5 倍高速に実行できます。 、 fork() とは異なるため (COWを念頭に置いても)、vfork()の実装 システム コールには、新しいアドレス空間の作成 (新しいページ ディレクトリの割り当てと設定) は含まれません。
  • clone() - 新しい子プロセスを作成します。このシステム コールのさまざまなパラメータは、親プロセスのどの部分を子プロセスにコピーする必要があるか、およびそれらの間でどの部分を共有するかを指定します。その結果、このシステム コールを使用して、スレッドから開始し、完全に独立したプロセスによって終了する、あらゆる種類の実行エンティティを作成できます。実際、clone() システムコールは pthread_create() の実装に使用されるベースです そして fork() のすべてのファミリー システム コール。
  • exec() - プロセスのすべてのメモリをリセットし、指定された実行可能バイナリをロードして解析し、新しいスタックをセットアップして、ロードされた実行可能ファイルのエントリ ポイントに制御を渡します。このシステム コールは呼び出し元に制御を返すことはなく、新しいプログラムを既存のプロセスにロードする役割を果たします。 fork() を使用したこのシステム コール システム コールを組み合わせて、「fork-and-exec」と呼ばれる従来の UNIX プロセス管理モデルを形成します。

    • vfork() 廃止された最適化です。適切なメモリ管理の前に、fork() 親のメモリの完全なコピーを作成したため、かなりコストがかかりました。多くの場合、fork() exec() が続きました 、現在のメモリ マップを破棄して新しいメモリ マップを作成するため、無駄な費用がかかりました。現在、fork() メモリをコピーしません。単に「書き込み時にコピー」として設定されているため、fork() +exec() vfork() と同じくらい効率的です +exec() .

    • clone() fork() が使用するシステムコールです .いくつかのパラメーターを使用して新しいプロセスを作成し、他のパラメーターを使用してスレッドを作成します。それらの違いは、どのデータ構造 (メモリ空間、プロセッサの状態、スタック、PID、開いているファイルなど) が共有されているかどうかだけです。


    • execve() 現在の実行可能イメージを、実行可能ファイルからロードされた別のイメージに置き換えます。
    • fork() 子プロセスを作成します。
    • vfork() fork() の履歴最適化バージョンです 、 execve() の場合に使用することを意図しています fork() の直後に呼び出されます .非 MMU システム (ここで fork() 効率的な方法で動作できない) および fork() の場合 いくつかの小さなプログラムを実行するために巨大なメモリフットプリントを持つプロセスを処理します (Java の Runtime.exec() を考えてください) )。 POSIX は posix_spawn() を標準化しました vfork() の後者の 2 つのより現代的な使用法を置き換える .
    • posix_spawn() fork()/execve() と同等の処理を行います 、また、間にいくつかの fd ジャグリングを許可します。 fork()/execve() を置き換えるはずです 、主に非 MMU プラットフォーム向け。
    • pthread_create() 新しいスレッドを作成します。
    • clone() fork() から何かを実装するために使用できる Linux 固有の呼び出しです。 pthread_create() へ .それは多くの制御を提供します。 rfork() にインスパイアされた .
    • rfork() Plan-9固有の呼び出しです。これは、完全なプロセスとスレッドの間で、ある程度の共有を許可する一般的な呼び出しであるはずです。

    Linux
    1. InnoDBとMyISAMの違いは何ですか?

    2. [[$ a ==Z*]]と[$a==Z *]の違いは?

    3. Kill、Pkill、Killallの違いは?

    1. .exrcと.vimrcの違いは?

    2. ‘$の違い。 Foo」と「$./foo」??

    3. 「env」と「printenv」の違いは?

    1. Sudo Su –とSudo Su —の違いは何ですか?

    2. GettyとAgettyの違いは?

    3. NssとPamの違いは?