特集
Windows 9x or Windows 2000?

9.Windows 2000のプロセス管理メカニズム(2)

デジタルアドバンテージ
2000/08/23


柔軟なスレッド スケジューリングを可能にするクォンタム

 先に触れたように、Windows 2000のスレッド スケジューリングでは、各スレッドごとにクォンタムと呼ばれる実行単位が割り当てられている。結果的に見れば、このクォンタムは、1つのスレッドが連続的に実行される時間に等しい。しかし実際のクォンタムは整数カウンタで、タイム スライスのたびにこの整数カウンタから一定の値を引き算し、値がゼロになるまでスレッドを実行するというふうに機能する(クォンタムの値が大きいほど、スレッドは長い時間、連続的に実行されることになる)。

 ただし、クォンタムの値が大きいからといって、必ずその値を使いきるまでスレッドが連続実行されるという保証はない。すでに述べたとおり、スレッドの実行中に、そのスレッドよりもプライオリティの高いスレッドがレディの状態になれば、クォンタムが残っていようと、そのスレッドは「レディ」の状態にされて、プライオリティの高いスレッドが「実行」されることになる。あるいは、同期処理などのために、スレッドが自主的に「待機」状態に入った場合も、残ったクォンタムとは無関係に、他のスレッドが「実行」される。逆に言えば、こうした事態が発生しなければ、スレッドはクォンタムを使いきるまで連続的に実行される。

 ご承知のとおり、Windows 2000は、クライアント向けのProfessionalから、Server、Advanced Server、Datacenter Serverと、SOHO向けの小規模なものから、データセンター向けの大規模サーバまで、基本的に同じカーネルでカバーしている。しかしビジネス アプリケーションなどを多用するクライアント用途と、各種サービス(共有ディレクトリや共有プリンタ、データベース サービスなど)をクライアントに対して提供するサーバ用途では、実行されるプログラムの種類も違えば、それらを効率的に運用するためのスレッド スケジューリングも大きく異なる。スレッドのプライオリティに加えて、こうした幅広い用途にWindows 2000を対応させるために、スレッド スケジューリングに柔軟性を持たせることがクォンタムのはたらきである。

ProfessionalとServerにおけるデフォルトのクォンタムの違い

 具体的には、ビジネス アプリケーションを実行するクライアント用途では、ユーザーがフォアグラウンド アプリケーションを常に操作している。この場合には、キー入力やメニュー操作、ダイアログ ボックスの操作など、操作に対して素早く応答することが重要になる。一方のサーバ用途では、このようなユーザー インターフェイスにかかわる処理はそれほど重要ではない。このためWindows 2000では、ProfessionalとServerで、スレッドのデフォルトのクォンタムをそれぞれ6と36と変化をつけている。

 すでにお分かりのとおり、Professionalのクォンタムが小さい値なのは、ユーザー インターフェイスの処理に素早く応答できるようにすることだ。クォンタムが短ければ、それだけスレッドの切り替え(コンテキスト スイッチ)は頻繁に発生することになり、この目的を達成しやすくなる。

 Serverのクォンタム値が大きいのは、サーバ サービスでは、めまぐるしく実行スレッドを切り替えるよりも、コンテキスト スイッチを発生することなく、サービスの処理に十分なCPU時間を当てるべきと判断されたためだ。サーバは、一般的には、ユーザーがインタラクティブに使うというよりも、ある特定のサービスをずっと(ユーザーがログオンせずに)実行するという使い方をすることが多いので、このような設定になっている。これらのクォンタム値の違いを図示すると次のようになる。

デフォルト クォンタムの違い
ユーザーの操作に素早く応答することが重要なProfessionalではデフォルト クォンタム値(6)は小さく、その必要のないServerではデフォルト クォンタム値はその6倍(36)と大きい。Windows 2000のスレッド スケジューラは、タイム スライスのたびにスレッドのクォンタム値から3を減算し、これが0になるまでスレッドに連続的にCPU時間を割り当てる。「Q」はクォンタム値を表している。

 このようにWindows 2000のスレッド スケジューラは、タイム スライスのたびに、スレッドのクォンタム値から3を減算する。こうしてクォンタム値が0になるまで、そのスレッドに連続的にCPU時間を割り当てる。上の図では、タイム スライス時間を10msecとしたが、実際のタイム スライスはシステムのプロセッサによって異なる(15msecの場合もあれば、10msec以下という場合もある)。

