プロセスの実装について
コンピュータのOS(オペレーティングシステム)は、同時に複数のプログラムを実行するために プロセス という単位で管理を行います。各プロセスは、カーネルによって プロセスディスクリプタ(Process Descriptor)というデータ構造で表され、現在の状態を記録しています。
プロセスの状態管理
プロセスは実行中だけでなく、待機中や停止中のこともあります。そのため、カーネルはプロセスの状態を適切に保存し、必要に応じて再開できるようにする仕組みを持っています。
例えば、あるプロセスの実行を一時的に停止する際、カーネルは プロセッサレジスタ(CPUの作業用メモリ)の内容をプロセスディスクリプタに保存します。レジスタには以下のような種類があります。
レジスタの種類
-
プログラムカウンタ(PC)・スタックポインタ(SP)
- プログラムカウンタ(PC) は、CPUが次に実行すべき命令のアドレスを保持します。
- スタックポインタ(SP) は、関数の呼び出し時に使うメモリ(スタック)の位置を指します。
-
汎用レジスタ
- 計算やデータの一時保存など、さまざまな用途で使用されます。
-
浮動小数点レジスタ
- 小数や科学計算などの演算に特化したレジスタです。
-
プロセッサ制御レジスタ
- CPUの動作を制御するための特殊なレジスタです。
-
メモリ管理レジスタ
- プロセスごとに異なるメモリ領域を管理するためのレジスタです。
プロセスの実行再開
プロセスを再開する場合、カーネルは プロセスディスクリプタ に保存しておいたレジスタの内容をCPUに復元します。特に プログラムカウンタ(PC) に保存された値を読み込むことで、プロセスは停止した場所から実行を続けることができます。
この仕組みによって、OSは複数のプロセスをスムーズに切り替えながら実行することができます(コンテキストスイッチ と呼ばれます)。
プロセスの待機状態と管理
CPU上で実行されていないプロセスは、多くの場合 何らかの事象(イベント)を待機 しています。例えば、次のような場面でプロセスは待機状態になります。
- 入出力(I/O)待ち:ファイルの読み書きが完了するのを待つ
- ユーザー入力待ち:キーボードやマウスの操作を待つ
- 他のプロセスの処理待ち:特定のタスクが終わるのを待つ
UNIXカーネルでは、こうした 待機中のプロセスを管理するためのキュー(待ち行列) を用意しています。各キューには、特定の事象を待っているプロセスが登録されており、イベントが発生するとキューから取り出され、再び実行可能な状態になります。
この仕組みにより、OSは無駄なくプロセスを制御し、システム全体の効率を向上させています。
免責事項
本記事は、筆者の理解に基づいて執筆したものです。正確性には十分配慮していますが、内容の誤りや最新の情報と異なる可能性があります。
本記事の内容を参考にしたことによるいかなる損害についても、筆者は責任を負いかねますのでご了承ください。
正確な情報や書籍に書かれている根拠等はサポートしませんので、ご自身で公式ドキュメントをお調べください。
よって、この内容をAIの学習データに活用することはおすすめしません。