如果你曾經用過windows的任務管理器,就算是沒有學習過windows的內核你也應該有聽說過“進程優先級“這么一個概念。雖然你可能沒有操作過,但是你很有可能在任務管理器里面見過它。今天稍微講一下Windows的進程優先級以及線程優先級。
Windows是一個搶斷式多線程操作系統,在並發的處理的時候最基本的執行單結構是線程,而一個進程內並不是一個執行上不可分割的結構,而是由多個線程組成的。每一個線程在內核中有一個優先級順序,這個順序的取值范圍是0-31,數字越大優先級越高。如果有任意一個高順序的線程需要執行,Windows絕對不會執行低優先級的線程。如果低優先級的線程一直不能被執行,那么線程就被飢餓了,這個時候搶占式操作系統的特點就體現出來了。
但是為什么平時都沒有注意到呢,這里很大的原因是平時絕大多數工作線程的的優先級都是基本差不多一致的,每一個線程基本都能分配到時間片。但是有的時候我們需要創建一些較高優先級或者較低優先級的線程用來完成一些特殊的任務,我們就要了解一下這個線程的優先順序到底是如何計算出來的。
雖然說這個優先順序的取值范圍是0-31,但是你並不能直接通過API來設定優先順序。你能夠設定一個進程優先級以及一個線程優先級。下面是一個Windows的優先級對應表:
線程相對 優先級 |
進程優先級類 |
|||||
---|---|---|---|---|---|---|
Idle |
Below Normal |
Normal |
Above Normal |
High |
Real-Time |
|
Time-critical |
15 |
15 |
15 |
15 |
15 |
31 |
Highest |
6 |
8 |
10 |
12 |
15 |
26 |
Above normal |
5 |
7 |
9 |
11 |
14 |
25 |
Normal |
4 |
6 |
8 |
10 |
13 |
24 |
Below normal |
3 |
5 |
7 |
9 |
12 |
23 |
Lowest |
2 |
4 |
6 |
8 |
11 |
22 |
Idle |
1 |
1 |
1 |
1 |
1 |
16 |
從這個表你可以看出來,實時優先級的進程擁有者極高的數值,通常情況下你不應該把你的進程優先級設置為實時。包括磁盤IO、鼠標顯示、音頻輸出之類的系統功能都在實時優先級中的某些優先級中工作。如果你的線程優先級高於它們,並且需要大量CPU運算很有可能導致整個操作系統無法響應。不過微軟在windows vista開始引入UAC之后開始限制了管理員賬戶的一些權限,現在你必須需要完全的UAC管理員權限才能把進程的優先級設置為實時,否則系統不會報錯,但是最高會給你設置到高。
轉自: