Linuxにおけるforkの動作原理
Linuxにおけるforkは新たなプロセスを作成するシステムコールの一つです。fork システムコールを呼び出すと、OSは現在プロセスにおけるすべての資源(コード、データ、スタックなど)をコピーして、新しいプロセスを作成します。その新しいプロセスは子プロセスと呼ばれます。子プロセスは元のプロセスの複製で、forkを呼び出した場所から実行を開始します。
フォークの実行原理は次のとおりです。
- フォークが呼び出されると、OSは子プロセスに新しいプロセスID(PID)を割り当てます。
- オペレーティングシステムが子プロセスに新しいプロセス制御ブロック(PCB)を作成し、子プロセス状態の情報を格納する。
- オペレーティングシステムは、親プロセスのコードセグメント、データセグメント、スタックセグメントを子プロセスのアドレス空間にコピーします。
- OSは子プロセスに独立したユーザーモードスタックを作成する。
- 親プロセスと子プロセスのPCBはそれぞれready状態に設定され、スケジューラによる実行待ち状態になります。
フォーク後に、親プロセスと子プロセスのコード、データ、スタックは同じものになり、主な違いは、返される値です。
- 親プロセスでは、fork は子プロセスの PID を返すので、その返り値によって自分が親プロセスか子プロセスか判断できる。
- fork では子プロセスが0を返すため、子プロセスかどうかは返り値で判断できる
フォーク後に親プロセスと子プロセスはどちらも後続のコードを実行し続けますが、別々のプロセスであり、それぞれが独自のアドレス空間とリソースを持ちます。