fork()とvfork()の違い

著者: Laura McKinney
作成日: 2 4月 2021
更新日: 10 5月 2024
Anonim
fork vfork
ビデオ: fork vfork

コンテンツ


両方 フォーク() そして vfork()システムコール これにより、fork()またはvfork()を呼び出したプロセスと同一の新しいプロセスが作成されます。を使用して フォーク() 親プロセスと子プロセスを同時に実行できます。反対に、 vfork() 子プロセスが実行を完了するまで、親プロセスの実行を一時停止します。 fork()システムコールとvfork()システムコールの主な違いは、forkを使用して作成された子プロセスが、親プロセスのアドレススペースとは別のアドレススペースを持つことです。一方、vforkを使用して作成された子プロセスは、親プロセスのアドレススペースを共有する必要があります。

以下に示す比較チャートを使用して、fork()とvfork()のいくつかの違いを見つけましょう。

  1. 比較表
  2. 定義
  3. 主な違い
  4. 結論

比較表

比較の根拠フォーク()vfork()
ベーシック子プロセスと親プロセスには別々のアドレススペースがあります。子プロセスと親プロセスは同じアドレス空間を共有します。
実行親プロセスと子プロセスは同時に実行されます。子プロセスが実行を完了するまで、親プロセスは中断されたままです。
変形子プロセスがアドレス空間内のページを変更した場合、アドレス空間は分離されているため、親プロセスからは見えません。子プロセスがアドレス空間内のページを変更した場合、親プロセスは同じアドレス空間を共有するため、親プロセスから見ることができます。
コピーオンライトfork()は、いずれかが共有ページを変更するまで親と子が同じページを共有する代替手段としてコピーオンライトを使用します。vfork()は、コピーオンライトを使用しません。


fork()の定義

フォーク() を作成するためのシステムコールの使用です 新しいプロセス。 fork()呼び出しによって作成された新しいプロセスは、fork()システムコールを呼び出したプロセスの子プロセスです。子プロセスのコードは、その親プロセスのコードと同一です。子プロセスの作成後、プロセス、つまり親プロセスと子プロセスの両方がfork()の後の次のステートメントから実行を開始し、両方のプロセスが実行されます 同時に.

親プロセスと子プロセスには 別のアドレス空間。したがって、いずれかのプロセスがコード内のステートメントまたは変数を変更した場合。他のプロセスコードには反映されません。子プロセスがコードを変更しても、親プロセスには影響しないとしましょう。

作成後の子プロセスはすぐに呼び出します exec()。 exec()システムコール プロセスを置き換えます パラメータで指定されたプログラムを使用します。その場合、子プロセスの個別のアドレス空間は役に立ちません。ここでの1つの選択肢は、コピーオンライトです。

コピーオンライト 親プロセスと子プロセスが同じアドレス空間を共有できるようにします。プロセスのいずれかがアドレス空間のページに書き込む場合、アドレス空間のコピーが作成され、両方のプロセスが独立して動作できるようになります。

vfork()の定義

fork()の修正バージョンはvfork()です。の vfork() システムコールは、新しいプロセスを作成するためにも使用されます。 fork()と同様に、ここでも作成される新しいプロセスは、vfork()を呼び出したプロセスの子プロセスです。子プロセスコードも親プロセスコードと同じです。ここでは、子プロセス 実行を一時停止します 両方のプロセスが使用する同じアドレス空間を共有するため、実行が完了するまで親プロセスの


子プロセスと親プロセスが 同じアドレス空間。プロセスのいずれかがコードを変更すると、同じページを共有する他のプロセスから見えるようになります。親プロセスがコードを変更すると仮定します。子プロセスのコードに反映されます。

vfork()を使用すると、子プロセスと親プロセスに別々のアドレススペースが作成されません。したがって、それは 実装済み 子プロセスが呼び出す場所 exec() 作成直後。したがって、アドレス空間の無駄はありません。 効率的 プロセスを作成する方法。 vforkは使用しません コピーオンライト.

  1. forkとvforkの主な違いは、子プロセスが フォーク があります 個別のメモリ空間 親プロセスから。ただし、によって作成された子プロセス vfork システムコールは 同じアドレス空間 親プロセスの
  2. forkを使用して作成された子プロセス 同時に実行する 親プロセスで。一方、vforkを使用して作成された子プロセス サスペンド 実行が完了するまでの親プロセスの実行。
  3. 親プロセスと子プロセスのメモリ空間は別々の変更であるため、いずれかのプロセスが他のページに影響を与えることはありません。ただし、親プロセスと子プロセスは同じプロセスを共有するため、プロセスによって行われたアドレス変更はアドレス空間に反映されます。
  4. システムコールfork()は コピーオンライト 代替方法として、子プロセスと親プロセスのいずれかがページを変更するまで同じアドレス空間を共有できるようにします。一方、vforkはコピーオンライトを使用しません。

結論:

vfork()システムコールは、fork()を使用して作成した直後に子プロセスがexec()を呼び出すときに実装する必要があります。ここでは、子プロセスと親プロセスの個別のアドレススペースは役に立ちません。