BOOK Preview インサイドMicrosoft Windows 第4版 上 第2章 システムアーキテクチャ 2.3.3 スケーラビリティ 書籍情報のページ 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 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では、そのまま動作を継続し、内部のデータ構造体が破壊されますから、システムはクラッシュしてしまいます。
|
デバッグバージョンに追加されるコードの多くは、ASSERT マクロのコンパイル結果です。このマクロは、DDK ヘッダーファイルNtddk.hで定義されており、DDKドキュメントに記述されています。マクロ内では、データ構造体やパラメータの有効性などの条件チェックが行われ、その評価がFALSE の場合、RtlAssert カーネルモード関数が呼び出されます。このカーネルモード関数は内部でDbgPrintを呼び出し、デバッグメッセージテキストをデバッグメッセージバッファに設定します。カーネルデバッガがアタッチされている場合には、セットされたメッセージテキストはプロンプトダイアログボックスと共に自動的に表示され、ユーザーの判断を待ちます(ブレークポイント、無視、プロセスの終了、あるいはスレッドの終了)。カーネルデバッガがアタッチされていない場合(Boot.ini ファイルに/DEBUG スイッチエントリがない)、ダイアログボックスは表示されることはなく、システムクラッシュが発生します。実行されるASSERT チェックのリストを確認したい人は、WindowsDDK ドキュメントの「Checked Build ASSERTs」を一読するとよいでしょう。
注 |
|||||
|
デバッグバージョンは、特定コンポーネントに関する詳しいトレース情報が表示されることもあり、システム管理者にも多くのメリットをもたらします(デバッグバージョンの使用法に関しては、「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 システムプロセス/まとめ | ||
更新履歴 | |
|
「BOOK Preview」 |
- 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をインストールしてみる
|
|