排程優先順序

執行緒會根據其 排程優先順序排程來執行。 每個執行緒都會獲指派排程優先順序。 優先順序層級的範圍從零 (最低優先順序) 到最高優先順序) 為 31 (。 只有零頁執行緒的優先順序為零。 (當沒有任何其他執行緒需要執行時,零頁執行緒是負責零任何可用頁面的系統執行緒。)

系統會將所有優先順序相同的執行緒視為相等。 系統會以迴圈配置資源方式將時間配量指派給優先順序最高的所有線程。 如果這些執行緒都無法執行,系統會以迴圈配置資源方式指派時間配量給具有下一個最高優先順序的所有線程。 如果較高優先順序的執行緒可供執行,系統會停止執行優先順序較低的執行緒 (,而不允許它完成其時間配量) ,並將完整時間配量指派給較高優先順序的執行緒。 如需詳細資訊,請參閱 內容切換

每個執行緒的優先順序取決於下列準則:

  • 其進程的優先順序類別
  • 執行緒在其進程之優先順序類別內的優先順序層級

優先順序類別和優先順序層級會結合在一起,形成執行緒的 基底優先順序 。 如需執行緒動態優先順序的資訊,請參閱 Priority Boosts

Priority 類別

每個進程都屬於下列其中一個優先順序類別:

IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

根據預設,進程的優先順序類別NORMAL_PRIORITY_CLASS。 當您建立子進程時,請使用 CreateProcess 函式來指定子進程的優先順序類別。 如果呼叫進程IDLE_PRIORITY_CLASS或BELOW_NORMAL_PRIORITY_CLASS,新進程將會繼承這個類別。 使用 GetPriorityClass 函式來判斷進程的目前優先順序類別,並使用 SetPriorityClass 函式來變更進程的優先順序類別。

監視系統的程式,例如定期更新顯示器的螢幕保護裝置程式或應用程式,應該使用IDLE_PRIORITY_CLASS。 這可防止此進程的執行緒沒有高優先順序,而無法干擾較高優先順序的執行緒。

請小心使用HIGH_PRIORITY_CLASS。 如果執行緒在較長期間的最高優先順序層級執行,則系統中的其他執行緒將不會取得處理器時間。 如果同時將數個執行緒設定為高優先順序,執行緒就會失去其有效性。 高優先順序類別應該保留給必須回應時間關鍵事件的執行緒。 如果您的應用程式執行一項工作需要高優先順序類別,而其餘的工作是正常優先順序,請使用 SetPriorityClass 暫時提高應用程式的優先順序類別;然後在完成時間關鍵性工作之後加以減少。 另一個策略是建立高優先順序進程,讓其所有線程在大部分時間都遭到封鎖,只有在需要重要工作時才會喚醒執行緒。 重點是,高優先順序執行緒應該執行一段短暫的時間,而且只有在有要執行的時間關鍵性工作時。

您幾乎不應該使用REALTIME_PRIORITY_CLASS,因為這會中斷管理滑鼠輸入、鍵盤輸入和背景磁片排清的系統執行緒。 這個類別適用于直接與硬體交談的應用程式,或執行應該有有限中斷的簡短工作。

優先順序層級

以下是每個優先順序類別內的優先順序層級:

THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL

所有線程都會使用 THREAD_PRIORITY_NORMAL 來建立。 這表示執行緒優先順序與進程優先順序類別相同。 建立執行緒之後,請使用 SetThreadPriority 函式來調整其相對於進程中其他執行緒的優先順序。

典型的策略是針對進程的輸入執行緒使用THREAD_PRIORITY_ABOVE_NORMAL或THREAD_PRIORITY_HIGHEST,以確保應用程式回應使用者。 背景執行緒,特別是需要大量處理器的執行緒可以設定為THREAD_PRIORITY_BELOW_NORMAL或THREAD_PRIORITY_LOWEST,以確保可以在必要時先占這些執行緒。 不過,如果您有線程正在等候另一個優先順序較低的執行緒完成某些工作,請務必封鎖等候高優先順序執行緒的執行。 若要這樣做,請使用 等候函式、 重要區段Sleep 函式、 SleepExSwitchToThread 函式。 最好讓執行緒執行迴圈。 否則,進程可能會變成死結,因為永遠不會排程優先順序較低的執行緒。

若要判斷線程目前的優先順序層級,請使用 GetThreadPriority 函式。

基本優先順序

進程優先順序類別和執行緒優先順序層級會合並成每個執行緒的基底優先順序。

下表顯示進程優先順序類別和執行緒優先順序值組合的基底優先順序。

進程優先順序類別 執行緒優先順序層級 基底優先順序
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 2
THREAD_PRIORITY_BELOW_NORMAL 3
THREAD_PRIORITY_NORMAL 4
THREAD_PRIORITY_ABOVE_NORMAL 5
THREAD_PRIORITY_HIGHEST 6
THREAD_PRIORITY_TIME_CRITICAL 15
BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 4
THREAD_PRIORITY_BELOW_NORMAL 5
THREAD_PRIORITY_NORMAL 6
THREAD_PRIORITY_ABOVE_NORMAL 7
THREAD_PRIORITY_HIGHEST 8
THREAD_PRIORITY_TIME_CRITICAL 15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 6
THREAD_PRIORITY_BELOW_NORMAL 7
THREAD_PRIORITY_NORMAL 8
THREAD_PRIORITY_ABOVE_NORMAL 9
THREAD_PRIORITY_HIGHEST 10
THREAD_PRIORITY_TIME_CRITICAL 15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 8
THREAD_PRIORITY_BELOW_NORMAL 9
THREAD_PRIORITY_NORMAL 10
THREAD_PRIORITY_ABOVE_NORMAL 11
THREAD_PRIORITY_HIGHEST 12
THREAD_PRIORITY_TIME_CRITICAL 15
HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 11
THREAD_PRIORITY_BELOW_NORMAL 12
THREAD_PRIORITY_NORMAL 13
THREAD_PRIORITY_ABOVE_NORMAL 14
THREAD_PRIORITY_HIGHEST 15
THREAD_PRIORITY_TIME_CRITICAL 15
REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE 16
THREAD_PRIORITY_LOWEST 22
THREAD_PRIORITY_BELOW_NORMAL 23
THREAD_PRIORITY_NORMAL 24
THREAD_PRIORITY_ABOVE_NORMAL 25
THREAD_PRIORITY_HIGHEST 26
THREAD_PRIORITY_TIME_CRITICAL 31