新しいプロセスを作成するためにフォークが必要なのはなぜですか?

新しいプロセスを作成するためにフォークが必要なのはなぜですか?

Unixでは、新しいプロセスを作成するたびに現在のプロセスを分岐し、親プロセスとまったく同じ新しい子プロセスを作成し、execシステムコールを実行して親プロセスのすべてのデータを次に置き換えます。新しいプロセスデータ。

新しいプロセスを直接作成するのではなく、まず親プロセスのコピーを作成するのはなぜですか?

ベストアンサー1

短い答えはforkUnixです。その理由は、当時の既存システムに容易に適していたからです。バークレーの全身システムフォークという概念が使用されます。

~からUnix時分割システムの進化(関連テキストは最も明るい部分):

近代的な形式のプロセス制御は、数日以内に設計され実装されています。既存のシステムにどれだけ簡単に適用できるかは驚くべきことです。デザインのわずかに珍しい特徴のいくつかは、既存のコンテンツに対するコンパクトでコーディングしやすい変更を示すため、正確に現れました。。良い例は、フォークと実行機能の分離です。新しいプロセスを生成する最も一般的なモデルには、実行するプロセスを指定するプログラムが含まれます。 Unix で分岐したプロセスは、明示的な実行を実行するまで親プロセスと同じプログラムを実行し続けます。機能の分離は確かにUnixに限定されているわけではなく、実際、トンプソンが知っていたバークレー時分割システムにも存在していた。。それにもかかわらず仮定するのが妥当に見える。フォークは他に何も変更せずに簡単に実装できるため、Unixに存在します。。システムは複数(たとえば2つ)のプロセスを処理しました。プロセステーブルがあり、プロセスはメインメモリとディスク間で交換されます。最初はフォークの実装だけが必要です。

1) プロセステーブルの拡張

2)既存のスワップIOプリミティブを使用して、現在のプロセスをディスクスワップ領域にコピーするフォークコールを追加し、プロセステーブルをいくつか調整しました。

実際、PDP-7のフォークコールには正確に27行のアセンブリコードが必要です。もちろん、オペレーティングシステムやユーザープログラムへの他の変更も必要でしたが、そのいくつかは非常に興味深く予想外のものでした。しかし、結合されたフォークの実行はより複雑です。、exec自体が存在しないため、その機能は明示的なIOを使用してシェルですでに実行されています。

その論文の後、Unixは発展を続けてきました。fork2番目は、もはやexecプログラムを実行する唯一の方法ではありません。

  • フォークより効率的なフォークで作成され、新しいプロセスがフォークの直後にexecを実行しようとするときに使用されます。 vforkが実行されると、親プロセスと子プロセスは同じデータスペースを共有し、子プロセスがプログラムを実行または終了するまで、親プロセスは一時停止されます。

  • posix_spawn単一のシステムコールで新しいプロセスを作成し、ファイルを実行します。複数のパラメータを使用し、発信者が開いたファイルを選択的に共有し、そのシグナリング構成およびその他の属性を新しいプロセスにコピーできます。

おすすめ記事