排程優先順序
線程會根據其 排程優先順序來執行。 每個線程都會獲指派排程優先順序。 優先順序層級的範圍從零(最低優先順序)到31(最高優先順序)。 只有零頁執行緒的優先權可以是零。 (當沒有任何其他線程需要執行時,零頁線程是負責零任何可用頁面的系統線程。
系統會將所有優先順序相同的線程視為相等。 系統會以迴圈配置資源方式將時間配量指派給優先順序最高的所有線程。 如果這些線程都無法執行,系統會以迴圈配置資源方式將時間配量指派給具有下一個最高優先順序的所有線程。 如果較高優先順序的線程可供執行,系統就會停止執行較低優先順序的線程(不允許它完成其時間配量),並將完整時間配量指派給較高優先順序的線程。 如需詳細資訊,請參閱 上下文切換。
每個線程的優先順序取決於下列準則:
- 其進程的優先順序類別
- 線程在其進程優先順序類別內的優先順序層級
優先順序類別和優先順序層級會結合成一個線程的 基底優先順序。 如需線程動態優先順序的相關信息,請參閱 優先順序提升。
優先類別
每個行程都屬於下列其中一個優先順序類別:
- IDLE_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_BELOW_NORMAL(低於正常的線程優先級)
線程_優先級_正常
THREAD_PRIORITY_ABOVE_NORMAL
執行緒優先權_最高
執行緒優先順序_時間最關鍵
所有線程都會使用 THREAD_PRIORITY_NORMAL 來建立。 這表示線程優先順序與進程優先順序類別相同。 建立線程之後,請使用 SetThreadPriority 函式來調整相對於進程中其他線程的優先順序。
典型的策略是針對進程的輸入線程使用THREAD_PRIORITY_ABOVE_NORMAL或THREAD_PRIORITY_HIGHEST,以確保應用程式能回應使用者。 後台線程,特別是處理器密集的線程,可以設置為THREAD_PRIORITY_BELOW_NORMAL或THREAD_PRIORITY_LOWEST,以確保它們可以在必要時被中斷。 不過,如果您有線程等候另一個優先順序較低的線程來完成某些工作,請務必封鎖等候的高優先順序線程的執行。 若要這樣做,請使用 wait 函式、重要區段或 Sleep 函式、SleepEx或 SwitchToThread 函式。 這比讓線程執行迴圈更可取。 否則,進程可能會變成死結,因為優先順序較低的線程永遠不會排程。
若要判斷線程目前的優先順序層級,請使用 GetThreadPriority 函式。
基底優先順序
進程優先順序類別和線程優先順序層級會合併成每個線程的基底優先順序。
下表顯示進程優先順序類別和線程優先順序值組合的基底優先順序。
進程優先順序類別 | 線程優先順序層級 | 基底優先順序 | |
---|---|---|---|
IDLE_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
執行緒_優先順序_最低 | 2 | ||
執行緒優先權低於正常 | 3 | ||
線程優先級_正常 | 4 | ||
線程優先級高於正常 (THREAD_PRIORITY_ABOVE_NORMAL) | 5 | ||
執行緒_優先級_最高 | 6 | ||
THREAD_PRIORITY_TIME_CRITICAL(執行緒優先級時間關鍵) | 15 | ||
BELOW_NORMAL_PRIORITY_CLASS | 線程優先級_閒置 | 1 | |
THREAD_PRIORITY_LOWEST | 4 | ||
THREAD_PRIORITY_BELOW_NORMAL (執行緒優先級低於正常) | 5 | ||
執行緒_優先權_正常 | 6 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 7 | ||
執行緒_優先級_最高 | 8 | ||
線程優先級_時間關鍵 | 15 | ||
NORMAL_PRIORITY_CLASS(正常優先順序類別) | THREAD_PRIORITY_IDLE | 1 | |
執行緒優先順序_最低 | 6 | ||
THREAD_PRIORITY_低於正常 | 7 | ||
正常執行緒優先順序 (THREAD_PRIORITY_NORMAL) | 8 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 9 | ||
執行緒優先級-最高 | 10 | ||
THREAD_PRIORITY_TIME_CRITICAL (執行緒優先級 - 時間關鍵) | 15 | ||
高於正常優先級類別 | 線程優先級_閒置 | 1 | |
THREAD_PRIORITY_LOWEST(最低執行緒優先級) | 8 | ||
THREAD_PRIORITY_BELOW_NORMAL(線程優先級低於正常) | 9 | ||
執行緒優先順序:一般 | 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 | ||
執行緒優先權_正常 | 13 | ||
THREAD_PRIORITY_ABOVE_NORMAL (可解釋為高於正常的執行緒優先順序) | 14 | ||
THREAD_PRIORITY_HIGHEST | 15 | ||
執行緒優先順序_時間關鍵 | 15 | ||
REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 16 | |
執行緒優先級最低 | 22 | ||
THREAD_PRIORITY_BELOW_NORMAL | 23 | ||
執行緒_優先級_正常 | 24 | ||
THREAD_PRIORITY_高於標準 | 25 | ||
THREAD_PRIORITY_HIGHEST(執行緒最高優先級) | 26 | ||
執行緒優先級_時間_關鍵 | 31 |