特集Windows 9x or Windows 2000?8.Windows 2000のプロセス管理メカニズム(1)デジタルアドバンテージ |
|
|
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に標準で提供されているタスク マネージャを起動し、[プロセス]タブを表示すれば、現在実行されているプロセスに関するかなり詳細な情報を表示させることができる。標準状態ではわずかな情報しか表示されないが、[表示]−[列の選択]メニューから表示されるダイアログで、タスク マネージャで表示可能なすべての項目を選択することが可能である。 | |||||||||||||||
|
デフォルトではインストールされていないが、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を利用すれば、現在実行中のプロセスやスレッドを一覧表示できるだけでなく、一覧されたプロセスを選択してこれを強制終了させたり、スレッドを選択してこのプライオリティを変更したりすることができる。 | |||||||||||||||||||||
|
最後は、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時間がダイナミックにグラフ表示される。 | ||||||||||||
|
Quick Sliceで表示されるスレッドの一覧 | ||||||
Quick Sliceのメイン ウィンドウに表示されるプロセス一覧から、任意のプロセス項目をマウスでダブルクリックすると、このような別ウィンドウが表示される。ここには、選択したプロセスから生成されたスレッドが一覧表示される。グラフはメイン ウィンドウでの表示と同じく、そのスレッドで費やされたCPU時間の割合である。この例は、メイン ウィンドウのプロセス一覧から、インターネット エクスプローラのプロセス(iexplorer.exe)をダブルクリックしたところ。 | ||||||
|
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で起動されたスレッドは、このような状態遷移を繰り返しながらその一生を終える。 | ||||||||||||||||||||||||||||||||||||
|
特集 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
|
|