BOOK Preview

インサイドMicrosoft Windows 第4版 上

第2章 システムアーキテクチャ

2.3.3 スケーラビリティ
2.3.4 クライアントとサーバー間の違い
2.3.5 チェックビルド

マイクロソフトプレスの書籍紹介ページ
書籍情報のページ
2005/08/02

2.3.3 スケーラビリティ

 マルチプロセッサシステムでは、スケーラビリティというものが重要な位置を占めます。SMPシステム上で正常に動作するためには、オペレーティングシステムコードは指針と規則を守る必要があります。考慮すべきリソース競合や他のパフォーマンス問題の深刻度は、ユニプロセッサシステムの比ではありません。システム設計時に慎重に考慮しておく必要があります。Windows は、マルチプロセッサオペレーティングシステムに要求される、次のような機能を組み入れています。

  • 入手可能な任意のプロセッサとマルチプロセッサ上で同時にオペレーティングシステムコードを実行する機能。

  • 1 つのプロセス内で複数のスレッドを実行する機能(個々のスレッドは異なるプロセッサ上で同時に実行される)。

  • 高精度な同期ロジックを備えたデバイスドライバ、サーバープロセス、およびカーネル(第3で説明するようなスピンロック、行列待ちスピンロック、およびプッシュロック)。Windowsでは、多くのコンポーネントがマルチプロセッサ上で同時に連係動作できるようになっている 。

  • マルチスレッドサーバープロセスを効率的に実装できるプログラミングメカニズム(たとえば、I/O完了ポートなど)。Windowsでは、マルチプロセッサシステム上で優れたスケーラビリティを発揮するサーバーアプリケーションを開発できるようになっている。

 Windowsカーネルのスケーラビリティは、数年の年月をかけて進化してきました。たとえば、Windows Server 2003は、CPU単位のスケジューリングキューを持っています。このため、スレッドスケジューリングは、複数マシン上で並行して行うことが可能となっています。マルチプロセッサスレッドスケジューリングの詳細については、第6で取り上げます。また、マルチプロセッサシステムにおける同期メカニズムは、第3で取り上げます。

2.3.4 クライアントとサーバー間の違い

 Windows製品には、クライアントとサーバーの2つのバージョンがあります。Windows 2000の場合、クライアントバージョンはWindows 2000 Professional呼ばれています。一方、Windows 2000のサーバーには、Windows 2000 Server 、Advanced Server 、およびDatacenterという3種類のバージョンがあります。

 Windows XPクライアントの場合、5種類のバージョンが出荷されています。これらの製品はそれぞれ、Windows XP Home Edition 、Windows XP Professional 、Windows XP Tablet PC Edition 、Windows XP Media Center Edition 、およびWindows XP Embeddedと呼ばれています。本書では、最初の2種類のバージョンを取り上げています。残りの3つの製品は、Windows XP Professionalのスーパーセットにすぎません。つまり、Windows XP Professionalと同じOSコアコンポーネントをベースとする製品なのです。

 Windows Server 2003は、Windows Server 2003 Web Edition 、StandardEdition 、Small Business Server 、Storage Server 、Enterprise Edition 、およびDatacenter Editionの6種類の製品として出荷されています。

 以上の各Windows バージョンには、次のような違いがあります。

  • サポートされるプロセッサ数

  • サポートされる物理メモリ量

  • サポートされるネットワーク同時接続数(たとえば、クライアント製品では、ファイルとプリンタサービスに同時に接続される最大数は10 となっている)

  • サーバー製品におけるサービスの階層化(たとえば、ディレクトリサービス、クラスタリング、マルチユーザーターミナルサービスなど。Professional 版では階層化は行われていない)

 表2-3は、Windows 2000各バージョンをメモリとプロセッサの2つの視点から比較しています。また、表2-4は、Windows XP とWindows Server 2003を同じように比較しています。Windows Server 2003 各バージョン間の比較情報の詳細については、www.microsoft.com/windowsserver2003evaluation
/features/compareeditions.mspx
( 日本語版:ww.microsoft.com/japan/windowsserver2003evaluation
/features/compareeditions.mspx
)を参照してください。

