連載
» 2001年03月09日 05時00分 UPDATE

Tech TIPS:Windowsで起動するプログラムの優先度を変更する方法 (1/2)

Windowsでは、実行するプログラム(プロセス)それぞれに「優先度」が設定される。他のプロセスの優先度が上がると、優先度の低いプロセスはその影響を受けて、実行が滞ってしまうことがある。そんなとき、優先度を手動で変更する方法は?

[打越浩幸,デジタルアドバンテージ]
Tech TIPS
Windows Server Insider


「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000


解説

 Windows 2000はマルチタスクをサポートしたOSであり、同時に複数のプログラム(プロセス)を実行することができる。しかし実際には1つしかないCPUで複数のプログラムを実行するために、CPU時間を非常に短い単位時間に切り分け、単位時間ごとに各プロセスを切り替えて、(見かけ上の)マルチタスクを実現している。このあたりの詳細については、特集「Windows 9x or Windows 2000?」の「5.プロセス管理の概要」が詳しいので参照されたい。簡単にまとめておくと、「プロセス」の中には(1つ以上の)「スレッド」という実行単位があり(各CPU上で実際に実行されるのは「スレッド」である)、プロセスやスレッドに与えられた優先度に応じて、スレッドにCPU時間を適宜割り当て、それらを切り替えながら実行している、ということである。

 Windows 2000では、実行するプログラムごとに『プロセスの優先度クラス』が決められている。ユーザーがエクスプローラの[スタート]メニューから起動するプログラムは、一般的に「通常」というクラスで起動されることになっている(他に「リアルタイム」、「高」、「アイドル」クラスがある)。そしてプロセス中の各スレッドにも、それぞれ優先度が付けられている。以下に、通常クラスのプロセスにおける、スレッドの基本実行優先度を示しておく。

スレッドの優先度の指定 基本優先度
リアルタイム 24
13
通常以上 10
通常 8
通常以下 6
4
「通常」クラスのプロセスにおけるスレッドの基本優先度
ユーザーが起動するプロセスは「通常」クラスに属する(他に「リアルタイム」、「高」、「アイドル」クラスがある)。プロセスの中には(複数の)スレッドがあり、各スレッドごとに「優先度」が決まっている。優先度は0〜31の数値で決められ、数値が大きくなるほど優先度が高くなる。優先度をまったく指定しないでアプリケーションを起動すると、デフォルトでは「通常」クラス プロセスの「通常」優先度でスレッドが起動されるので、スレッドの優先度は「8」となる。ただし場合によってはこの値はいくらか増減する。

 このスレッドの優先度は基本的な値であり、実際には「プライオリティ・ブースト/クォンタム・ブースト」と呼ばれる一時的な優先度の増加措置によって、いくらか増減させられる。これはGUI操作や入出力処理の完了したスレッドの優先度を一時的に上げる機能だ。これによりシステムの応答性が向上する。詳細については、前出の記事中の「9.Windows 2000のプロセス管理メカニズム(2)」や、マイクロソフト サポート技術情報の「Windows のパフォーマンス オプションの説明」などを参照していただきたい。

 また、スレッドのスケジューリングの都合などによっても、優先度は増減させられる。例えば、長い間実行されないままの低優先度のスレッドに対して、一時的に優先度を上げてCPU時間を強制的に割り当てたりする。

 以上のような事情により、同じクラス・レベルで起動されたプログラムが複数存在していると、場合によっては優先度が下がって、CPU時間が割り当てられなくなる事態が発生する可能性がある。

 一般的には、優先度が少々低下してプログラムの実行が待たされたとしてもほとんど問題はないが、リアルタイム性を重視したアプリケーションでは、このようなタスクスケジューリングによって、深刻な影響を受けることがある。一般的なユーザー環境でこのような影響を受ける可能性のあるソフトウェアとしては、マルチメディア系のアプリケーションなどが該当するだろう。例えばビデオ・キャプチャ・ソフトウェアやCD-R/RWの書き込みソフトウェア、音楽向けシーケンサ・ソフトウェアなどが挙げられる。もちろんこれらのソフトウェアでは、いちばんクリティカルなデータを扱う部分のスレッドは、優先度をデフォルトよりも高くして他のプロセスの影響を受けないようになっているだろうが、システムの性能や他のプログラムの利用状態などによっては、それらの影響を受けて、処理の遅れを生じる可能性がある。

 例えば以下に示すのは、InfoMagic社が販売しているビデオ・キャプチャ・ソフトウェアWinDVR ARENAを利用して、TV番組をキャプチャしているところである。キャプチャ・カードは、アイ・オー・データ機器が販売しているGV-BCTV4/PCIを使用している(WinDVRは録画をするためのソフトウェアであり、別途キャプチャ用のハードウェアを用意する必要がある。キャプチャ・ハードウェアとセットにしたWinDVR ARENA MAXという製品もある)。ここではキャプチャ中にわざといくつかのアプリケーション(エクスプローラやInternet Explorer、ビデオ編集ソフトウェアなど)を起動して、使用してみた。

