特集
Windows 9x or Windows 2000?

8.Windows 2000のプロセス管理メカニズム(1)

デジタルアドバンテージ
2000/08/23


 Windows 9xマルチタスク システムは、プリエンプティブにスケジューリング可能なマルチスレッドに対応されたものの、従来のWindows 3.xとの互換性を維持するために、重大な制限が加えられていることが分かった。Windows 2000のマルチタスク システムも、一言でいえばWindows 9xと同じく「プリエンプティブにスケジューリング可能なマルチスレッド環境」だといえる。しかしWindows 9xとは異なり、Windows 2000は、従来との互換性を意識しつつも、次世代のOSとしての将来性に重点を置き、まったく新規にカーネルを設計し直しており、Windows 9xのような互換性上の制限は存在しない(Win16Mutexなどは存在しない)。別稿の「3.Windows 2000カーネルの概要(1)」で述べたとおり、Windows 2000カーネルは対称型マルチプロセッサ システム(SMP)に対応しており、マルチプロセッサ環境では、複数のスレッドをそれぞれのプロセッサ上で完全に同時に実行することができる。このためWindows 2000カーネルのプロセス管理機構には、複数プロセッサへの実行スレッドの配分や、複数プロセッサ間でのスレッドの同期機構などが新たに組み込まれている。

Win16アプリケーションをプリエンプティブに実行可能

 Windows 9xで従来のWin16アプリケーションを実行した場合、同時実行されるWin16アプリケーション同士は、ノンプリエンプティブなスケジューリングがなされると述べた(つまり、いつまでもメッセージ処理を終了しないWin16アプリケーションがいると、他のWin16アプリケーションは動くことができない。詳細は「Windows 9xのプロセス管理メカニズム(2)」参照)。しかしWindows 2000では、従来のWin16アプリケーションについても、必要ならプリエンプティブにスケジューリングさせることが可能である。

 Windows 2000環境でWin16アプリケーションを実行すると、Windows 2000カーネル内部で16bit環境をエミュレートするためのNTVDM(NT Virtual DOS Machine)が起動される。この際、すでに別のWin16アプリケーションによってNTVDMが起動されているときには、そのNTVDM内でWin16アプリケーションをノンプリエンプティブに実行するのだが、設定によっては、さらに別のNTVDMを起動して、その内部でWin16アプリケーションを実行することができる。異なるNTVDM同士はプリエンプティブにスケジューリングされるため、結果としてそれらの内部で実行されるWin16アプリケーションがプリエンプティブにスケジューリングされることになる。このための具体的な方法については、別稿ですでに述べているので参照されたい(「Windows 2000カーネルの概要(1)」)。

