Windows の管理

Windows Vista カーネルの内部 : 第 1 部

Mark Russinovich

 

概要:

  • スレッドの優先順位とスケジュール
  • ファイルベースのシンボリック リンク
  • I/O 操作を取り消す

これは Windows Vista カーネルの新機能シリーズの最初の部分です。この記事では、プロセスとスレッド、および I/O の分野での変更について見ていきます。今後の記事では、メモリ管理、起動と停止、信頼性と回復、およびセキュリティについて見ていきます。

この記事は、Windows Vista™ カーネルへの変更のみを対象としており、特に、Ntoskrnl.exe およびそれに密接に関連づけられているコンポーネントに注目しています。Windows Vista では、他にも多くの大幅な変更が行われていますが、正規のカーネルの範疇に収まらないため、ここでの対象から除外されていることを覚えておいてください。このような変更には、シェル (統合されたデスクトップ検索など)、ネットワーク (新しい IPv6 スタックや双方向ファイアウォールなど)、次世代グラフィック モデル (Aero™ Glass、Windows® Presentation Foundation、デスクトップ ウィンドウ マネージャ、新しいグラフィック ドライバ モデルなど) の改善などが含まれます。また、ここで触れられていないものに、新しい Windows ユーザー モードおよびカーネル モードのドライバ フレームワーク (UMDF および KMDF) があります。これらは以前のバージョンの Windows にバックレベル インストールが可能であるために、対象から除外されています。

CPU サイクル カウント

Windows Vista では、プロセスとスレッドの分野に数多くの改善が含まれています。これらの改善には、より公平な CPU の割り当てを実現する CPU サイクル カウンタの使用や、メディア アプリケーションがエラーのない再生を実現するための新しいマルチメディア クラス スケジューラ サービス (MMCSS) などがあります。

Windows NT® から Windows Vista に至るまでのすべてのバージョンでは、間隔タイマ中断ルーチンをプログラミングし、ハードウェア プラットフォームに応じて約 10 ms または 15 ms (ミリ秒) の間隔でこのルーチンを実行します。このルーチンでは、ルーチンによって中断されたスレッドを確認し、そのスレッドがその期間全体にわたって実行されたかのように、スレッドの CPU 使用率統計を更新します。ただし実際には、このスレッドは期間の終了直前に開始された場合もあります。さらに、スレッドは技術的には CPU に割り当てられていても、ハードウェアとソフトウェアの中断ルーチンが代わりに実行されたために、実行されなかった場合もあります。

スレッドやプロセスの CPU 使用率を報告する診断ツールではクロックベースの時間計算でも支障がないかもしれませんが、スレッド スケジューラがこの方法を使用すると、不公平に CPU が割り当てられる場合があります。既定では、クライアント バージョンの Windows では、スレッドは 2 クロック目盛 (フォアグラウンドでは 6) までの実行が許可されています。ただし、システムでのスレッドの動作や他のアクティビティによって、スレッドは実質的に CPU 実行時間をまったく得られない場合も、6 目盛 (フォアグラウンドでは 18) まで得られる場合もあります。

図 1 は、同じ優先順位を持つ 2 つのスレッドの実行準備が同時に完了した場合に発生することのある不公平な割り当てを示しています。スレッド A は、次のタイム スライス期間の終了時まで実行されます。期間が終了すると、スケジューラはスレッド A が期間全体を通して実行されたので、スレッド A の順番が完了したものと見なします。また、不公平ながら、スレッド A にはその順番の中で発生した中断時間も計算に含められます。次の期間が始まると、スケジューラはスレッド B をスレッド A の引き継ぎとして選択し、期間全体にわたって実行します。

図 1 不公平なスレッドのスケジュール

図 1** 不公平なスレッドのスケジュール **

Windows Vista では、スケジューラは最新のプロセッサのサイクル カウンタ レジスタを使用して、スレッドが実行する CPU サイクル数を正確に追跡します。1 クロック期間中に CPU が実行できるサイクル数を見積もることで、CPU の使用をさらに正確に割り当てることができます。さらに、Windows Vista のスケジューラはスレッドの順番の中で発生した中断時間を計算に含めません。つまり、Windows Vista では、スレッドは常に CPU でのその順番を少なくとも確保し、過剰な実行時間が 1 クロック期間を超えることがないため、割り当てがさらに公平になり、アプリケーションの動作がより決定的なものになります。図 2 は、両方のスレッドに少なくとも 1 タイム スライスの実行期間を与えることで、図 1 に示すシナリオに Windows Vista が対応している方法を示しています。

