web-dev-qa-db-ja.com

タスクマネージャで優先度はどのように機能しますか。また、これを設定する必要がある場合とそうでない場合はどうなりますか?

実際に何が起こるかを確認するために、いくつかのプロセスの優先順位を設定してきましたが、どうなるかと思います...何もありません。すべて同じように実行されます...

私はGoogleで優先度が処理速度と実際には関連していないことを発見しました、それは本当ですか?それならどうして?プロセスの優先度が最も高い場合、それはより速くなるべきではないですか?

30
Pablito

食料品店の「行頭に行く」カードがあるとします。店に行き、カートに入れ、チェックアウトカウンターに行き、列に並んでいる人がいないことを確認します。あなたのカードはあなたがより早くチェックアウトされるのを助けますか?いいえ。

優先度は処理速度に影響を与えません。つまり、優先度の高いプロセスは高速に実行されず、CPU時間をより多く使用することさえできません... CPUを使用したいのがそれだけではない場合。 =

これについて本当に話すには、スレッドについて言及する必要があります。 Windowsではプロセスは「実行」されません。プロセスの一部であるスレッドが実行されます。 (ただし、プロセスにスレッドが1つしかない場合は、外部との区別はかなりあいまいです。)

(ちなみに、CPUに「4つのコアと8つのスレッド」などがあるというマーケティング用語は誤解を招くものです。CPUにはコアがありますが、CPUにはスレッドがありません。スレッドはプロセスの一部です。CPUコアハイパースレッディングを有効にしない場合実行可能 1スレッド、ハイパースレッディングを有効にした場合、コア実行可能 2スレッド。ただし、CPUはスレッドを「持たない」。

各スレッドは常に、いくつかのスケジューリング状態の1つです。最も一般的に見られる状態は次のとおりです。待機中(* nixはこれを「ブロック」と呼びます。両方のOSで、これはI/Oまたは同様のものを待機していることを意味し、CPU時間を使用せず、何も望まない); Ready(CPU時間を使用したいが、現在使用可能なCPUがない場合);および実行中。実行中のスレッドのみがCPU時間を消費します。つまり、プロセスに実行中のスレッドがない場合、タスクマネージャーなどのツールでCPU時間を0%使用することがわかります。

スレッドは一度に1つのコア(またはハイパースレッディングが有効になっている場合は「論理プロセッサ」)でのみ実行できるため、プロセスは、現時点で実行したいスレッドと同じ数のCPUコア(またはLP)しか使用できません。 。 (システム全体についても同じことが言えます。)

ほとんどのシステムのほとんどのスレッドは、ほとんどの時間を待機状態で費やしています。 (これが、システムが何も実行していないときにアイドルプロセスがCPU時間の95%を超える必要がある理由です。)例外は、ビデオや3Dレンダリング、ゲームなどの「機能する」スレッドです。非常に少ないスレッドCPUを100%使用する可能性があります。通常、どこかから読み取る必要のある入力データを処理する必要があり、通常、どこかに書き込む必要のある出力データを作成するためです。また、時間の経過とともにメモリ内のさまざまなデータを参照する可能性があります。つまり、ハードページフォールトが解決されるまで待つ必要があります。

しかし、ビデオレンダリングや3D画像レンダリングなどの処理を行うスレッドは、ほとんどすべての時間をCPUで「計算」し、I/Oを待機する時間はほとんどありません。このようなスレッドは、しばしば「コンピュートバウンド」と呼ばれます。つまり、スレッド全体のパフォーマンスは、主にCPU速度によって制限されます。

タスクマネージャで行う設定は、プロセス内のすべてのスレッドの「基本優先度」を実際に確立します。スレッドの実際の、または「現在の」優先順位は、高くなる可能性があります(ただし、ベースより低くなることはありません)。その詳細については後で説明します。スケジューリングの決定(「誰が、どのCPUで実行するか」)は、常にスレッドの現在の優先順位を使用して行われます。優先度は、ReadyスレッドとRunningスレッドでのみ意味があります(または、逆に言えば、priority is n't Waitingスレッドで意味があります)。

Windowsはpreemptiveスケジューリングアルゴリズムを使用します。システム内の1つのスレッドだけがCPU時間を使用したい場合、その優先順位が何であるかは重要ではありません。 CPUの100%を取得します。優先度の高いスレッドが発生した場合に備えて、優先度の低いスレッドが実行されているときに、スケジューラーがCPUの機能の一部を「保留」するようではありません。

2つのスレッドがCPUを使用することを望んでいて、それらが同じ優先順位である場合、それらは「タイムスライシング」と呼ばれるものを介してスケジュールされ、時間の経過とともに、それぞれがCPUの時間の約50%を取得します。一方、それらの優先度が異なる場合、優先度の高いスレッドは100%になり、優先度の低いスレッドはnothingになります。

(実際には、何も得られません。定期的に「飢餓回避の優先度のブースト」が発生し、4秒または5秒ごとに数十ミリ秒かかる場合があるためです。ただし、これは「優先度の高いもの」の例外ではありません。これは、飢えたスレッドの優先順位を調整することによって行われるためです。)

複数のCPUコアがある場合、物事はより面白くなり、一般的に優先順位はlessの効果があります。実行する2つのスレッドがあるとします。そして、それらのスレッドと同じかそれ以上の優先順位の何も実行していないCPUコアが2つ以上あるとします。次に、2つのスレッドはそれぞれコアの100%を取得しますそれぞれの優先度に関係なく

(スーパーマーケットに2人が現れ、2人のレジ係が無料です。顧客の1人が「行頭に行く」カードを持っています。問題ではありません。)

tl; drバージョン(これまでのところ):優先順位は、「誰がどのくらいの割合のCPU時間を取得するか」ではなく、「誰が最初に実行するか」です。

ここでは、Windowsがコア内の2つの「論理プロセッサ」のそれぞれを、HTがオフになっている場合のコアとほぼ同じ方法で処理することを除いて、ハイパースレッディングについてはあまり詳しく説明しません。つまり、これらは「実際の」CPUとして扱われますが、次の例外があります。Windowsは、コアで一度に複数のLPを使用しないように非常に努力します。つまり、number-of-coresより多くのスレッドが同時にすべて実行しようとするまで、コア内の両方のLPが使用されているのを目にすることは通常ありません。これは、2つの「論理プロセッサ」では、単一の非ハイパースレッドコアの2倍のパフォーマンスが得られないためです。

「基本優先度」について:Windowsは、最近行った処理に基づいて、スレッドの現在の優先度を調整(「ブースト」および「減衰」)します。最近I/O操作を完了したスレッドは、通常、ベースの1〜2ノッチになります。多くの場合、UIスレッド(ウィンドウを実行しているスレッド)はかなり高くなります。 CPUバウンドスレッドは通常、そのベースになります。これの目的は、プログラムのUIの応答性を維持すること、およびIO要求がディスクなどに流れ続けることを維持することです。

プログラム(プロセス)は、プロセスの優先順位(タスクマネージャで設定したもの)によって決定される範囲内で、各スレッドの基本優先順位を変更することもできます。しかし、プログラムの大部分は気にしません。 (それらの多くはすべきです。)

他にも起こっていることがある。優先度のブースト/ディケイ、およびマルチプロセッシングシステム(マルチコアまたはハイパースレッド、あるいはその両方)が最近非常に一般的であり、Windowsのバックグラウンドで常に実行されているものが存在するため(ただし、CPU時間をあまり使用しないことが望ましい)、また、ハードとソフトの両方の「親和性」の影響により、テストケースを実行して、ここで予測される正確な結果を得るのは困難です。しかし、これはあなたに正しい絵に近いものを与えるはずです。

結論として...

ほとんどのものを「通常」のままにしておくのが妥当です。そうしないと、OSのディスクキャッシュフラッシュ機能など、実際に機能させたいもの(存在することを知らなくても)が簡単に不足してしまう可能性があります。実際、OSのプロセスの多くはNormal以外の場所にあり、Windowsがそれらを配置する場所に残しておく必要があります。

タスクマネージャーを使用して優先度をいじる合理的なケースは、CPUを消費するタスク(ビデオや3Dレンダリングなど)があり、実行中のシステムの使用が遅くなる場合です。正しいかどうかは、信じられないかもしれませんが、優先順位をlower優先順位を1〜2段下げることです。それは何も望まないすべてのCPUサイクルを楽しく使用しますが、システムのインタラクティブな使用の邪魔にならないようにします。作業が完了するまで少し時間がかかる場合がありますが、他のプログラムのインタラクティブな使用への干渉を最小限に抑えて作業が完了します。そのトレードオフが気に入らない場合は、行わないでください。ただし、「速くする」ために優先度を高く設定すると、完了するまでUI全体がハングする可能性があります。

いわゆるリアルタイム優先度クラスには何も設定しないでください。

(編集-この段落が追加されました)OK、それは極端な発言です。 (「普遍的な主張は真実ではありません-これを除いてはありません。」)少なくとも、非常に注意深い検討なしではありません。あなたの目標が何かをより速く実行することである場合、それはおそらく助けにはなりません。しかし、システムを「ハードロック」する可能性があります(リセットが必要、または最新のほとんどのマシンでは、電源サイクルが必要です)。または、ハードロックされる可能性があるほど応答しないようにします。

n.b .: Vista以降では、すべてのビデオプレーヤーアプリで「マルチメディアクラスのスケジュール」機能を有効にする必要があります。これにより、自動的にCPUの最大80%が、比較的短い間隔で計算されます。それでグリッチのない再生ができない場合は、何かが非常に間違っています。

詳細については、Solomon、Russinovich、およびIonescuによるWindows Internals 6th Editionのスレッドとスケジューリングに関する章を参照してください。

プロセスの優先度とスレッドの優先度の設定方法、およびタスクマネージャーの[優先度]列の意味については、 こちらの私の回答 も参照してください。

52
Jamie Hanrahan

優先順位を変更すると、オペレーティングシステムが実行中のアプリケーションにCPU時間を割り当てる方法が変わります。全体的なCPU使用率が高い場合にのみ、顕著な効果を生み出します。

たとえば、ビデオをエンコードして、同時に別のビデオを見るとします。おそらく、エンコーディングアプリケーションは、すべてのCPUコアで100%の計算能力を利用します。その結果、他のアプリケーションが途切れることがあります。

Windowsはデフォルトで、両方のアプリケーションに等しい「通常」の優先順位を与えます。この時点で、ムービープレーヤーソフトウェアの優先度を上げることができます。このようにすると、エンコードソフトウェアがビデオプレーヤーと比較してバックグラウンドプロセスに低下するため、ビデオエンコーディングが遅くなりますが、ビデオの再生はスムーズになります。

5