HALに非常に近い所で動作しているのがマイクロカーネルであり、 Windows NTの中心です。マイクロカーネルは、スレッドのスケジューリングのほか割り込みと例外を処理します。コンピュータに複数のプロセッサがある場合、マイクロカーネルがプロセッサ間で同期をとり、パフォーマンスを最適化します。マイクロカーネルはすべてのプロセッサ上で同時に動作できます。
マイクロカーネルの役割は、プロセッサをできる限り活用し生産的な状態に保つことです。このために、プロセッサ上でスレッドを優先順でスケジューリングまたはディスパッチします。マイクロカーネルは、Executiveのプロセッサスケジューリング原則を常に適用します。また、優先度が高いスレッドを優先度が低いスレッドに割り込ませることもあります。これをプリエンプトと呼びます。コンテキストスイッチを強制実行して、プロセッサにある作業をドロップさせ、別の作業に取り掛かるように指示することもできます。したがって、このシステムで動作するコードは再入可能であることが必要です。つまり、障害なく割り込みおよび再開が可能で同じコード内の違った行を違ったプロセッサ上で実行している複数のスレッドで共有できることが必要です。
マイクロカーネルは、 アプリケーションやオペレーティングシステムのコードのスレッドをディスパッチおよびプリエンプトしますが、マイクロカーネル自身のコードは構造上スレッドで動作させることはできません。つまり、そのコードはオペレーティングシステム内で唯一のプリエンプティブでなくページングもできない部分になります。Windows NT 4.0で動作する残りのスレッドはExecutive内のものを含めて、ほとんど例外なくプリエンプティブで完全に再入可能であり効率を最大化しています。
また、マイクロカーネルはI/Oマネージャやプロセスマネージャなどの、Executiveサービスの処理に対する同期もとります。Executiveの各コンポーネントは、マイクロカーネルオブジェクトと呼ばれる高いレベルの抽象化をマイクロカーネルに依存しています。これらの中には、 ユーザーレベルのAPIの呼び出しでエクスポートされるものもあります。
マイクロカーネルは、レディ状態のスレッドに対するプロセッサ時間のスケジューリングを動的優先順位に基づいて行います。動的優先順位とは1〜31の数で作業の重要度を表します。低い優先順位のスレッドが割り込みを要求しても、最も高い優先順位のスレッドが常にプロセッサで実行されます。Windows NTでの優先順位は階層構造になっています。優先順位の階層構造では、レベルごとに次のような範囲が設定され、その範囲内で下位のレベルの優先順位が変動します。
ヒント タスクマネージャやその他のツールを使うことで、プロセスが動作中にその基本優先順位クラスを変更することができます。この変更が有効なのはそのプロセスが停止するまでで、プロセスが再起動するときには元の基本優先順位クラスに戻ります。また、フォアグラウンドプロセス(ユーザーが通信しているプロセス)の基本優先順位も調節できます。コントロールパネルの[システム]で[パフォーマンス]タブを使います([マイコンピュータ]を右クリックして、[プロパティ]を選択し、そして[パフォーマンス]タブを選択します)。詳細については、第13章「プロセッサに関するボトルネックの検出」の「優先度の測定と調整」を参照してください。
ユーザーが起動するアプリケーションのほとんどは、Normalの優先度で実行されます。Windows NTのスレッドの優先順位クラスと優先順位を表5.1に一覧します。基本優先順位は、番号が大きいほど優先度が高くなります。
表5.1 Windows NTのスレッドの優先順位
プロセスとスレッドの優先順位を監視するためのツールがいくつかあります。このようなツールとして、Windows NT 4.0に組み込まれているパフォーマンスモニタとタスクマネージャがあります。詳細については、第3部「Windows NT Workstationの最適化」を参照してください。
Windows NTのマイクロカーネルは、SMP(Symmetric Multiprocessing;対称型マルチプロセッシング)およびソフトアフィニティを実現することにより、マルチプロセッサ構成の利点を最大限に活かすことができます。
SMPでは、オペレーティングシステムを含めすべてプロセスのスレッドが、利用可能などのプロセッサ上でも動作できるようになっています。また、1つのプロセスの各スレッドが別々のプロセッサ上で同時に動作することもできます。
Windows NTのマイクロカーネルでは、各プロセッサでメモリを共有でき、レディ状態のスレッドを次に利用可能なプロセッサに割り当てることができます。これによって、 高い優先度のスレッドがレディ状態になっているときに、プロセッサが待機していたり、それよりも低い優先順位のスレッドが動作していたりすることが決して起こらないようにできます。オペレーティングシステムが複数のプロセッサ上で動作できるようにすることは、非常に大きな利点があります。特に、プロセッサ能力集約型のアプリケーションを実行しているときです。複数のサーバープロセスによって、複数のクライアントに一度に対応できるようになります。
また、Windows NTのマイクロカーネルは、スレッドへのプロセッサの割り当てにソフトアフィニティを使っています。スレッドを実行するときにすべての条件が同じであれば、前回そのスレッドで使ったプロセッサを使おうとします。このため、前回のスレッドの実行で、プロセッサのメモリキャッシュにまだ残っているデータがあれば再利用できます。アプリケーションから、スレッドを特定のプロセッサで動作するように制限することもできますが(これはハードアフィニティと呼ばれます)、これを使うことはまれです。また、Windows NT Workstation 4.0およびWindows NT Server 4.0に組み込まれているタスクマネージャツールを使うと、どのプロセッサでプロセスを実行するか決めることができます。
マイクロカーネルは、次の2種類のオブジェクトを管理しています。
注 ミューテックスとミュータントの用語はしばしば混同されます。Executiveの場合、ミューテックスはカーネルモードでのみ使用されます。ミュータントは、Win32サブシステムで使用されWin32 APIのミューテックスをインプリメントします。たとえば、Win32 APIで使用するアクセスコントロールオブジェクトCreate Mutex()は、実際にはミュータントです。
Executiveでそれぞれのタイプのディスパッチャオブジェクトがどのように使用されるかを表5.2で説明します。
表5.2 各ディスパッチャオブジェクト
Executiveでコントロールオブジェクトがどのように使用されるかを表5.3で説明します。
表5.3 各コントロールオブジェクト
カーネルモードで動作する3つめのモジュールは、Executiveでこれが最も複雑です。次の各節でExecutiveとその各コンポーネントの機能について解説します。