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

この連載の記事
- 第13回 ARM版Windows 8実現の布石となったWindows 7の「MinWin」
- 第12回 アプリがWindowsの機能を使うには? APIとDLLの仕組み
- 第11回 マルチコアCPUの消費電力はスケジューリングで変わる?
- 第10回 AMD FX向けにパッチで修正 スケジューラーが抱える難題
- 第9回 マルチコアCPUを賢く使いこなす スケジューリングの秘密
- 第7回 Windowsのメモリー管理をx86の仕組みから読み解く
- 第6回 メモリー不足を根本的に解決する64bit OSの仕組み
- 第5回 Windows 8でMetro Styleアプリを動かす「WinRT」
- 第4回 Windowsを動かすデバイスドライバーの仕組み 前編
- 第3回 OSの仕事はハードウェアをアプリから「隠す」こと?
- この連載の一覧へ