Windows 2000でのプロセス生成のメカニズム

 Windows 2000においても、仮想メモリ空間やI/O空間、ファイル ハンドルなどのシステム資源はプロセス単位に割り当てられる点、プロセスはその内部に最低1つ以上のスレッドを持ち、実行スケジューリングはこのスレッドを単位として行われる点はWindows 9xと変わらない。しかしアプリケーションが起動されてから、プロセスが生成され、スレッドが実際にスケジュールされるまでの過程は、Windows 2000とWindows 9xではまったく異なる。本稿の主眼は、アプリケーション環境レベルでのWindows 9xとWindows 2000の違いを明らかにすることなので、ここでWindows 2000カーネルの奥深くを詳しく説明することは省略するが、以下でごく簡単に、Windows 2000のプロセス生成のメカニズムを述べておこう。

 本特集の冒頭部分で述べたとおり(「Windows 2000カーネルの概要(1)」参照)、Windows 2000上では、ネイティブなWin32アプリケーション以外にも、Win16アプリケーションやMS-DOSアプリケーション、OS/2アプリケーション(Ver.1.2の16bit キャラクタモード アプリケーション)、POSIXアプリケーションなどを同時に実行することができる。ユーザーは、実行ファイル(.exeファイルなど)がWin32アプリケーションなのか、Win16アプリケーションなのか、POSIXアプリケーションなのかを意識することなく、起動することが可能だ。

 Windows 2000環境でアプリケーションを実行した場合、まず最初に行われるのは、そのアプリケーションがどの環境を前提としたものかを特定し、ネイティブのWin32アプリケーションとして用意された適切なサポート イメージを起動することである。たとえば起動されたアプリケーションがネイティブのWin32アプリケーションならそのまま起動されるが、たとえば起動されたのがWin16アプリケーションやMS-DOSアプリケーションなら、これらのサポート イメージであるNTVDM.EXEが最初に実行され、当該アプリケーションはこのサポート イメージによって実行されることになる(OS/2アプリケーションならOS2.EXEが、POSIXアプリケーションならPOSIX.EXEがサポート イメージである)。

 Win16アプリケーションが実行されたとき、通常はすべてのWin16アプリケーションで共有するNTVDMを探し、これがすでに起動されていれば、その内部で当該Win16アプリケーションを実行することになるが(まだNTVDMが起動されていなければ起動する)、プロパティで[別メモリ領域で実行する]が指定されているWin16アプリケーションでは、独立したNTVDMが実行される。

 Windows 2000上で実行されたすべてのプロセスに対しては、Executive内でそれに対応するプロセス オブジェクトが生成され、このオブジェクトに対してプロセスIDや仮想メモリ空間が割り当てられる。以後、Windows 2000システム内部では、このプロセス オブジェクトによってプロセスが管理されることになる(アプリケーションが使用するプロセス ハンドルは、このプロセス オブジェクトを識別するものである)。

 Executiveプロセス オブジェクトが生成されたら、次にこのプロセスのプライマリ スレッドが生成され、生成された新しいプロセスの情報がWin32サブシステムに通知されて、最終的にスレッドのスケジューリング(実行)が開始される。

Windows 2000で利用可能なプロセス/スレッド モニタ ツール

 Windows 2000で現在実行されているプロセスやスレッドの状態をモニタするためのツールがいくつか提供されている。最も身近なものは、次に示すタスク マネージャの[プロセス]タブだろう。この方法では、スレッドの状態をモニタすることはできないが(プロセス内に存在するスレッド数を表示することは可能)、現在実行されているプロセスを一覧表示し、それらが使用しているCPU時間やメモリ使用量などを表示することができる。タスク マネージャを起動するには、タスク バーの空き領域をマウスで右クリックして表示されるポップアップ メニューの[タスク マネージャ]を実行するか、キーボードで[Ctrl]+[Shift]+[Esc]を同時に押せばよい。

タスク マネージャの[プロセス]タブ
特別なツールを用意しなくても、Windows 2000に標準で提供されているタスク マネージャを起動し、[プロセス]タブを表示すれば、現在実行されているプロセスに関するかなり詳細な情報を表示させることができる。標準状態ではわずかな情報しか表示されないが、[表示]−[列の選択]メニューから表示されるダイアログで、タスク マネージャで表示可能なすべての項目を選択することが可能である。
  現在実行されているプロセス イメージの名前。
  プロセスID。
  現時点でのCPU使用率。すべてのプロセスの値を加えると100(%)になる。
  プロセス開始から現在までのCPU使用時間の累積を秒単位で表した値。
  プロセスによるメモリ使用量。

 デフォルトではインストールされていないが、Windows 2000のインストールCD-ROMにある\supportディレクトリには、Windows 2000管理者向けの便利なツールがいつくか提供されている(これらのツールをインストールするには、\support\toolsディレクトリにあるセットアップ プログラムを起動する)。この中にあるProcess Viewer(pviewer.exe)を利用すれば、現在実行中のプロセスや、そのプロセスから生成されたスレッドを一覧表示できると同時に、一覧からプロセスを選択してこれを強制終了させたり、スレッドの優先順位をGUIを使って変更したりすることができる。従来のWindows NT 4.0では、このProcess Viewerはリソース キットに含まれるツールとして提供されていたのだが、Windows 2000では、インストールCD-ROM内で提供されるようになった。