フォアグラウンド アプリケーション スレッドのクォンタム ブースト

 Windows 2000 Professionalでは、デフォルトのクォンタム値を小さくして、頻繁にコンテキスト スイッチが発生するようにするだけでなく、ユーザー インターフェイスのレスポンスを向上させるために、さらにクォンタムのブースト(伸長)をダイナミックに行うようになっている。具体的には、フォアグラウンド アプリケーション(アクティブなアプリケーション)が切り替わったときに、そのアプリケーションのスレッドのクォンタム値を2倍ないし3倍に増加させるのである。

 Windows 9xや、3.xまでのWindows NTでは、フォアグラウンド アプリケーションのスレッドのプライオリティを増加(ブースト)させることで、フォアグラウンド側アプリケーションを優先的に実行するようになっていたが、この方式では、CPU使用率の高いアプリケーションをフォアグラウンドとバックグラウンドで同時実行すると、フォアグラウンド側ばかりにCPU時間が割り当てられて、バックグラウンド側はあまり処理が進まないという欠点があった。

 そこでWindows 2000では、プライオリティをブーストするのではなく、クォンタム値をブーストすることにより、このような場面でも、より円滑にフォアグラウンド アプリケーションとバックグラウウンド アプリケーションの処理を進められるようにした。代わりに、フォアグラウンド側のレスポンスは、従来の方式よりも低下する危険があるが、システムのプロセッサ性能は飛躍的に向上し続けているので、これが深刻な問題になることはないだろう。

 クォンタム ブーストが行われるのはWindows 2000 Professionalだけで、Server以上ではこのようなブーストは行われない。ただし必要なら、Windows 2000 Professionalでも、Serverと同じく長いクォンタムをスレッドに与え、かつクォンタム ブーストを行わなくする方法がある。これには、コントロール パネルの[システム]アプレットを実行し(または[マイ コンピュータ]アイコンを右クリックし、表示されるメニューの[プロパティ]を実行する)、[詳細]タブにある[パフォーマンス]グループの[パフォーマンス オプション]ボタンをクリックする。すると次のような[パフォーマンス オプション]ダイアログが表示される。

[パフォーマンス オプション]ダイアログ
Windows 2000 Professionalでも、Serverと同じくスレッドのクォンタム値を大きくし、フォアグラウンド アプリケーション スレッドのクォンタム ブーストを行わなくすることができる。これには、システムのプロパティ ダイアログにある[パフォーマンス オプション]ボタンをクリックし、[パフォーマンスの最適化]グループのラジオ ボタンを[アプリケーション]から[バックグラウンド サービス]に変更すればよい。
  Windows 2000 Professionalでのデフォルト設定はこちら。デフォルトのクォンタム値は小さく、フォアグラウンド アプリケーション スレッドのクォンタム ブーストが行われる。
  Serverと同じように機能させるなら、こちらを選択する。すると、デフォルトのクォンタム値は大きくなり、クォンタム ブーストも行われなくなる。

Windows 2000におけるスレッド実行

 すでに大筋は説明してしまったが、最後に、Windows 2000におけるスレッド実行のしくみについてまとめておこう。

 まずは、次の図をご覧いただきたい。これは、あるタイム スライスにおけるスレッドの状態を示している。図の上にある数値はプライオリティで、その下にある緑色の部分は、「レディ」状態にあるスレッドを順に並べたレディ キューである。

スレッド実行のメカニズム(1)
この図は、あるタイム スライスにおけるスレッドの状態を表したものだ。図の上端に表記した数値はプライオリティで、各プライオリティごとに、「レディ」状態にあるスレッドが、下のスレッド キュー(緑色の部分)にキューイングされている。この状態では、最も高いプライオリティのスレッドは「18」なので、プライオリティ18のスレッドのうち、キューの先頭にあるスレッドが実行されている。

 この状態では、最も高いプライオリティのスレッドは「18」なので、プライオリティ18のスレッドのうち、キューの先頭にあるスレッドが実行されている。

 ここで、18よりも高いプライオリティ(19)を持つスレッドが新たに「レディ」状態になったとしよう。するとWindows 2000のスレッド スケジューラは割り込みを受け、より高いプライオリティのスレッドが「レディ」になったことを知らされる。するとスレッド スケジューラは、今まで実行していたスレッドをレディ キューの先頭に戻し、プライオリティ19のスレッドを優先的に実行する。

スレッド実行のメカニズム(2)
上の状態で、よりプライオリティの高いスレッド(プライオリティ=19)が「レディ」状態になると、スレッド スケジューラは割り込みによってこれを知らされ、今まで実行していたスレッド(プライオリティ=18)をレディ キューの先頭に戻し、プライオリティ19のスレッドを優先的に実行する。

 こうしてスレッド19の処理が完了すると、再度スレッド18の処理が行われ、クォンタムを使いきるまで実行される。

 スレッドがクォンタムを使いきったが、スレッドの処理自体は完了していないときには、そのスレッドはレディ キューの最後尾に移動される。これにより今回の例では、スレッド18のレディ キューにある次のスレッドが実行されることになる。

