forkとexecの大きな違いは、forkは親プロセスを維持したまま新しいプロセスを作成しますが、execは親プロセスを維持したまま新しいプロセスを作成することです。
コンピュータは、カーネルモードとユーザーモードの2つのモードで動作します。
カーネルモードでは、プログラムはメモリやハードウェア資源に直接アクセスすることができる。
ユーザーモードでは、プログラムはメモリやハードウェア資源に直接アクセスできない。
したがって、カーネルモードはユーザーモードよりも特権的なモードです。
プログラムがメモリやリソースにアクセスする必要があるときは、システムコールを介してカーネルにリクエストを送ります。
すると、ユーザーモードからカーネルモードに切り替わる。
タスクが完了すると、モードはユーザーモードに戻る。
UNIXシステムには様々なシステムコールがあります。
そのうちの2つがforkとexecです。
フォークとは
プロセスとは、実行中のプログラムのことです。
fork()は、プロセスを作成するためのシステムコールです。
あるプロセスがfork()を呼び出すと、そのプロセスのコピーが作成される。
既存のプロセスが親プロセスで、新しいプロセスが子プロセスとなる。
ただし、この子プロセスは親プロセスと同様です。
子プロセスを作成する際、変数や開いているファイル、アドレス空間など、親の状態が子プロセスにコピーされる。
つまり、親プロセスと子プロセスは異なる物理アドレス空間に存在します。
したがって、親プロセスで行われた変更は子プロセスには反映されませんし、その逆も同様です。
What is exec
exec()システムコールは、プロセスを作成するためにも使用されます。
exec()が呼ばれると、現在実行中のプロセスが終了し、新しく作成されたプロセスに置き換わります。
言い換えると、exec()を呼び出した後は、新しいプロセスだけが存在します。
親プロセスは終了する。
さらに、このシステムコールは、親プロセスのアドレス空間、テキストセグメント、データセグメントを子プロセスに置き換えます。
フォークとエクゼキューションの違い
定義
fork は UNIX オペレーティングシステムにおける操作で、プロセスが自分自身のコピーを作成できるようにするものです。
しかし、execはUNIXオペレーティングシステムにおいて、前のプロセスを置き換えてプロセスを作成する操作です。
このように、forkとexecの主な違いを説明する。
親プロセス
fork()を呼んだ後、親プロセスと子プロセスが存在する。
一方、exec()を呼んだ後は、子プロセスだけが存在し、親プロセスは存在しない。
従って、この点もforkとexecの違いです。
結果
また、forkは親プロセスと同じような子プロセスを作成し、execは子プロセスを作成して親プロセスと入れ替える。
アドレス空間
さらに、fork と exec のもう一つの違いは、そのアドレス空間です。
fork()では、親プロセスと子プロセスが異なるアドレス空間にあるのに対し、exec()では、子プロセスのアドレス空間が親のアドレス空間に取って代わります。
結論
簡単に説明すると、UNIX系OSには様々なシステムコールが用意されており、その中の2つがforkとexecです。
forkとexecの主な違いは、forkは親プロセスを保持したまま新しいプロセスを作成するのに対し、execは親プロセスを保持せずに新しいプロセスを作成する点です。