Process Viewer
Process Viewerを利用すれば、現在実行中のプロセスやスレッドを一覧表示できるだけでなく、一覧されたプロセスを選択してこれを強制終了させたり、スレッドを選択してこのプライオリティを変更したりすることができる。
  モニタ対象のコンピュータ名。Process Viewerでは、ネットワーク上の他のコンピュータのプロセス状況をモニタすることもできる。
  現在実行されているプロセス一覧。カッコ内の数値は、プロセスIDを16進表記したもの。
  のプロセス一覧から適当なプロセスを選択し、このボタンをクリックすると、プロセスを強制終了させることができる。
  で選択したプロセスのベース プライオリティ。
  で選択したプロセス内のスレッド一覧。画面はインターネット エクスプローラ(iexplorer)のプロセスを選択し、スレッドを一覧したところ。
  で任意のスレッドを選択し、ここで適当なプライオリティを指定することで、スレッドのプライオリティを変更することができる。
  各種スレッド情報。たとえば「Context Switches」は、コンテキスト スイッチ(状態遷移)の回数を表している。

 最後は、Windows 2000 Resource Kit(Professional/Server)の付録CD-ROMで提供されているQuick Sliceである。このQuick Sliceでも、現在実行中のプロセスが一覧表示される点はタスク マネージャやProcess Viewerと変わらないが、Quick Sliceでは、各プロセスごとに、カーネル モードで消費されたCPU時間と、ユーザー モードで消費されたCPU時間がダイナミックにグラフ表示される。

Quick Slice
Resource Kitの付録CD-ROMに収録されているプロセス モニタ ツール。このQuick Sliceでは、現在実行されているプロセスが一覧され、各プロセスごとに、カーネル モードで消費されたCPU時間と、ユーザー モードで消費されたCPU時間がダイナミックにグラフ表示される。
  現在実行されているプロセス一覧。
  プロセスID
  グラフ表示された消費CPU時間。赤色はカーネル モードで費やされたCPU時間、青色はユーザー モードで費やされたCPU時間の割合を表している。
  任意のプロセスをマウスでダブルクリックすると、そのプロセスによって生成されたスレッド一覧が別ウィンドウとして表示される。→
 
Quick Sliceで表示されるスレッドの一覧
Quick Sliceのメイン ウィンドウに表示されるプロセス一覧から、任意のプロセス項目をマウスでダブルクリックすると、このような別ウィンドウが表示される。ここには、選択したプロセスから生成されたスレッドが一覧表示される。グラフはメイン ウィンドウでの表示と同じく、そのスレッドで費やされたCPU時間の割合である。この例は、メイン ウィンドウのプロセス一覧から、インターネット エクスプローラのプロセス(iexplorer.exe)をダブルクリックしたところ。
  現在インターネット エクスプローラから生成されているスレッド一覧。「TID」はスレッドID。
  スレッドによって費やされたCPU時間。メイン ウィンドウでの表示と同じく、赤色はカーネル モードで費やされたCPU時間、青色はユーザー モードで費やされたCPU時間の割合を示している。

Windows 2000のスレッド スケジューリング

 Windows 2000のスレッド スケジューリングも、Windows 9xのそれと同様に、スレッドのプライオリティ(優先順位)に応じて、プライオリティの高いものが優先的に実行されるようになっている。スレッドのプライオリティを示す数値も、Windows 9xと同じく、0〜31までの32段階の値を用いる(数値が大きいほど優先順位が高い)。スケジューリングはあくまでスレッドのプライオリティを基にして行われ、そのスレッドがどのようなプロセスに属するのかなどは考慮されない。つまりシステム プロセスのスレッドであろうと、アプリケーション プロセスのスレッドであろうと、あくまでスレッドのプライオリティだけがスケジューリングの評価対象になるということだ。

 別稿の「Windows 9xのプロセス管理メカニズム(2)」で述べたとおり、Windows 9xのスレッド スケジューリングでは、タイム スライスごとに、その時点で最もプライオリティの高いスレッドを選択し(同一プライオリティのスレッドが複数存在するときには、それらをすべて選択し)、タイムスライスのCPU時間をそれらのスレッドに割り当てる方式をとっていた。Windows 9xでは、フォアグラウンド アプリケーション側のスレッドと、バックグラウンド側スレッドの調整は、スレッドのプライオリティを変更することでなされる。

 これに対しWindows 2000のスレッド スケジューリングでは、スレッドのプライオリティだけでなく、スレッドの実行時に、クォンタム(quantum:「(特定)量」という意味)と呼ばれるスレッド実行の時間単位を決定し、このクォンタムを調整することで、フォアグラウンド/バックグラウンド側スレッドの効率運用を可能にしている。クォンタムは、あるスレッドがスケジューリングされるときに、そのスレッドに割り当てられるCPU時間単位を決定するもので、プライオリティがそのスレッドに等しいか、それより優先度の高いスレッドが途中で現れないかぎり、クォンタムの時間単位だけスレッドが連続実行される。クォンタムや、具体的なスレッド スケジューリングの方式については後述する。

