本記事では、プロセスの生成と消去が実際にどのような手順で行われるのかを解説します。
プロセスの生成
プロセスは新しいプロセスを生成できることができます。このとき、プロセスを生成する側を親プロセス、生成される側を子プロセスと呼びます。さらにその子プロセスを孫プロセスと呼んだりもします。
ここで、一番最初のプロセスは誰が生成するのかという疑問があるかと思います。これは、カーネルによって作成される特別なプロセスです。Unix系のOSでは、最初のプロセスはinitと呼ばれます。
このinitを親としてプロセスが生成され、下図のようなプロセスツリーを構成して、様々なプロセスが実行されます。このような仕組みにより、複数のプロセスが同時に生成および実行されます。

最初のプロセスの生成とユーザプログラムの実行までの流れ
最初のプロセスinitが生成され、ユーザプログラムが実行されるまでの流れを以下に示します。
- カーネルの起動
- 電源が入ると、ブートローダーがカーネルをメモリに読み込み、カーネルが制御を取得します。
- 最初のプロセス init の生成
- カーネルは特別なプロセスである initプロセスを生成します。
- initプロセスは、システムの初期化を行い、他のプロセスを生成します。
- システムプロセスの起動
- initは設定ファイルを読み込み、必要なサービスを起動します。
- ユーザープログラムの起動
- ユーザーがターミナルやグラフィカルユーザーインターフェース(GUI)からプログラムを起動すると、シェルが新しいプロセスを作成します。
- スケジューリングと実行
- スケジューラがプロセスを選択し、CPUに割り当てることでユーザープログラムが実行されます。
プロセス生成の具体的な手順
プロセスの生成は具体的には下記の手順で行われる。
- プロセス生成が命令される
- プロセス領域の割り付け
- メインメモリ上にプロセス領域を確保する
- PCBの割り付け
- メインメモリ上にPCBの領域を確保する
- PCBの設定
- PCBリストの更新
- 実行可能キューの末尾にPCBを追加する
- プロセス状態の設定
- プロセス状態を実行可能にする
これらの手順が、OSに処理が切り替わってから、割り込み処理とスケジューリングの間で、カーネルが実行します。
プロセス領域
プロセス領域は、コード領域、データ領域、スタック領域、ヒープ領域から構成されます。
- コード領域
- テキスト領域とも呼び、実際にプログラムコードが保存されている領域です。
- コンパイル後のマシンコードを含む部分で、コンパイル段階で領域サイズはわかるため、固定サイズの領域です。
- この部分は通常、複数のプロセスで共有され、変更されない領域になります。
- データ領域
- 初期値を設定している、または設定していない静的変数を保存する領域です。
- この部分もコンパイルした段階でサイズが決定されるため、固定サイズの領域です。
- 複数のプロセスで共有される場合もあります。プログラムが実行してから終了するまでずっと確保されるデータ領域です。
- スタック領域
- 関数呼び出しごとに生成される局所変数や関数の戻り先アドレスなどを保存する領域です。
- 個々のプロセスごとに用意されるため、他のプロセスと共有されることはありません。
- ヒープ領域
- 実行中に動的にメモリを確保する領域です。
- メモリが必要に応じて割り当てられ、不要になったら解放されます。
- ヒープ領域は基本的にはプロセスごとに独立したメモリ空間であり、他のプロセスと共有されることはありません。
ヒープ領域は領域が確保されるたびに下方向に伸びていき、スタック領域は上方向に伸びていきます。

プロセス領域の確保方法
プロセス用の領域を確保する場合、以下の2つの方法がある。
1つ目は、親プロセスと子プロセスの間でコード領域を共有し、データ領域とスタック領域をコピーする方法です。Unixにおけるforkシステムコールでは、この方法が使用されています。

2つめは、コード領域は親子で共有し、データ領域とスタック領域をコピーする方法です。これはスレッドを実現するために使用されることが多いです。

それぞれの方法では、子プロセスにコピーされた領域は独立したメモリ空間として扱われます。
プロセスの消去
プロセスは正常に終了する場合と異常終了する場合と消去の仕方が分かれます。
正常終了
- プロセスが正しく実行され、正常に終了した場合。
- この場合、OSは以下の手順で処理を行います。
- プロセスが使用していたメモリ領域を解放。
- PCBを削除。
- PCBリストを更新。
異常終了
- プロセスが例外やエラーにより予期せず終了した場合。
- この場合、OSは以下の手順で処理を行います。
- プロセスが使用しているリソースを解放。
- PCBやプロセス領域からHWリソースの情報を削除。
- HWリソースへの使用要求を強制的に取り下げる。
- プロセス領域を解放。
- PCBを削除。
- PCBリストを更新。
プロセスは実行中状態、実行可能状態、待ち状態のいずれの状態でも消去することが可能です。
プロセスの中断と再開
プロセスの中断
プロセスの中断 (suspend) は、システムの負荷が高くなったときに、一時的に特定のプロセスを実行可能状態から除外するために行われます。中断されたプロセスは、システムや他のプロセスによって再開されるまで進行できません。
長時間中断される場合、プロセスが使用している資源を解放する必要があります。資源の解放に関する方針は、資源の性質に依存します。
- 主記憶: プロセスが中断された場合、直ちに解放されます。
- ディスク: 短期間の中断の場合はそのまま維持されますが、長期間中断される場合は解放されることがあります。
プロセスの再開
プロセスの再開 (resume) は、中断した時点の命令から再び処理を開始することを意味します。
以下のような場面で重要となります。
- システム障害の回復: システム障害が回復した後に再開されます。
- プログラムのデバッグ: プロセスの部分的な結果を確認しながら再開します。
- 負荷の軽減: 負荷が通常のレベルに戻った際に再開されます。
プロセスは自ら中断する場合もあれば、他のプロセスによって中断されることもあります。特にCPUが1つのシステムでは、他のプロセスは中断操作を行うことはできません。一方、複数のCPUを持つシステムでは、他のCPU上で実行中のプロセスが中断操作を行うことが可能です。
まとめ
本記事では、プロセスの生成と消去の間がどのような手順で実行されるのかを解説しました。
コメント