ビデオ・キャプチャ中のWinDVR ARENA ビデオ・キャプチャ中のWinDVR ARENA
InfoMagic社が販売しているソフトウェア・エンコード方式のビデオ・キャプチャ・アプリケーションWinDVR ARENAを使って、TV番組をキャプチャしているところ。キャプチャ・カードは、アイ・オー・データ機器GV-BCTV4/PCIに、Windows 2000用のWDMドライバを組み合わせて使用している。ここではキャプチャ中にわざといくつかのアプリケーション(エクスプローラやInternet Explorer、ビデオ編集ソフトウェアなど)を起動して使用してみた(通常はこのような使い方はタブーとされている)。「キャプチャ」が実際にキャプチャしたフレームの数、「ドロップフレーム」がキャプチャが間に合わなくなって、失敗したフレームの数である。CPUの負荷は平均では50%程度なのに、5%弱のフレームがドロップしてしまっている(もちろん、このような使い方をしなければほとんどドロップすることはない)。
  (1)キャプチャ中のTV画面ウィンドウ。
  (2)352×240ドット、29.97frame/sで、ビットレート2Mbits/sのMPEG-1形式でキャプチャ中。
  (3)キャプチャの状態。WinDVRでは、マウスをここに置くと、現在のキャプチャの状態がポップアップ表示される。
  (4)キャプチャ中のCPUの負荷は50%程度。CPUはPentium-III、800MHzである。赤い部分(カーネル時間)が少ないことからも分かるように、実際の負荷はすべてアプリケーション(WinDVR)内でのMPEG-1へのエンコードのために消費されているようである。

 この画面から分かるように、キャプチャに要するCPUパワーそのものは大体50%程度であり(この値は使用するシステムや解像度、ビット・レート、画質設定などに大きく依存する)、システム的にはまだ十分余裕がある。しかしこの場合は、キャプチャ中にエクスプローラやInternet Explorer、ビデオ編集ソフトウェアなどを起動して使用したため、5%弱のフレームがドロップ(キャプチャが間に合わなくなって、スキップされてしまうこと)してしまっている(もちろん、このような使い方をしなければほとんどドロップすることはない)。

 このWinDVRというプログラムは、1つのプロセス内に10数本のスレッドが走っているマルチスレッド・アプリケーションであり、キャプチャに必要なスレッドだけは内部で優先度を引き上げるように作られている。しかしメインのスレッドを含むいくつかのスレッドは優先度が起動時のままなので、他のプロセスの優先度が高くなってくると、その影響を受けてしまって、最終的にはキャプチャをするスレッドの実行が滞ってしまうようである(キャプチャ・スレッドの優先度だけが高くても、プログラムの作り方によっては、その他のGUIやファイルの入出力部分などがボトルネックとなってしまう可能性がある)。

 このような状況を改善するには、キャプチャ中には他のアプリケーションをいっさい使用しないというのが一般的に推奨されている方法である。しかしこの場合は、システム的にはまだ余裕があるにもかかわらずフレームがドロップしている。いくら他のアプリケーションを使わないようにしていても、何らかの理由で他のプロセスの負荷が高くなってしまうと(例えばネットワーク関係のサービスなどがバックグラウンドで稼働したりすると)、突発的にドロップが発生する可能性がある。

