優先級是線程調度的重要依據。優先級高的線程,永遠先獲得CPU的青睞。當然啦,操作系統會視情況調整各個線程的優先級。例如前臺線程的優先級應該調高一些,後臺線程的優先級應該調低一些。
線程的優先級範圍從0(最低)到31(最高)。當你產生線程時,並不是直接以數值指定其優先級,而是採用兩個步驟。第一個步驟是指定“優先級等級(Priority Class)”給進程,第二步驟是指定“相對優先級”給該進程所擁有的線程。表1是對優先級等級的描述,其中的代碼在CreateProcess的dwCreationFlags參數中指定。如果你不指定,系統默認給的是NORMAL_PRIORITY_CLASS,除非父進程是IDLE_PRIORITY_CLASS(那麼子進程也會是IDLE_PRIORITY_CLASS)。
等 級 | 代 碼 | 優 先 級 值 |
idle | IDLE_PRIORITY_CLASS | 4 |
normal | NORMAL_PRIORITY_CLASS | 9(前臺)或7(後臺) |
high | HIGH_PRIORITY_CLASS | 13 |
realtime | REALTIME_PRIORITY_CLASS | 24 |
表 1 Win32 線程的優先級等級劃分 |
■ “idle”等級只有在CPU時間將被浪費掉時(也就是idle time)才執行。該等級最適合於系統監視軟件,或屏幕保護軟件。
■ “normal”是默認等級。系統可以動態改變優先級,但只限於“normal”等級。當進行變成前臺,線程優先級提升爲9,當進程變成後臺時,優先級降低爲7。
■ “high”等級是爲了滿足立即反應的需要,例如使用者按下Ctrl + Esc時立刻把工作管理器(task manager)帶出場。
■ “realtime”等級幾乎不會被一般的應用程序使用。就連繫統中控制鼠標、鍵盤、驅動器狀態重新掃描、Ctrl + Alt + Del等的線程都比“realtime”的優先級還低。這種等使用在“如果不在某個時間範圍內被執行的話,數據就要遺失”的情況。這個等級一定得在正確評估之下使用,如果你把這樣的等級指定給一般的(並不會常常阻塞的)線程,多任務環境恐怕會癱瘓,因爲這個線程有如此高的優先級,其它線程再沒有機會被執行。
上述四種等級,每一個等級又映射到某一範圍的優先級值,IDLE_最低,NORMAL_次之,HIGH_又次之,REALTIME_最高。在每一個等級之中,你可以使用SetThreadPriority設定精確的優先級,並且可以稍高或稍低於該等級的正常值(範圍是兩個點數)。你可以把SetThreadPriority想象成一種微調操作。
SetThreadPriority 的 參 數 | 微 調 幅 度 |
THREAD_PRIORITY_LOWEST | - 2 |
THREAD_PRIORITY_BELOW_NORMAL | - 1 |
THREAD_PRIORITY_NORMAL | 不變 |
THREAD_PRIORITY_ABOVE_NORMAL | + 1 |
THREAD_PRIORITY_HIGHEST | + 2 |
除了以上五種微調,另外還可以指定兩種微調常數:
SetThreadPriority參數 | 面對任何等級的調整結果 | 面對“realtime”等級的調整結果 |
THREAD_PRIORITY_IDLE | 1 | 16 |
THREAD_PRIORITY_TIME_CRITICAL | 15 | 31 |
這些情況可以以表2作爲總結。
優先級等級 | idle | lowest | below normal | normal | above normal | highest | time critical |
idle | 1 | 2 | 3 | 4 | 5 | 6 | 15 |
normal(後臺) | 1 | 5 | 6 | 7 | 8 | 9 | 15 |
normal(前臺) | 1 | 7 | 8 | 9 | 10 | 11 | 15 |
high | 1 | 11 | 12 | 13 | 14 | 15 | 15 |
realtime | 16 | 22 | 23 | 24 | 25 | 26 | 31 |
表 2 Win32 線程優先級 |