バージョン プロセッサ数 物理メモリ
Windows 2000 Professional 2 4GB
Windows 2000 Server 4 4GB
Windows 2000 Advanced Server 8 8GB
Windows 2000 Datacenter Server 32 64GB
表2-3 Windows 2000のサーバーとクライアント間の相違
 
プロセッサ数(32ビットバージョン) 物理メモリ(32ビットバージョン) プロセッサ数(64ビットバージョン) 物理メモリ(Itaniumバージョン) 物理メモリ(x64ビットバージョン)
Windows XP Home Edition 1 4GB 対応製品なし 対応製品なし 対応製品なし
Windows XP Professional 2 4GB 2 16GB 16GB
Windows Server 2003 Web Edition 2 2GB 対応製品なし 対応製品なし 対応製品なし
Windows Server 2003 Small BusinessServer 2 2GB 対応製品なし 対応製品なし 対応製品なし
Windows Server 2003 Standard Edition 4 4GB 対応製品なし 対応製品なし 対応製品なし
Windows Server 2003 Enterprise Edition 8 32GB 8 64GB 64GB
Windows Server 2003 Datacenter Edition 32 x64 では128GB、x86では64GB 64 512GB(SP1 では1024GB) 対応製品なし
表2-4 Windows XPとWindows Server 2003間の相違

 Windowsには複数のクライアントとサーバー製品がありますが、使用されているコアシステムファイルは共通しています。つまり、カーネルイメージ(Ntoskrnl.exeやPAEバージョンNtkrnlpa.exe)、HALライブラリ、デバイスドライバ、基本システムユーティリティとDLLなどは共通しています。これらのファイルは、すべてのWindows 2000バージョン製品で同じです。

   

 Windows XPは、Windows NTコードベースの最初のクライアント製品ですが、対応するサーバーバージョンを持ちません。Microsoftは、Windows XP出荷後の1年の間、Windows Server 2003となるサーバー製品を開発してきました。つまり、Windows XPとWindows Server 2003を構成するコアシステムは、同じものではありません。しかし、2つ製品の仕様間の相違は、大きくはありません。基本的には、構成コンポーネントは変更されない、と考えてよいでしょう。

 Windows 2000 ProfessionalとWindows 2000 Serverのカーネルイメージが同じとした場合、システムはどちらのバージョンが起動されたのかをどのように知るのでしょうか。この問いは、基本的にWindows XPとWindows Server 2003にもそのまま当てはまります。実は、システムレジストリ内のHKLM\SYSTEM\CurrentControlSet\Control\ProductOptionsキーのProductTypeとProductSuiteの値を調べると簡単にわかります。ProductType値は、クライアントバージョンとサーバーバージョンを区別するために使用されています。表2-5に示すような値が設定され、システムグローバル変数であるMmProductTypeに格納されます。変数値は、Windows DDKに記述されているMmIsThisAnNtAsSystemというカーネルモードサポート関数を使用すれば、デバイスドライバから読み出すことができます。

Windowsバージョン ProductType値
Windows 2000 Professional 、Windows XP Professional、Windows XP Home Edition WinNT
Windows Server(ドメインコントローラ) LanmanNT
Windows Server(サーバーのみ) ServerNT
表2-5 ProductTypeキーの値

 もう1 つのレジストリ値であるProductSuiteは、Windows Serverのタイプと、Windows XPのHome とProfessionalを区別する情報を保持しています。

 プログラム内でWindows製品バージョンを判定する必要がある場合には、Platform SDKに記述されているVerifyVersionInfo関数を呼び出すことができます。

 クライアントとサーバーバージョンのコアファイルが実質的に同じとなっている場合、動作上の違いはどのように発生するのでしょうか。簡単に言えば、サーバーシステムはデフォルトでシステム性能を重視するように最適化され、クライアントシステムはデスクトップとの対話を重視するようになっています。表現を変えれば、前者はアプリケーションサーバーのパフォーマンスを、後者は(サーバー機能も持っていますが)ユーザーへの応答性を改善するように動作しているといってよいでしょう。たとえば、システムブート時のリソース割り当てなどは製品タイプに応じて異なっています。オペレーティングシステムヒープ(プール)の数や大きさ、内部のシステムワーカースレッド数、システムデータのキャッシュの大きさなどは、製品タイプに応じて決められます。また、システムとプロセス間のメモリ要求を調整するメモリマネージャの動作などの、実行時ポリシーもサーバーとクライアント間では異なります。スレッドスケジューリングさえ微妙な点(第6章で詳述するタイムスライス長など)で異なっているのが実際のところです。クライアントとサーバー製品間での動作が著しく異なる場合、本書ではその背景を可能な限り説明していきます。特に断らない限り、本書の内容はクライアントとサーバーの両バージョンに適応されます。

