プロセスに優先順位を付けても速度が向上しないのはなぜですか?


18

両方とも多くのシステムリソースを使用している2つのアプリケーションがあります。タスクマネージャーで一方の優先度を下げ、もう一方の優先度を上げると、優先度の高いアプリケーションの速度が大幅に向上することはありません。

どうしてこれなの?さらに進んでいるのですか、それとももっとする必要があるのですか?


6
それは実生活のようなものです。他の乗客よりも飛行機に乗ることの優先度が高い場合、それはあなたにとってフライトの時間が短くなるという意味ではありません!
Mehrdad

回答:


28

ボトルネックがCPU自体である場合、優先順位は役に立ちません。ほとんどのシステムにはすべてのプロセスを継続的に実行するのに十分なプロセッサがないため、実際に優先順位は、オペレーティングシステムが次に実行するプロセスを決定するために使用するスケジューリングアルゴリズムに影響します

優先度の高いタスクはキューの先頭にすばやく移動するため、これは一般的なレイテンシーに役立ちますが、プロセスが実際の計算で割り当てられたタイムスライス全体を使い果たしている場合、スケジューリングはそこで何も変更しません。優先順位の変更は、I / Oを待機しているプロセスがあり、応答性を高めたい場合に便利です。


5
優先度は、ボトルネックが実行可能なスレッドが多すぎる場合に役立ちます。タイムスライスの終了時に実行可能なWindows上の優先度の高いスレッドは、優先度の低いスレッドよりも優先して実行される可能性があります(Windowsは優先度の低いスレッドに飢えさせようとせず、時々ブーストします)。優先度は、I / Oを待機しているスレッドにはほとんど影響しません。Windowsは、待機中のI / Oの種類に応じて、I / Oの完了後にスレッドの優先度を一時的に上げます。
マイクディミック

4

優先順位はCPU時間です。すべてのコアが常に100%使用されていますか?そうでない場合、優先度は効果がありません。多くの場合、CPUはボトルネックではなく、メモリ、ディスク、またはGPUリソ​​ースです。


3

優先順位は、使用可能なCPUコアよりも実行可能なスレッドが多い場合にのみ重要です。その場合、優先度は実行するスレッドを制御します。ほとんどのシステムでは、CPUの競合に対して十分な計算が行われていません。スレッドがすべてブロックされ、何かが起こるのを待っています。それは、何かを入力する、マウスを動かす、画面をタッチする、ディスク、ネットワーク、プラグインした他のデバイスからデータが届く、または別のスレッドが重要なデータの処理を完了するのを待っているかもしれません構造。明示的にファイルを読み取るのではなく、ディスクの一部またはスワップアウトされたメモリからプログラムの一部が読み取られるのを待っている可能性があります。

Windowsでは、スケジューラーは各優先度レベルで実行可能なスレッドのキューを保持します。スケジューリングの決定を行うとき-スレッドがそのクォンタム(他の何かを実行する必要がある前に許可された時間)を使い果たした、つまり別のスレッドがターンを取得するか、スレッドがブロックされて実行できなくなったこと、またはより高い優先順位スレッドのブロックが解除されました-実行可能なスレッドがある最優先レベルのキュー内の次のスレッドがスケジュールされます。実行中のスレッドがクォンタムを使い果たした場合、キューの最後に置かれます。実行可能な優先度レベルのスレッドがそれだけであり、他の高優先度の実行可能なスレッドが実行されていないが、実行されていないスレッドがある場合、別のターンを取得します。

マルチコア/マルチプロセッサシステムでは、スレッドを実行できるコアに制限がある場合があります。また、システムはスレッドを理想的なコアとNUMAノード内に保持しようとするため、スレッドのデータはコアのキャッシュに残り、作成されたデータに高速でアクセスできます。次に実行するものが選択できない場合、スレッドは理想的でないコアでも実行されます。

システムはさまざまな動的優先度ブーストと動的クォンタムサイズを使用して、フォアグラウンドアプリケーションがバックグラウンドプロセスよりも多くの時間(必要な場合)を取得し、I / O操作の完了時にプロセスが迅速に反応できるようにします(マウス、キーボード、タッチスクリーン入力)。さらに、優先度の高いスレッドが、優先度の低いスレッドが現在保持しているリソースを待機している優先度の反転を回避するために、優先度の向上が使用されます。優先度が中程度のスレッドも実行されている場合、優先度の低いスレッドはプロセッサ時間の不足に陥り、優先度の高いスレッドは保持されます。したがって、低優先度のスレッドは一時的に高優先度にブーストされるため、時間がかかり、高優先度のスレッドが必要とするリソースを解放することが望まれます。

Windows Vistaより前のバージョンでは、スレッドの優先順位はI / O操作の完了速度に影響ませんでした。Windows Vista以降、I / Oにも優先度を設定できます。デフォルトでは、スレッドの優先度に基づいています。

