4

スレッドの優先度を下げたり上げSetThreadPriorityたりする方法がわかりません。SetPriorityClass

私の理解では、 はSetPriorityClassプロセスで使用できる優先度の範囲を選択し、SetThreadPriorityはクラス内の相対的な優先度を設定します。

たとえば、スレッドに対してこれを実行した結果はどうなりますか :

SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN);

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);

手伝ってくれてありがとう。

4

2 に答える 2

4

PROCESS_MODE_BACKGROUND_BEGIN私が観察したものの、明らかに文書化されていないことの1つは、少なくともWindows 7では、プロセスがメモリにアクセスする方法に関係なく、プロセスのワーキングセットを PERMANENTLY で空にすることです-バックグラウンドモードが終了するまで。

たとえば、通常PROCESS_MODE_BACKGROUND_BEGIN、マシンにギガバイトの空きメモリがあり、プロセスがギガバイトのメモリを消費して常に処理する必要がある場合、プロセスのワーキング セットは割り当てサイズとほぼ等しくなります。つまり、プロセスは、ワーキング セットで使用するすべてのメモリを取得します。良い。
さて、PROCESS_MODE_BACKGROUND_BEGINワーキングセットは数十メガバイトになります!
悪い結果は、これにより一定のページ フォールトが発生し、計算の実行速度が大幅に低下することです。ページ フォールトはファイルのページングではなく、Windows キャッシュ メモリの可能性があります。しかし、ページ フォールトによって計算速度が大幅に低下し、代わりに無意味な負荷で CPU が消費されます。

結論として、優先度の低いバックグラウンド作業PROCESS_MODE_BACKGROUND_BEGINには適していません。この作業は、時間とエネルギーの効率が非常に悪くなります。 プロセスが実際にバックグラウンドで消費することを意図していない場合にのみ適しています。
PROCESS_MODE_BACKGROUND_BEGIN

対照的THREAD_MODE_BACKGROUND_BEGIN、スレッドがプロセス内の唯一のスレッドであっても、そのような恐ろしい影響はありません。 のみを使用して、
完全にオフにする必要があることにも注意してください。の後に呼び出すだけでは不十分です。 したがって、Arno は、1 つのスレッドでも の影響を元に戻すという主張はまったく正しくありません。PROCESS_MODE_BACKGROUND_BEGINPROCESS_MODE_BACKGROUND_ENDTHREAD_MODE_BACKGROUND_ENDPROCESS_MODE_BACKGROUND_BEGIN
THREAD_MODE_BACKGROUND_ENDPROCESS_MODE_BACKGROUND_BEGIN

追加の注意: SetProcessPriorityBoostwithbDisablePriorityBoost = TRUEは、ワーキング セットにそのような影響を与えません。

于 2015-05-28T14:23:40.380 に答える
3

プロセス優先度クラスとスレッド優先度は、スレッドの構築base priorityです。優先順位がどのように組み立てられるかについては、優先順位のスケジューリングを参照してください。このリストを見ると、あなたの理解がある程度正しいことが明らかになります。特定のプライオリティ クラス内で、base priorityは によって決定されるさまざまな値を持つことができますthread priority

PROCESS_MODE_BACKGROUND_BEGINSetPriorityClassと のTHREAD_MODE_BACKGROUND_END値はSetThreadPriority、すべての Windows バージョンでサポートされているわけではありません。

PROCESS_MODE_BACKGROUND_BEGIN: システムは、プロセス (およびそのスレッド) のリソース スケジューリング優先度を下げて、フォアグラウンドでのアクティビティに大きな影響を与えずにバックグラウンド作業を実行できるようにします。

THREAD_MODE_BACKGROUND_END: バックグラウンド処理モードを終了します。システムは、スレッドがバックグラウンド処理モードに入る前のスレッドのリソース スケジューリング優先度を復元します。

ここで問題となっているシナリオの結果は予測可能です。SetPriorityClassは、すべてのスレッドを含むプロセスを に設定しますbackground processing mode。以下SetThreadPriorityは、 からのスレッドのみを解放しますbackground processing mode。ただし、プロセスの他のすべての可能なスレッドは、バックグラウンド処理モードのままになります。

注:との組み合わせのみがprocess priority class thread priority決定しbase priorityます。したがって、 への呼び出しも への呼び出しも基本優先度を返しGetThreadPriorityません。GetPriorityClassそれらの組み合わせのみが、上記の「スケジューリング優先度」リンクで説明されている基本優先度を解放します。残念ながら、新しいbackground processing mode値はまだbase priorityリストに含まれていません。しかし、名前base priorityはここで重要なことを示しています。基本優先度 (プロセス優先度クラスとスレッド優先度から派生) に基づいて、スケジューラーはスケジューリング優先度を動的に適応させることができます。fine tuneバックグラウンド モードは、スケジューリングの優先度を高める方法の 1 つです。もう 1 つの方法は、プライオリティ ブーストです。プライオリティ ブースト機能はしばらくの間存在します。への新しいアクセスbackground processing modeの値を指定SetThreadPriorityしてSetPriorityClass、優先ブースト機能を直接開きます。Windows XP では、SetProcessPriorityBoostを呼び出してこれを行う必要がありました。

于 2012-11-30T09:07:32.880 に答える