2.3.5 チェックビルド

 Windows 2000 Professional 、Windows XP Professional 、およびWindowsServer 2003には、チェックビルドと呼ばれる特殊なデバッグバージョンがあります。これらのバージョンは、MSDN Professional以上のサブスクリプションを購読すると入手できます。デバッグバージョンは、コンパイル時にDBGというフラグを有効にして作成されたバイナリコードです。このように作成されたWindowsバージョンは、トレース機能がそのまま有効になります。また、マシンコードが理解しやすくなるように、バイナリコードは最適化されていません。つまり、デバッグバージョンWindowsは、動作スピードが遅くなる反面、CPU 内部のレジスタの使い方などが理解しやすいマシンコードで構成されています(詳細については、DebuggingTools ヘルプファイルの「Performance-Optimized Code」を参照してください)。

 デバッグビルド版Windows提供の主要な目的は、デバイスドライバ開発者の作業を支援するためです。デバイスドライバ(や他のシステムコード)はその内部で、カーネルモード関数を頻繁に呼び出しています。デバッグビルド版Windowsは、既に触れたように、トレース機能が有効になっているため、かなり厳格なエラーチェックを行います。このため、たとえば、ドライバやカーネルモードコードの一部がパラメータチェックを行っているシステム関数を呼び出し、無効なパラメータを渡した場合、システムはその場で停止します。デバッグバージョン以外のWindowsでは、そのまま動作を継続し、内部のデータ構造体が破壊されますから、システムはクラッシュしてしまいます。