要約:CPUに大きな負荷がかかっていない限り、スレッドの優先順位を変更した場合の影響はほとんど見られません。その場合でも、その影響は通常最小限です。プロセスがI / Oを待たなければならない場合、または他のプロセスとCPU時間で競合していない場合、既に可能な限り高速で実行されており、優先順位を変更しても速くなりません。


0

一般に、プログラムが複数のCPUを使用するようにするには、余分な労力が必要です(マルチスレッドを追加することにより)。そのため、プログラムの優先順位が最高であっても、1つのコアしか使用していない可能性があります。

その他の考えられる問題:

  • プログラムが非効率的であるか、記述が不十分である可能性があります
  • 「遅い」ディスクアクセスまたは遅いネットワークが原因で速度が低下する可能性があります

0

I / OにバインドされたプロセスのI / O優先度を上げても、必ずしもより速く実行されるとは限りません。たとえば、別の(場合によってはリモートの)プロセスによって生成されたデータのコンシューマーであり、そのソースがデータを生成する速度に追いついている場合は、高速化やスループットの向上ができません。

Mike Dimmickの回答で説明されているように、現在受け入れられている回答(/superuser//a/752587/322588)の最初の文に明確に記載されているものとは反対に、CPUがボトルネックの場合に優先度の変更が最も効果的です(/superuser//a/752864/322588)。さらに、受け入れられた回答の2番目の段落のステートメントは、「プロセスが実際の計算で割り当てられたタイムスライス全体を使い果たしている場合、スケジューリングはそこに何も変更しません」というプロセスは、一般にすべての中で最も高い優先度を持たない限り、完全に間違っています実行待機中の実行可能なスレッド。これは、他のすべての状況では、優先度を上げると、壁時計間隔あたりのタイムスライスが増える可能性があるためです。

マイク・ディミックは、数日前にこの回答の問題を指摘し、はるかに良い回答を提供しましたが、最初の回答は不可解にも票を得続けています。作者の主張によると、彼は単に私たちのダミーに対する答えを馬鹿にしただけではありません。なぜなら、それは単純なものでも単純なものでもないからです。

免責事項:私はディミック氏を知りませんが、彼が何について書いているか知っていると言うことができます。


おそらくあなたは誤解したでしょう。質問はプロセスについてだったランニング速く。CPUにバインドされたプロセスは、スケジューリングユニット(クォンタム)全体を使い果たし、最後に準備完了プロセスのキューに入ります。Windowsのようなデスクトップオペレーティングシステムでは、プロセスが1秒ごとに実行される1 / quantum-Hzのチャンスがあることを意味します。優先度を(一般的に)変更しても、タイムスライスの長さは変わりません。完了するには、常に同じ数のスケジューリングクォンタムが必要です。重要なことに、これはWindowsが実際にプロセスランタイムを測定する方法です:スケジュールされたクォンタムの数。
アンドンM.コールマン

プロセスがあり終える早く、それはまだ走ったスケジューリング・ユニットの同じ数のため。I / Oにバインドされたプロセスが待機リストに登録されると、I / O操作が完了した場合、クォンタムが期限切れになる前に、実行中のプロセスを優先順位の低いプロセスで優先的に実行できます。CPUにバインドされたプロセスにはこの自由がありません。タイムスライス全体を使い果たしてから、準備完了キューに入ります。優先順位が十分に高い場合、すぐに実行すること可能ですが、Windowsが実行時間を測定する方法とは関係ありません。
アンドンM.コールマン

待機中のI / Oバウンドプロセスの優先順位は根本的に異なり、Windowsで報告されるランタイムに測定可能な影響を与える可能性があります。繰り返しますが、Windowsは実行時間を期限切れのクォンタムの数として測定します(プロセスが実際に実行されている10ミリ秒のクォンタムのうち1ミリ秒を費やし、残りの9ミリ秒のI / Oを自発的に待つ場合でも、Windowsカーネルは10ミリ秒の価値があるとカウントしますユーザーモードランタイムの)。プリエンプションは、I / Oバウンドアプリケーションが完了するのに必要なクォンタムを減らすのに役立ちます。他のカーネル(Linuxなど)は、プロセスのランタイムで部分的なクォンタムを正しく測定できますが、Windowsではできません。
アンドンM.コールマン

@ AndonM.Coleman Vista以降では、はい、できます。
ジェイミーハンラハン

@JamieHanrahan:さて、あなたはいつでも呼び出すことができますtimeBeginPeriod (...)。通常、ゲームは開始時にこれを1に設定し、システム上で実行されているすべてにボード全体で1ミリ秒のスケジューリング間隔を適用します。それを行ったプロセスだけに孤立しているわけではありません。マルチタスクのためにWindowsを真剣に考えるのが難しい理由の一部です。
アンドンM.コールマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.