操作方法

●プログラムの優先度を高くしてフレームのドロップを防ぐ

 この問題に対する最も根本的な解決方法は、他のプロセスよりもキャプチャ・ソフトウェアの優先度を上げて([通常]から[通常以上]か[高]にする)、影響を受けないようすることであろう(優先度というものは、このような目的のために用意されているのだから)。これを簡単に実行するには、タスクマネージャの[プロセス]タブに表示されているWinDVRのプロセスを右クリックして、ポップアップ・メニューから[優先度の設定]−[高]([通常以上]でもよいが、より確実にするためには[高]が望ましい)を選択する。これにより、WinDVRの基本優先度が高くなり、エクスプローラやInternet Explorer、ビデオ編集ソフトウェアなどを使用してもドロップはほとんど起こらなくなった。ただし、激しいディスク・スワップを起こさせたり、ネットワークに高負荷をかけるような使い方をすると、さすがにいくらかのフレームがドロップするので(デバイスの割り込み処理などは最優先で実行されるし、もともと高い優先度で実行されているシステム・サービスも多いから)、いくらでもアプリケーションを起動できるわけではないが、キャプチャだからといって特に神経質になる必要はなくなるだろう(さすがにCD-R/RWライティング・ソフトウェアなどとの併用は避けたほうがよいだろうが)。

タスクマネージャを使ってプログラムの優先度を高くする タスクマネージャを使ってプログラムの優先度を高くする
プロセスの基本優先度を上げるには、タスクマネージャを使用する。[プロセス]タブでプロセスを表示させ、目的のプロセス名を右クリックして、[優先度の設定]から[高]を選択する。アプリケーション名から実際のプロセス名を選択するには、TIPS「アプリケーションに対応するプロセスを素早く発見する方法」を参照していただきたい。
  (1)プロセス名を右クリックして、[優先度の設定]を選ぶ。
  (2)選択できる優先度。ここでは[高]を選択する。

 実際に優先度が高くなっているかどうかを確認するには、やはりタスクマネージャを使用する。タスクマネージャの[プロセス]タブを表示した状態で、[表示]メニューから[列の選択]を選び、[基本優先度]のチェックボックスをオンにする。すると各プロセスの優先度が表示されるようになる。ただしこれで表示されるのは、各プロセスの基本優先度のみであり、個々のスレッドごとの実際の優先度(0〜31の数値)ではない。これらを調べるには、Windows 2000リソースキットに含まれる「pstat.exe」コマンドなどを使用する必要がある。

プロセスの基本優先度の確認 プロセスの基本優先度の確認
タスクマネージャ[プロセス]タブを表示した状態で、[表示]メニューから[列の選択]を選び、[基本優先度]のチェックボックスをオンにする。
  (1)選択できる表示項目の一覧。
  (2)デフォルトの表示項目。
  (3)スレッドの基本優先度を表示させるには、これを選択する。

 なおこのプロセスの優先度の問題は、本来ならばアプリケーション・ソフトウェア側で対応すべき種類のものであり、WinDVRの将来のバージョンでは(各スレッドの優先度が高くなるように)修正されるかもしれないが、ここでは、リアルタイム性の高いアプリケーションにおける、優先度に起因する問題に対する一般的な対処方法として取り上げているので、あらかじめご了承いただきたい。

 また、この手法はもともとCPU負荷が100%に満たないケースについてのみ適用できる方法であることに注意していただきたい。CPUパワーを100%消費するようなアプリケーションの優先度をいくら上げても何ら効果はないし(それ以上速度は向上しない)、他のプロセスがまったく動作できなくなるので、システムがまるでハングアップしたような状態になる可能性がある。

       1|2 次のページへ

Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

Touch Barという新UIを得た「MacBook Pro」、プレゼント!

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。