図 2 Windows Vista のサイクルベースのスケジュール

図 2** Windows Vista のサイクルベースのスケジュール **

「プロセスの CPU 使用率を監視する」サイドバーでは、ユーザーが Process Explorer ユーティリティを使用して、プロセスの CPU サイクル使用率を監視できる方法を示しています。

マルチメディア クラス スケジューラ サービス

ユーザーは、音楽プレーヤーやビデオ プレーヤーなどのマルチメディア アプリケーションを使用して、シームレスな再生を体験できることを期待しています。ただし、ウイルス対策プログラム、コンテンツのインデックス作成、メール クライアントなどの、同時に実行される他のアプリケーションによる CPU の需要により、望ましくない一時的な中断が発生する場合があります。より優れた再生を可能にするために、Windows Vista では MMCSS を導入し、マルチメディア スレッドの CPU 優先順位を管理しています。

Windows Media® Player 11 などのマルチメディア アプリケーションでは、マルチメディア特性を示す新しい API を使用して MMCSS に登録しています。この特性は、次のレジストリ キーの下に名前順に一覧表示されているもののいずれかと一致する必要があります。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\Tasks

図 A** Process Explorer で CPU Time と Cycles Delta を表示する **(画像を拡大するには、ここをクリックします)

図 3 マルチメディア クラス スケジューラのオーディオ タスク定義

図 3** マルチメディア クラス スケジューラのオーディオ タスク定義 **(画像を拡大するには、ここをクリックします)

%SystemRoot%\System32\Mmcss.dll に実装され、サービス ホスト (Svchost.exe) プロセス内で実行される MMCSS には、優先順位 27 で実行される優先順位管理スレッドがあります (Windows のスレッド優先順位の範囲は 0 ~ 31 です)。このスレッドは、登録されているマルチメディア スレッドの優先順位を、図 4 に示すタスク レジストリ キーの Scheduling Category 値に関連付けられている範囲にまで高めます。Windows では、16 以上のスレッド優先順位はリアルタイムの優先順位範囲にあり、システム上のその他すべてのスレッドの優先順位よりも高くなっています (唯一の例外は、優先順位 28 および 29 で実行されるカーネルのメモリ マネージャ ワーカー スレッドです)。リアルタイム スレッド優先順位の設定に必要な優先順位の繰り上げ特権を持っているのは、MMCSS が実行に使用するローカル システム アカウントなどの管理者アカウントのみです。

Figure 4 MMCSS のスレッド優先順位

スケジュール カテゴリ 引き上げられたスレッド優先順位
23-26
16-23

オーディオ ファイルが再生されると、Windows Media Player ではオーディオ タスク スレッドを登録し、ビデオが再生されると、再生タスク スレッドを登録します。MMCSS サービスでは、フォアグラウンド ウィンドウを持つプロセス内で実行と同時にストリームを配信しており、タスクの定義キーの BackgroundOnly 値が True に設定されていることを示しているスレッドをすべて引き上げます。

ただし、MMCSS ではマルチメディア スレッドが必要な CPU 時間を取得できるようにする支援をしますが、一方で、他のスレッドも少なくともある程度の CPU 時間を取得して、システムと他のアプリケーションが応答できるようにします。MMCSS では他のアクティビティ用の CPU 使用率を保持するために、次のレジストリ値を指定します。

HKLM\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\SystemResponsiveness 

既定では、これは 20 パーセントになります。MMCSS では CPU 使用率を監視し、他のスレッドが CPU を必要としている場合に、10 ms の期間にマルチメディア スレッドが 8 ms を超えて CPU を使用しないようにします。残りの 2 ms はマルチメディア スレッドが CPU を使用しないようにするために、スケジューラではマルチメディア スレッドの優先順位を 1 ~ 7 の範囲に引き下げます。

MMCSS がスレッドの優先順位を引き上げる方法については、「MMCSS による優先度の引き上げを観察する」サイドバーを参照してください。

ファイルベースのシンボリック リンク

Windows Vista の I/O に関する変更には、ファイルベースのシンボリック リンク、さらに効率化された I/O 完了処理、包括的な I/O 取り消しのサポート、および優先順位の付いた I/O があります。

