每個執行緒都會被賦予乙個從0(最低)到31(最高)的優先順序號碼.當系統確定將哪個執行緒分配給cpu的時候,它首先觀察優先順序為31的執行緒,並以迴圈的方式對它們進行系統呼叫.如果優先順序為31的執行緒可以排程,那麼就賦予該執行緒乙個cpu時間片.在該執行緒的時間片結束的時候,系統要檢視是否還有另乙個優先順序為31的執行緒可以執行,如果有,它將允許該執行緒被賦予cpu時間片.
只有優先順序為31的執行緒是可以排程的,系統就絕對不會將優先順序為0到30的執行緒分配給cpu.這種情況稱為渴求排程(starvation).這裡存在乙個問題,是否低優先順序的執行緒永遠得不到呼叫,因為在任何乙個時間段內,系統中的大多數執行緒是不能呼叫的.例如:如果主線程呼叫getmessage函式,而系統發現沒有執行緒可以供它使用,那麼系統就暫停程序的執行緒執行,釋放該執行緒的剩餘時間片,並且立即將cpu分配給另乙個等待執行的執行緒.高優先順序的執行緒會搶占低優先順序的執行緒.
當系統引導的時候,它會建立乙個特殊的執行緒,稱為0頁執行緒.該執行緒被賦予優先順序0,它是整個系統中唯一的乙個在優先順序0上執行的執行緒.當系統中沒有任何執行緒需要執行的時候,0頁執行緒負責將系統中的所有空閒的ram頁面置0.
有幾個等級的優先順序需要特別注意:
實時優先順序:程序中線程必須立即對事件作出響應,以便執行關鍵時間的任務.該程序中的執行緒還會搶先於作業系統元件之前執行.使用本優先順序類時必須極端小心.
高優先順序:程序中的執行緒必須立即對事件作出響應,以便執行關鍵時間的任務.task manager 在這個類上執行,以便使用者可以撤銷脫離控制的程序.win2k中加的新優先順序
高於正常:程序中的執行緒在正常優先順序與高階優先順序之間執行win2k中的新優先順序
正常:程序中的執行緒沒有特殊的排程需要.
低於正常:程序中的執行緒在正常優先順序與空閒優先順序之間執行,win2k中的新優先順序
空閒:程序中的執行緒在系統空閒時執行.該程序通常由螢幕保護程式或者後台實用程式和蒐集統計資料的軟體應用.
explorer是在高優先順序上執行的.
相對的執行緒優先順序
關鍵時間,最高,高於正常,正常,低於正常,最低,空閒
程序優先順序和執行緒優先順序之間的對映表: 相對
優先順序等級
空閒低於
正常正常
高於正常高實時
關鍵時間
1515515
1531最高6
8101215
26高於正常57
9111425正常4
681013
24低於正常35
791223最低2
46811
22空閒11
11116
例如正常的執行緒被賦予的優先順序是8,由於大多數程序屬於正常的優先順序類,而大多數執行緒屬於正常執行緒優先順序,因此系統中的大多數執行緒的優先順序是8.如果高優先順序程序中有乙個正常執行緒,該執行緒的優先順序將是13.如果將程序的優先順序改為8,那麼執行緒的優先順序就變為4,如果改變了程序的優先順序類,執行緒的相對優先順序類不變,但是它的優先順序的等級卻發生了變化.
下列優先順序等級是無法使用的:17,18,19,20,21,27,28,29,30.如果編寫乙個以核心方式執行的裝置驅動程式,可以獲得這些優先順序的等級,而使用者方式的應用程式則不能.另外還要注意,實時優先順序中的執行緒不能低於優先順序等級16.同樣,非實時優先順序中的執行緒的等級不能高於15.程序的優先順序類是個抽象的概念,microsoft提出這個概念的目的,是為了幫助你將它與可排程程式內部運**況區分開來.它沒有其他目的.
當使用命令外殼啟動乙個程式的時候,該程式的起始優先順序是正常優先順序.但是,如果使用start命令來啟動該程式,可以使用乙個開關來設定應用程式的起始優先順序.
c:/>start /low calc.exe
start命令還能識別/belownormal,/normal,/abovenormal,/high和/realtime等開關,以便按它們各自的優先順序啟動乙個應用程式.當然,一旦應用程式啟動執行,它就可以呼叫setpriorityclass函式,將它自己的優先順序改為它選擇的任何優先順序.
若要設定和獲得執行緒的相對優先順序,必須呼叫
bool setthreadpriority(handle hthread,int npriority);
下面是檢索執行緒的相對優先順序的補充函式:
int getthreadpriority(handle hthread);
動態提高執行緒的優先順序等級,注意,執行緒的當前優先順序等級決不會低於執行緒的基本優先順序等級.此外,導致執行緒成為可排程執行緒的裝置驅動程式可以決定優先順序等級體提高的數量.系統只能為基本優先順序等級1到15之間的執行緒提高其優先順序等級.microsoft提供了兩個函式可以關閉系統動態提高優先順序的功能.
bool setprocesspriorityboost(handle hprocess,bool disablepriorityboost);
bool setthreadpriorityboost(handle hthread,pbool pdisablepriorityboost);
另一種情況也會導致系統動態地提高執行緒地優先順序等級.比如有乙個優先順序為4的執行緒準備執行但是卻不能執行,因為乙個優先順序為8的執行緒正在連續被排程.在這種情況下,優先順序為4的執行緒就非常渴望得到cpu時間,當系統發現乙個執行緒在大約3至4s內一直渴望得到cpu時間,它就將這個執行緒的優先順序動態提高到15,並讓該執行緒執行兩倍於它的時間量,當到了兩倍時間量的時候,該執行緒的優先順序立即返回到它的基本優先順序.
《windows核心程式設計》 執行緒棧
當系統建立執行緒的時候,會為執行緒棧預訂一塊位址空間區域,並給該區域調撥一些物理儲存器。缺省會預訂1mb的位址空間並調撥兩個頁面的儲存器。但是在構建 應用程式的時候可以改變這個預設值 在構建應用程式的時候鏈結器會把棧的大小寫入到exe和dll檔案的pe檔案頭中,當建立執行緒的時候會根據pe檔案頭中的...
windows核心程式設計 執行緒的TLS
tls thread local storage 執行緒本地儲存 本質 對於一些全域性變數,為每乙個執行緒分配乙個例項,各執行緒只使用自己的例項,而不用去爭搶那乙個全域性變數的例項 tls的真實一億在於不用為每個執行緒去定義乙個全域性匾蛉,而使用特殊關鍵字或者api自動為每個執行緒例項分配私有的全域...
Windows核心程式設計
內容簡介 這是一本經典的windows核心程式設計指南,從第1版到第5版,引領著數十萬程式設計師走入windows開發陣營,培養了大批精英。作為windows開發人員的必備參考,本書是為打算理解windows的c和c 程式設計師精心設計的。第5版全面覆蓋windows xp,windows vist...