実験:デバッグバージョンWindows の確認

 使用しているWindowsがデバッグバージョンなのか、製品(フリー)バージョンなのかを判定するツールは提供されていません。しかし、WMI(WindowsManagement Instrumentation)のWin32_OperatingSystemクラスのDebugプロパティを利用できます。次のVisual Basic Script(VBS)サンプルコードは、Debugプロパティの値を表示してくれます。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
  ("SELECT * FROM Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
  Wscript.Echo "Caption: " & objOperatingSystem.Caption
  Wscript.Echo "Debug: " & objOperatingSystem.Debug
  Wscript.Echo "Version: " & objOperatingSystem.Version
Next

 このコードを実際に試したい場合には、メモ帳を開いてスクリプトコードを入力し、拡張子.VBS を付けて保存します。保存したファイルを次のように実行します。

C:\>cscript osversion.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Caption: Microsoft Windows XP Professional
Debug: False
Version: 5.1.2600

 Debug プロパティの値はFalseとなっていますから、この場合には、デバッグバージョンのWindowsは実行されていません。

 デバッグバージョンに追加されるコードの多くは、ASSERT マクロのコンパイル結果です。このマクロは、DDK ヘッダーファイルNtddk.hで定義されており、DDKドキュメントに記述されています。マクロ内では、データ構造体やパラメータの有効性などの条件チェックが行われ、その評価がFALSE の場合、RtlAssert カーネルモード関数が呼び出されます。このカーネルモード関数は内部でDbgPrintを呼び出し、デバッグメッセージテキストをデバッグメッセージバッファに設定します。カーネルデバッガがアタッチされている場合には、セットされたメッセージテキストはプロンプトダイアログボックスと共に自動的に表示され、ユーザーの判断を待ちます(ブレークポイント、無視、プロセスの終了、あるいはスレッドの終了)。カーネルデバッガがアタッチされていない場合(Boot.ini ファイルに/DEBUG スイッチエントリがない)、ダイアログボックスは表示されることはなく、システムクラッシュが発生します。実行されるASSERT チェックのリストを確認したい人は、WindowsDDK ドキュメントの「Checked Build ASSERTs」を一読するとよいでしょう。

   

 デバッグシステム内のNtoskrnl.exe とNtkrnlmp.exe 、あるいはNtkrnlpa.exe とNtkrpamp.exe を比較してみるとわかりますが、2 つのファイルはまったく同じです。つまりすべてが同じマルチプロセッサファイルバージョンであり、デバッグバージョンでは、ユニプロセッサ用のカーネルイメージは存在しないのです。

 デバッグバージョンは、特定コンポーネントに関する詳しいトレース情報が表示されることもあり、システム管理者にも多くのメリットをもたらします(デバッグバージョンの使用法に関しては、「HOWTO: Enable Verbose Debug Tracing inVarious Drivers and Subsystems」(日本語版「[HOWTO]さまざまなドライバやサブシステムでデバッグトレースを有効にする」)というタイトルを持つKnowledgeBase 314743 を参照)。詳しいトレース情報は、既に触れたように、DbgPrint 関数で内部のデバッグメッセージバッファに設定されます。デバッグメッセージを表示したい場合には、ターゲットシステムにカーネルデバッガをアタッチするか(デバッグモードでのブート必要)、ローカルカーネルデバッグモードで!dbgprintコマンドを実行するか、あるいは、www.sysinternals.comから無料で入手できるDbgview.exeを使用します。

 デバッグバージョンを活用する場合、デバッグバージョンのすべてのファイルをインストールする必要はありません。デバッグバージョンのカーネルイメージ(Ntoskrnl.exe)と適切なHAL(Hal.dll)を製品版の環境にコピーするだけでよいのです。これらの2つのファイルをコピーするだけで、使用しているデバイスドライバとカーネルコードは厳しくチェックされるようになります。しかも、システム内の他のコンポーネントのパフォーマンスが低下するようなことはありません。このアプローチに関する詳細については、Windows DDK ドキュメントの「InstallingJust the Checked Operating System and HAL」を参照してください。MicrosoftはWindows 2000 Serverのデバッグバージョンを提供していませんから、今説明したアプローチを採用し、Windows 2000 Server システム上でデバッグバージョンのカーネルとHAL を実行するとよいでしょう。

 デバッグバージョンWindowsは、微妙なタイミング問題を抱えているユーザーモードコードをテストする際にもたいへん有効です。デバッグバージョンはカーネル内部でより多くのチェックを行い、かつ、コンポーネントが最適化コンパイルされていません(このため、タイミング問題を検出しやすい)。実際、マルチスレッド間の同期は、特定のタイミング条件の下で発生するものです。デバッグバージョン環境でテストすれば、タイミングずれに起因するバグが表面化するようなことがあります。


 INDEX
  インサイドMicrosoft Windows 第4版 上
  第2章 システムアーキテクチャ
    2.1 要求と設計目標/2.2 オペレーティングシステムモデル
    2.3 アーキテクチャ概要/2.3.1 移植性/2.3.2 対称型マルチプロセッシング
  2.3.3 スケーラビリティ/2.3.4 クライアントとサーバー間の違い/2.3.5 チェックビルド
    2.4 キーシステムコンポーネント/2.4.1 環境サブシステムとサブシステムDLL
    2.4.2 Ntdll.dll/2.4.3 エグゼキュティブ
    2.4.4 カーネル/2.4.5 ハードウェア抽象化層(HAL)/2.4.6 デバイスドライバ
    2.4.7 システムプロセス/まとめ

更新履歴
【2008/04/04】 コラム「実験:デバッグバージョンWindows の確認」中のVisual Basic Scriptのサンプル・コードが間違っており(SQLのSELECT文の直後に余分な「S」という文字が付いていた)、そのままでは正しく実行できなかったのを修正しました。お詫びして訂正いたします。
 
インデックス・ページヘ  「BOOK Preview」


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

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間