Windows Vista には、NTFS に欠如しているものとして多くのユーザーから望まれていたファイル システム機能であるシンボリック ファイル リンク (UNIX ではソフト リンクと呼ばれる) がついに導入されました。Windows 2000 バージョンの NTFS には、ディレクトリ ジャンクションと呼ばれるシンボリック ディレクトリ リンクが導入されました。このリンクを使用すると、別のディレクトリを指すディレクトリを作成できますが、Windows Vista バージョンが登場するまで、NTFS ではファイルのハード リンクのみがサポートされていました。

Windows がシンボリック リンクおよびディレクトリ ジャンクションを解決する方法の主な違いは、処理が行われる場所にあります。Windows では、シンボリック リンクはローカル システムで処理されます。これは、たとえシンボリック リンクがリモート ファイル サーバー上の場所を参照している場合でも同じです。リモート ファイル サーバーを参照しているディレクトリ ジャンクションは、そのサーバー上で処理されます。したがって、サーバー上のシンボリック リンクは、他のクライアント ボリュームのように、クライアントからのみアクセスできる場所を参照できます。一方、ディレクトリ ジャンクションではこれは不可能です。この問題に対処するために、Windows Vista ではファイルとディレクトリの両方に対し、新しい種類のシンボリック リンクをサポートしています。

多くのファイル システム コマンドは、シンボリック リンクの意味を理解できるように更新されています。たとえば、Delete コマンドではリンクに従ってターゲットが削除されるようにするのではなく、リンク自体を削除する必要があることを理解しています。ただし、すべてのアプリケーションがシンボリック リンクを正しく処理できるわけではないので、シンボリック リンクの作成には既定により管理者のみが持つことのできる、新しいシンボリック リンクの作成特権が必要となっています。

シンボリック リンクを作成するには、コマンド プロンプトで Mklink コマンドを実行します。シンボリック リンクは、コマンド プロンプトの組み込みディレクトリ コマンドによって識別されます。これは、図 5 に示すように、シンボリック リンクに <SYMLINK> のフラグを付け、ターゲットを角かっこで囲んで示すことで行われます。Windows エクスプローラもシンボリック リンクに対応しており、シンボリック リンクをショートカット矢印で示します。エクスプローラでリンク先を表示するには、リンク先の列を参照ウィンドウに追加します。MMCSS による優先順位の引き上げを観察する

MMCSS サービスが Windows Media Player のスレッドに適用しているスレッドの優先順位の引き上げを観察できます。これは、ビデオまたはオーディオ クリップを再生するか、パフォーマンス モニタを実行するか、グラフの目盛を 31 (Windows スレッドの最高優先順位) に設定するか、Windows Media Player (Wmplayer.exe) スレッド オブジェクトの全インスタンス用 Priority Current カウンタを表示に追加することで、観察できます。1 つ以上のスレッドが優先順位 21 で実行されるようになります。

図 B** Windows Media Player のスレッドの優先順位引き上げ **(画像を拡大するには、ここをクリックします)

図 5 Mklink を使用してシンボリック リンクを作成する

図 5** Mklink を使用してシンボリック リンクを作成する **(画像を拡大するには、ここをクリックします)

I/O の完了と取り消し

I/O システムには、サーバー アプリケーションのパフォーマンスを向上するための内部の変更が多くなされています。通常これらのアプリケーションでは、完了ポートと呼ばれる同期オブジェクトを使用して、非同期の I/O 要求が完了するのを待機します。Windows Vista より前のバージョンでは、このような I/O が完了すると、I/O を発行したスレッドは I/O 完了作業を実行します。それにより、スレッドが属しているプロセスに切り替わり、その他の作業が中断されます。その後、I/O システムでは完了ポート ステータスを更新し、ステータスが変更されるのを待機していたスレッドを実行します。

Windows Vista では、I/O 完了処理は、I/O を発行したスレッドによって必ずしも実行されるのではなく、完了ポートによって有効化されるのを待機していたスレッドによって行われます。この比較的小さな変更により、不要なスレッドのスケジュール、およびアプリケーションやシステムの総合的なパフォーマンスを低下させるコンテキスト スイッチを回避できるようになりました。さらにパフォーマンスを向上させるために、サーバーでは完了した複数の I/O 操作の結果を 1 回の要求で取得し、カーネル モードへの移行を回避します。

