このページの本文へ

基礎から覚える 最新OSのアーキテクチャー 第8回

意味の違いがわかる? タスクとプロセスとスレッド

2011年12月01日 18時29分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

プロセスはプログラムの実行単位のこと

図2 プロセスに含まれる要素

 実行に必要な設定が終わると、プログラムコード中の「エントリポイント」と呼ばれるアドレスから実行が始まる。しかしマルチプロセスのOSでは、プログラムはずっと動いているわけではなく、割り込みなどによってほかのアプリケーションに切り替わる。実行中の「管理情報」を含めたものを、「プロセス」と呼ぶ(図2)。「プロセス=実行ファイル」ではないし、「プロセス=実行イメージ」だけでもない。

 Windowsでは、同じプログラムを複数起動できる。例えばメモ帳を複数起動すると、それぞれのウインドウが開く。だが、実行ファイルは「notepad.exe」ひとつだけだし、それぞれのウインドウで実行できる機能もまったく同じだ。しかし、ひとつのウインドウに文字を入力しても、ほかのウインドウにも同じ文字が入るわけはない。同じメモ帳のプログラムではあっても、プロセスとしては別になっているわけだ。

 しかしプロセスは別でも、前回で簡単に説明したように、プログラムのコード部分は同じならば、そこは複数プロセスで共有されている。実行イメージのうち、変数に相当する部分はそれぞれ違ってくるので、各プロセスごとに固有の領域が物理メモリー上に確保され、これが仮想メモリーに割り当てられる。つまり実行イメージの中には、同一アプリケーション間で共有される部分と、プロセス固有の部分に分かれている。

 さてプロセスには、CPUの内部状態なども含まれる。前回解説したように、アプリケーションを実行する前にWindowsは、セグメントディスクリプタテーブルやセグメントレジスターを設定する。またページテーブルなどの仮想記憶用のデータを用意し、関連のレジスターを設定する。

 アプリケーションが実行している最中に割り込みがかかると、CPUは現在の内部状態を保存し、カーネル内部の割り込み処理ルーチンを実行する。そのとき保存されたアプリケーションを実行している最中のCPUの内部状態を、「コンテキスト」と呼ぶ。コンテキストはプロセスの一部だが、CPUの内部にあって、プログラムの実行とともに常に変化し続けている。そのため、マルチプロセスのOSでほかのプロセスへ切り替えることを、「コンテキストスイッチ」と呼ぶ。

 x86 CPUでは、このコンテキスト切り替えをハードウェアで行なえる。例えば、アプリケーションの実行中に割り込みが発生した場合、コンテキスト切り替えを自動で行なって、カーネル側に制御が移るように処理する。そのために、メモリーにはCPUの内部状態を保存する専用のデータ構造が用意してあり、これを「タスクステートセグメント」と呼ぶ。

 ただし、ハードウェアによるコンテキスト切り替えは、ハードウェアで実行できるように単純な動作になっているので、すべての内部情報を保存するわけではない。そのためWindowsではこの仕組みを使わずに、独自の方法でコンテキスト切り替えを行なっている。

 OSから見ると、プロセスがひとつの実行単位になる。またプロセスは、OSによる「リソース」割り当ての単位にもなっている。例えばメモリーは、プロセスごとに管理される。複数のプロセスのメモリーが別々に管理されるということは、それぞれに個別の仮想メモリー空間が割り当てられるということでもある。そのため32bit版のWindowsでは、プロセスが利用できるメモリー空間は最大2GB(標準設定の場合)になっているわけだ(関連記事)。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン