プロセスはプログラムの実行単位のこと
実行に必要な設定が終わると、プログラムコード中の「エントリポイント」と呼ばれるアドレスから実行が始まる。しかしマルチプロセスのOSでは、プログラムはずっと動いているわけではなく、割り込みなどによってほかのアプリケーションに切り替わる。実行中の「管理情報」を含めたものを、「プロセス」と呼ぶ(図2)。「プロセス=実行ファイル」ではないし、「プロセス=実行イメージ」だけでもない。
Windowsでは、同じプログラムを複数起動できる。例えばメモ帳を複数起動すると、それぞれのウインドウが開く。だが、実行ファイルは「notepad.exe」ひとつだけだし、それぞれのウインドウで実行できる機能もまったく同じだ。しかし、ひとつのウインドウに文字を入力しても、ほかのウインドウにも同じ文字が入るわけはない。同じメモ帳のプログラムではあっても、プロセスとしては別になっているわけだ。
しかしプロセスは別でも、前回で簡単に説明したように、プログラムのコード部分は同じならば、そこは複数プロセスで共有されている。実行イメージのうち、変数に相当する部分はそれぞれ違ってくるので、各プロセスごとに固有の領域が物理メモリー上に確保され、これが仮想メモリーに割り当てられる。つまり実行イメージの中には、同一アプリケーション間で共有される部分と、プロセス固有の部分に分かれている。
さてプロセスには、CPUの内部状態なども含まれる。前回解説したように、アプリケーションを実行する前にWindowsは、セグメントディスクリプタテーブルやセグメントレジスターを設定する。またページテーブルなどの仮想記憶用のデータを用意し、関連のレジスターを設定する。
アプリケーションが実行している最中に割り込みがかかると、CPUは現在の内部状態を保存し、カーネル内部の割り込み処理ルーチンを実行する。そのとき保存されたアプリケーションを実行している最中のCPUの内部状態を、「コンテキスト」と呼ぶ。コンテキストはプロセスの一部だが、CPUの内部にあって、プログラムの実行とともに常に変化し続けている。そのため、マルチプロセスのOSでほかのプロセスへ切り替えることを、「コンテキストスイッチ」と呼ぶ。
x86 CPUでは、このコンテキスト切り替えをハードウェアで行なえる。例えば、アプリケーションの実行中に割り込みが発生した場合、コンテキスト切り替えを自動で行なって、カーネル側に制御が移るように処理する。そのために、メモリーにはCPUの内部状態を保存する専用のデータ構造が用意してあり、これを「タスクステートセグメント」と呼ぶ。
ただし、ハードウェアによるコンテキスト切り替えは、ハードウェアで実行できるように単純な動作になっているので、すべての内部情報を保存するわけではない。そのためWindowsではこの仕組みを使わずに、独自の方法でコンテキスト切り替えを行なっている。
OSから見ると、プロセスがひとつの実行単位になる。またプロセスは、OSによる「リソース」割り当ての単位にもなっている。例えばメモリーは、プロセスごとに管理される。複数のプロセスのメモリーが別々に管理されるということは、それぞれに個別の仮想メモリー空間が割り当てられるということでもある。そのため32bit版のWindowsでは、プロセスが利用できるメモリー空間は最大2GB(標準設定の場合)になっているわけだ(関連記事)。
この連載の記事
-
第13回
PC
ARM版Windows 8実現の布石となったWindows 7の「MinWin」 -
第12回
PC
アプリがWindowsの機能を使うには? APIとDLLの仕組み -
第11回
PC
マルチコアCPUの消費電力はスケジューリングで変わる? -
第10回
PC
AMD FX向けにパッチで修正 スケジューラーが抱える難題 -
第9回
PC
マルチコアCPUを賢く使いこなす スケジューリングの秘密 -
第7回
PC
Windowsのメモリー管理をx86の仕組みから読み解く -
第6回
PC
メモリー不足を根本的に解決する64bit OSの仕組み -
第5回
PC
Windows 8でMetro Styleアプリを動かす「WinRT」 -
第4回
PC
Windowsを動かすデバイスドライバーの仕組み 前編 -
第3回
PC
OSの仕事はハードウェアをアプリから「隠す」こと? - この連載の一覧へ