I/O システムにおいて、エンドユーザーの観点から見て最も顕著な変更は、同期 I/O 操作の取り消しを Windows Vista がサポートするようになったことです。Windows XP または Windows Server® 2003 を使用して net view コマンドを実行したか、オフライン リモート システムの共有へのアクセスを試みた経験があるユーザーは、取り消しできない I/O 操作に関する問題に遭遇したことがあるはずです。コマンドまたはファイル ブラウザは、ネットワークのタイムアウトが発生するまで応答しません。アプリケーションでは、I/O を実行しているデバイス ドライバに対し、I/O 操作を取り消すように指示する手段がないため、操作に失敗するまで待機するよりほかはありません。

Windows Vista では、ほとんどの I/O 操作は取り消しが可能です。Net View およびエクスプローラが使用しているオープン ファイル I/O も取り消すことができます。ただし、I/O の取り消しを求めているエンドユーザーの要求に応答できるように、アプリケーションを更新する必要があります。タイムアウトを使用しているデバイスと対話する Windows Vista ユーティリティの多くには、必要なサポートが組み込まれています。たとえば、サードバーティ アプリケーションを含み、実質的にほとんどすべての Windows アプリケーションが使用している、ファイルを開くダイアログと保存のダイアログでは、フォルダ内容の表示中に [キャンセル] ボタンが有効になります。Net コマンドでも、ユーザーが Ctrl + C キーを押すと、その同期 I/O が取り消されます。

I/O 取り消し機能の利点を確認するには、Windows Vista でコマンド プロンプトを開き、次のコマンドを入力してみてください。

net view (\\nonexistentmachine)

存在しないシステムに Windows がアクセスしようとしている間にコマンドはハングしますが、Ctrl + C キーを押すとコマンドを終了できます。Windows XP では、Ctrl + C キーを押しても何の効果もなく、ネットワークの操作がタイムアウトするまでコマンドは返されません。

以前のバージョンの Windows でユーザーに問題を引き起こしていた別の種類の I/O 操作に、デバイス ドライバの処理が適切に取り消されないという問題がありました。これは、取り消しが必要なことをデバイス ドライバが理解するための簡単な方法が存在しなかったためです。プロセスを終了したにもかかわらず、プロセス表示ツールにそのプロセスがまだ表示されているような場合は、デバイス ドライバがプロセスの終了と、まだ完了していないプロセスによって発行された I/O の取り消しに応答しなかったことになります。Windows では、すべてのプロセスの I/O が完了するか、取り消されるまで、最終的なプロセスのクリーンアップを実行できません。Windows Vista では、デバイス ドライバはプロセス終了通知を簡単に登録できるため、終了できないプロセスに関する問題のほとんどは解決されています。

I/O 優先順位

Windows では常に CPU 使用率の優先付けをサポートしてきましたが、I/O 優先順位の概念は含まれていませんでした。I/O 優先順位がないと、検索インデックスの作成、ウイルス スキャン、ディスクの最適化などのバックグラウンド アクティビティは、フォアグラウンド操作の応答性に大きな影響を及ぼすことがあります。別のプロセスがディスク I/O を実行している間にユーザーがたとえばアプリケーションを起動するか、ドキュメントを開こうとすると、フォアグラウンド タスクがディスクのアクセスを待機するために、遅延が発生します。同じ干渉によって、ハード ディスクに保存されている歌のようなマルチメディア コンテンツのストリーム再生も影響を受けます。

Windows Vista では、フォアグラウンドの I/O 操作が優先的に処理されるように、新しい種類の I/O 優先付け機能を導入しています。この機能では、個別の I/O 操作および I/O 帯域幅の予約に優先順位が付けられます。Windows Vista の I/O システムの内部では、図 6 に示すように、5 つの I/O 優先順位がサポートされていますが、実際に使用されるのは 4 つのみです (今後のバージョンの Windows では "高" がサポートされる可能性があります)。

Figure 6 Windows Vista の I/O 優先順位

I/O 優先順位 使用率
重大 メモリ マネージャ
未使用
標準 既定の優先順位
既定のタスクの優先順位
最低 バックグラウンド アクティビティ

I/O の優先順位は既定により "中" に設定されており、メモリ マネージャではメモリが少なくなっている状況でディスクにダーティー メモリ データを書き込む必要があるときに、"重大" の優先順位を使用して、他のデータやコードのために RAM に空き容量を作ります。Windows タスク スケジューラでは、既定のタスク優先順位を持つタスクの I/O 優先順位を "低" に設定します。バックグラウンド処理を実行するために Windows Vista 用に作成されたアプリケーションによって指定されている優先順位は "最低" です。Windows Defender のスキャンやデスクトップ検索インデックスの作成などの、Windows Vista のすべてのバックグラウンド操作では、"最低" の I/O 優先順位を使用します。最低 I/O 優先順位を表示する