スレッド実行のメカニズム(3)
スレッドがクォンタムを使いきったが、スレッドの処理自体は完了していないときには、今まで実行されていたスレッドがレディ キューの最後尾に移動され、レディ キューの最前列にある次のスレッドが実行される。

 このほかにも、スレッドの同期処理やI/O待ちなどによって、スレッドが自発的に制御を解放することもある(自発的に「レディ」状態から「待機」状態になる)。この場合スレッド スケジューラは、現在レディ キューに入っているスレッドのうち、プライオリティの最も高いものを実行することになる。

 ところで、Windows 2000はマルチプロセッサ システムにも対応しているが、その場合でも、スレッドの実行順序などは上の説明とほぼ同じようになっている。実行可能なスレッドのうち、優先度の高いものから順番に各プロセッサに割り当てていくのである。ただし、すべてのプロセッサを完全に平等に扱うのではなく、なるべく同じプロセッサ上に同じスレッドが割り当てられるようにスケジューリングを行っている。つまり、スレッドを実行するプロセッサが、実行のたびに変わらないようにする、もしくはなるべく同じプロセッサ上で実行できるようにスケジューリングしているのである(プログラムやユーザーの指示によっては、プログラムやスレッドを実行するプロセッサを、特定のCPUだけに限定させることも可能である)。これは、スレッド切り替えのたびにプロセッサが変わってしまうと、そのたびにCPUに付随したキャッシュ(一般的には、1次キャッシュおよび2次キャッシュ。SMPシステムでは、メイン メモリは共有されているが、キャッシュ サブシステムは各CPUごとに独立して装備・管理されている)の内容を再ロードしたり、同じデータを保持しているほかのプロセッサのキャッシュの内容を破棄したりしなくてはならないため、パフォーマンスが低下するからである(マルチプロセッサ システムでは、複数のキャッシュに同じデータが保持されている可能性があり、データを書き換える場合は、データの一貫性を維持するためにほかのキャッシュの内容を破棄したりする必要がある)。同じプロセッサ上でスレッドを動作させれば、(過去のキャッシュの内容が残っていれば)キャッシュ内容の再ロードの必要がなくなり、マルチプロセッサ システムの性能を最大限に発揮することができる。このようなスケジューリング方法を行わないと、場合によっては、シングル プロセッサ システム上で実行するよりも、マルチプロセッサ システム上で実行した場合の方が,パフォーマンスが低下することすらある。このため、なるべく同じCPU上でスレッドが実行されるように、スレッドをスケジューリングしている。

過去との互換性か、将来性か

 以上、Windows 9xとWindows 2000のプロセス管理メカニズムについて解説してきた。両者の違いをひと言でいえば、「過去との互換性を重視するか、互換性をある程度犠牲にしても将来性をとるかの違い」ということになるだろう。

 基本的なプロセス管理方式は、Windows 9xにおいても、スレッド ベースのプリエンプティブなスケジューリングがなされるのだが、Windows 9xでは、過去との互換性を重視し、リエントラントに耐えられない16bitコードをカーネルの一部にそのまま持ち越したため、せっかくのマルチタスク機能を制限する羽目に陥っている。

 一方のWindows 2000は、マルチプロセッサ対応など、Windows 9xからはまったく新規にプロセス管理機能を実装している。Windows 9xのように、過去との互換性を維持するために制限を加えたりはしていない。その意味では、スレッド ベースのプリエンプティブなマルチタスク機構を順当に実装していると言えるだろう。スレッド スケジューリングについても、プライオリティだけでなく、クォンタムの調整などによって、用途に応じた柔軟性の高いプロセス管理を可能にしている。

 通常の状態では、両者の違いをユーザー レベルで感じることはあまりないかもしれない。しかし、アプリケーションがハングアップしてしまったときや、異常な挙動を示したときでも、Windows 2000なら、他のアプリケーションに制御を切り替えて、それらのデータだけでも救える可能性が高い。こうした事態に一度でも遭遇して、重要なデータを失った経験があるなら、少なくともビジネス用途において、いずれのメカニズムが望ましいかは説明する必要はないだろう。End of Article

 

 INDEX
  [特集]Windows 9x or Windows 2000?
     1.イントロダクション
     2.Windows 9xカーネルの概要
      コラム:Windows歴史、メモリの歴史 (1)
      コラム:Windows歴史、メモリの歴史 (2)
     3.Windows 2000カーネルの概要 (1)
     4.Windows 2000カーネルの概要 (2)
     5.プロセス管理の概要
     コラム:Windows 3.xのマルチタスク システム
     6.Windows 9xのプロセス管理メカニズム (1)
     7.Windows 9xのプロセス管理メカニズム (2)
     8.Windows 2000のプロセス管理メカニズム (1)
   9.Windows 2000のプロセス管理メカニズム (2)
 
 特集


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

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間