スレッドの状態遷移

 ひと口に「実行中のスレッド」といっても、実際には、他のスレッドとの同期をとる目的や、周辺機器への入出力処理が完了するのを待つなど、一時停止の状態にあるスレッドもある。スレッドは、生成されてから終了されるまで、いくつかの状態を遷移しながら、CPU時間を割り当てられて「本当に」実行されたり、一時停止(サスペンドとも呼ばれる)されたりしている。スレッドが取りうる各種の状態と、その遷移を図示すると次のようになる。

Windows 2000におけるスレッドの状態遷移
Windows 2000で起動されたスレッドは、このような状態遷移を繰り返しながらその一生を終える。
  生成されたスレッドは、まず初期化される。
  スレッドが初期化され、実行可能な状態になったら、それは「レディ(ready)」の状態となり、レディ キューと呼ばれるキューに入れられる。あるタイム スライスで、スケジューリングの評価対象となるスレッドは、レディ キューに入れられた実行可能状態のスレッドだけである。
  あるプロセッサでのスレッドの実行が決定すると、そのスレッドはまず、「レディ」の状態から「スタンバイ」の状態に遷移する。スタンバイの状態になれるスレッドは、各プロセッサごとに1つだけである。
  条件が整った段階で、「スタンバイ」の状態にあるスレッドがプロセッサで実行される。実行状態になったスレッドは、自分より高いプライリティを持つスレッドに割り込まれるか、自発的に待機状態になるか、クォンタムを使い切るまで実行状態が続く。
  スレッドの実行によって処理が完了したなら、スレッドは「終了」状態に遷移し、スレッドは削除される。
  スレッドの実行中に、より高いプライオリティのスレッドによる割り込みを受けるか、クォンタムを使いきったスレッドのうち、引き続き実行可能状態にあるものは「レディ」状態に遷移する。
  「スタンバイ」の状態で実行を待っている途中に、自分よりもプライオリティの高いスレッドによる割り込みを受けた場合には、再度「レディ」状態に遷移する。
  「実行」状態にあるスレッドにおいて、他のスレッドとの同期や、I/O待ちなどが発生した場合には、自身を「待機」状態に遷移させる。また何らかの理由により、外部から強制的に実行中のスレッドが「待機」状態にさせられる場合もある。
  「待機」状態にあるスレッドのうち、すぐにでも実行が可能で、他にプライオリティの高いスレッドがレディになっていなければ、直接「実行」状態に遷移する。
  「待機」状態にあるスレッドのうち、スレッド自身はすぐにでも実行が可能だが、それを実行するためのカーネル スタックがスワップ アウトされていた場合などは、スレッドは「遷移」状態に遷移する。
  「待機」状態にあるスレッドが待機を完了すると、「レディ」状態に遷移する。
  カーネル スタックがスワップ アウトされていたために「遷移」状態に移ったスレッドで、必要なカーネル スタックがスワップ インされて実行可能になったときには(待機が完了したときには)「レディ」状態に遷移する。
 

 INDEX
  [特集]Windows 9x or Windows 2000?
     1.イントロダクション
     2.Windows 9xカーネルの概要
      コラム:Windows歴史、メモリの歴史 (1)
      コラム:Windows歴史、メモリの歴史 (2)
     3.Windows 2000カーネルの概要 (1)
     4.Windows 2000カーネルの概要 (2)
     5.プロセス管理の概要
     コラム:Windows 3.xのマルチタスク システム
     6.Windows 9xのプロセス管理メカニズム (1)
     7.Windows 9xのプロセス管理メカニズム (2)
   8.Windows 2000のプロセス管理メカニズム (1)
     9.Windows 2000のプロセス管理メカニズム (2)
 
 特集


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間