Sysinternals が開発したリアルタイム ファイル システムおよびレジストリ監視ユーティリティである Process Monitor は、Windows Vista における読み取りと書き込みのファイル システム操作の詳細情報を I/O 優先順位も含めて収集します。強調表示された行は、SuperFetch (次回の記事で説明) によって発行された非常に低い優先順位を持つ I/O の例を示しています。

図 C** Process Monitor で最低 I/O 優先順位を表示する **(画像を拡大するには、ここをクリックします)

システム ストレージ クラス デバイス ドライバ (%SystemRoot%\System32\Classpnp.sys) では、I/O 優先順位がほとんどのストレージ デバイスの I/O に自動的に適用されるようにします。クラスおよび他のストレージ ドライバでは、キュー内で "低" または "最低 (Very Low)" の優先順位を持つ I/O の前に "中" の I/O を配置しますが、毎秒少なくとも 1 つの待機中の "低" または "最低" の I/O を発行し、バックグラウンド プロセスの進行を図ります。また、"最低" の I/O を使用しているデータの読み取りにより、キャッシュ マネージャはディスクへの変更を後回しにするのではなく、直ちに書き込むようになるため、本来であればアクセス中のファイルから先に読み取りを行う読み取り操作の先読みロジックがバイパスされます。プロセス マネージャ ユーティリティを使用した "最低" の I/O 優先順位の例については、サイドバー「最低の I/O 優先順位を表示する」を参照してください。

Windows Vista の帯域幅予約のサポートは、メディア プレーヤー アプリケーションに役立ちます。Windows Media Player では MMCSS 優先順位引き上げ機能と共にこのサポートを利用して、ほとんどエラーのないローカル コンテンツの再生を実現します。メディア プレーヤー アプリケーションでは、指定されたレートでデータを読み取る機能を保証することを I/O システムに求めます。デバイスが要求されたレートでデータを配信でき、既存の予約に影響がない場合には、I/O の発行速度とサイズについて、アプリケーションにガイダンスを提供します。I/O システムでは、ターゲット ストレージ デバイスに対して予約を行ったアプリケーションの要件が満たされるまで、他の I/O を処理しません。

ここで触れておく必要のある I/O システムのもう 1 つの変更に、I/O 操作のサイズに関する変更があります。最初のバージョンの Windows NT 以降、メモリ マネージャと I/O システムでは、個別のストレージ I/O 要求によって処理されるデータ量が 64 KB に制限されていました。このため、アプリケーションがそれよりはるかに大きい I/O 要求を発行しても、その要求は 64 KB の最大サイズを持つ複数の要求に分割されていました。各 I/O は、カーネル モードへの移行およびストレージ デバイスでの I/O 転送の開始にオーバーヘッドをもたらすので、Windows Vista ではストレージ I/O 要求のサイズは制限されなくなっています。いくつかの Windows Vista ユーザー モード コンポーネントは、より大きな I/O のサポートを活用するために変更されています。これらのコンポーネントには、エクスプローラのコピー機能やコマンド プロンプトの Copy コマンドがあります。これらは 1 MB の I/O を発行するようになりました。

次回のトピック

これまでで、Windows Vista カーネルが強化されている 2 つの分野を見てきました。私の著書『Windows Internals』(英語) (David Solomon との共著) の次の版には、さらに詳細な情報が記載されています。これは、"Longhorn" というコード名を持つ次のバージョンの Windows Server と同時期に出版される予定です。次回の記事では、新しいカーネルを引き続き紹介し、メモリ管理およびシステムの起動と停止について説明します。

Mark Russinovichは、Microsoft の Platform and Services Division に属するテクニカル フェローです。彼は『Microsoft Windows Internals』(英語) (Microsoft Press、2004) の共同執筆者で、IT および開発者会議で頻繁に講演を行っています。彼は、共同創立した Winternals Software の Microsoft による買収に伴い、Microsoft に入社しました。彼は Sysinternals の創立者でもあり、同社では Process Explorer、Filemon、および Regmon ユーティリティを発表しています。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.