windows本身就是乙個搶占式作業系統,它的實現,必定有某種演算法在裡面,比如什麼時候排程哪些執行緒,需要花費多長時間等問題。
我們時時在用windows,作為程式設計師,我們有必要知道其中最貼近我們的演算法。
為什麼這麼說?我們對系統發出的命令,獲取資訊等操作,windows為什麼能這麼快作出反應嗎?這僅僅是上下文切換那30毫秒的功勞嗎?作業系統能依照人的操作,處理當前使用者最迫切的請求,並在最短時間內給出反應,這些原因我們應該知道。
有人會提,這是執行緒的功勞,對。這是執行緒的功勞,你在操作的時候,都是執行緒在處理你的請求,現在來了解下執行緒的屬性吧?
開啟開始選單,win7直接在搜尋框中輸入spy,然後會彈出乙個叫spy++的程式,執行spy++。這個東西是vs2010完整版才有。
這是個有趣的東西,好奇的同學可以試試看。現在來看看這個東西能做什麼吧。
我找到了乙個qq的執行緒的視窗,然後右鍵,彈出選單,然後選擇->訊息。
出來乙個框,資料一直再刷,然後再撥出qq介面看?滑鼠在qq上面晃兩下,細心的你會發現。刷屏的訊息是不是很有感覺?再心細的又會觀察一下屬性選項,程序id你也會看到,乙個應用程式也就乙個程序,關係qq的執行緒,所有的程序id都會是一樣。在你每次操作的時候,windows做著超乎你想象的工作,試一試,也許也會讓你驚呼。訊息看完了,來監視下執行緒吧?在spy++中選擇 監視->執行緒
我找到的是qq的執行緒:
上下文開關就是記錄windows上下文切換次數,」2453261「這是系統已經呼叫qq執行緒的次數。而你看到的,就是乙個執行緒的屬性。
現在你也許又會有疑問了,為什麼會這樣?
windows選擇乙個可排程的執行緒有一套獨特的標準,看到上圖中的執行緒的優先順序了嗎?當前優先順序和基本優先順序,它是隨著程式的啟用與否波動的。
乙個執行緒允許執行乙個時間片,沒錯。但是,windows執行執行緒的規律和時間片沒多大的關係,執行緒在執行的任何時刻都可以停止,然後windows又去排程另乙個執行緒,你有點控制權,去控制你想執行的執行緒,但是這控制權不多,不控制為好。
對於執行緒的執行,記住一點:
你不能保證自己的執行緒一直執行,你不能阻止其他的執行緒的執行。
現在把目光放到執行緒優先順序上,每個想成為優秀的程式設計師,必須要了解的知識點。
執行緒優先級別0~31,windows把執行緒用從高到低的排程方式輪流排程執行緒,假如有乙個優先級別為31的執行緒執行結束了,然後windows會找下乙個空閒的執行緒,如果空閒的執行緒中有乙個級別也是31的執行緒,那麼windows又會把31級別的執行緒交給cup處理。
那就有人要問了,如果一直有31的執行緒級別,那豈不是低階別的執行緒windows都不會去呼叫了?這不公平。
確實,windows就是個這樣的不公平。有高階別執行緒,低級別執行緒沒有機會去請求使用cup。
cpu正在執行乙個低階別的執行緒,當乙個優先級別高於正在執行的低階別的執行緒,級別高的執行緒請求呼叫cpu,那麼,會怎麼樣?
windows會毫不猶豫的把正在執行的低級別執行緒趕走,然後放高階別的執行緒去使用cpu,就是有這麼霸道。
較高優先順序執行緒總是搶占較低級別執行緒,這有沒有弱肉強食的感覺?
好,說完級別呼叫的問題,就來看看,怎麼設計應用程式的執行執行緒級別吧。
在設計應用程式時,應覺得自己的應用程式是需要比機器上同時執行的其他應用程式更大還是更小的響應能力,然後選擇乙個程序優先順序類(注意)。
為什麼要引進程式優先順序類?
microsoft其實已經認識到,開發人員在為程序優先順序分配時,很難做到完全合理,你不知道這個程序的優先順序應該設為多少,為了解決這個分配優先順序問題,windows公開了優先順序類的乙個抽象層。以此來反應你的決定,windows支援6個程序優先順序類:idel,below normal,normal,above normal,hight和realtime(依次向高),其中normal是預設的程序優先順序,所以它是最常用的。
如果乙個應用程式在系統什麼都不做的情況下執行,就適合分配乙個idel的優先順序類。估計qq的離開狀態,屏保等是這麼設計的,當然還有很多....
程序劃級時,要考慮最關鍵的因素,不能讓程序妨礙其它更關鍵的任務,只有在絕對必要的時候才使用hight優先順序類,realtime最高優先順序一般得避免,因為它相當高,到31的級別了,它甚至可能干擾作業系統任務,比如阻礙一些網路傳輸,磁碟讀寫等,你肯能覺得沒什麼,除此之外,realtime程序的執行緒可能造成不能及時的處理鍵盤和滑鼠輸入,使用者覺得自己的計算機」崩了(宕機)「,一定要有很好的理由才能使用realtime優先順序,比如響應一些延遲很短的硬體事件。
選好乙個程序優先順序類之後,你的程式和其他應用程式就不用再考慮了,現在把專注力放在應用程式的執行緒上:
windows支援7個相對執行緒優先順序:idel,lowest,below normal,normal,above normal,highest和time-critical。
這些是相對於程序優先順序的,normal依舊是預設的,它是最常用的,現在來打個比方,用個商場來做例子:
這圖勉強入眼。
每個服飾品牌都不一樣,代表著程序優先順序不一樣。
每個品牌下的服飾的**不一樣,代表著它們執行緒優先順序不一樣。
比如阿迪達斯,耐克等,它們程序優先順序高,裡面相對應的執行緒優先順序也高。因為它們**比一般的品牌要貴。
品牌的高低決定服裝的**,程序優先順序的高低覺得相對執行緒優先順序程度!經過這一舉例,下面這個表應該看得懂了:
相對執行緒優先順序
程序優先順序
idle
below normal
normal
above normal
high
realtime
time-critical
1515
1515
1531
highest68
1012
1526
above normal57
9111425
normal46
8101324
below normal35
791223
lowest24
681122
idle11
11116
記住:如果更改乙個程序的優先順序類,執行緒的相對優先順序不會改變,但它的優先值會改變。
也許大家對這些表中數字會有疑惑,這代表的是先前說的0~31執行緒優先級別,但為什麼這個表裡面沒有「0」這個級別?
「0」這個級別是有的,不過它保留給零頁執行緒了,什麼是零頁執行緒?系統在啟動時,會建立乙個名為零頁執行緒的特殊執行緒,它是整個系統唯一執行緒級別為0的執行緒,它輔負責在沒有其他程序需要執行的時候,將系統的ram所有空閒頁清零。表中還有一些數字沒有出現:17,18,19,20,21,27,28,29,30。這些執行緒級別不能被使用者模式獲得,在編寫執行於核心模式的裝置驅動程式時,才可以獲得這些優先順序。
還要注意的是,realtime優先順序的執行緒,其優先順序不能低於16,類似的,非realtime優先順序的執行緒不能高於15。
程序優先順序類和相對執行緒優先順序有沒有分清楚呢?這個概念容易引起混淆,大家可能認為windows能排程程序,然而,windows永遠都不會排程程序,他排程的只有執行緒,「程序優先順序類」是microsoft提出的乙個抽象概念,目的是為了幫助你理解自己的應用程式和其他正在執行的應用程式的關係,他沒有別的用途。
來看個設計例項:
現在有乙個執行緒要設計,他用於長時間執行的計算限制任務,比如:編譯**,拼音檢查,電子**計算等計算功能。一般是降低這執行緒的優先順序,而不是提公升執行緒的優先順序。如果要設計乙個快速的響應時間,然後執行非常短暫的時間,再回覆等待狀態,則應提高該執行緒的優先順序,這裡總結的規律是,高優先順序執行緒在其生命中的大多數時間裡,都應處於等待狀態,這樣才不會影響熊的總體響應能力。
現在請按一下鍵盤右下角位置的windows菜單鍵,看到效果了?windows選單立即搶占其他低階執行緒,並顯示它的選單,使用者在選單中上下移動時,選單的執行緒會快速響應每一次按鍵或者滑鼠移動。這是個很好的高優先順序執行緒的例子,它在使用者關閉選單後停止執行。
你可以更改它的執行緒相對優先順序,thread中的priority屬性,向它傳遞threadpriority列舉型別中定義的5各值之一,即在上表中的灰色部分列。
windows為自己保留了優先順序0和realtime範圍,clr為自己保留了idle 和time-critical優先順序。
clr的終結器執行緒以time-critical優先順序執行。開發人員不用用到這些優先順序,但了解一下還是不錯的。
優先順序的存在,使得應用程式需可以更人性化的處理使用者的請求,這設計的相當不錯,沒有它,我們不能隨意操控命令機器。
執行緒基礎只是講完了,作為開發人員應該知道,執行緒是非常寶貴的資源,必須省著用,為了做到這一點,最好的方式就是使用執行緒池threadpool。
這個下篇講,不得不說,執行緒池自動管理執行緒的建立和銷毀,這非常不錯。(^。^)y-~~
執行緒排程 執行緒池
1.每次new thread新建物件,效能查。2.執行緒缺乏統一管理,可能無限制的新建執行緒,相互競爭,有可能占用過多系統資源導致司機或oom out of memory 3.缺少更多的功能,如更多執行 定期執行 執行緒中斷。1.重用存在的執行緒,減少物件建立 消亡的開銷,效能好。2.可有效控制最大...
10 執行緒池 執行緒排程
執行緒池 第四種 獲取執行緒的方法 執行緒池 乙個executorservice,它使用執行緒池的可能的某個執行緒之一執行每個提交的任務,通常使用 executors 工廠方法配置 executorservice service executors.newfixedthreadpool 5 執行緒池...
C 執行緒排程演算法題
前幾天做的一道執行緒排程的題目,題目本身的思路很簡單,主要是檢測資料裡面有超時的檢測資料。下面先貼一下題目要求 程序排程是作業系統設計中非常重要的問題。每個程序都需要一定的資源才能執行,這些資源在程序結束時都會被釋放。不同的資源分配策略會對系統的執行效率產生很大的影響,甚至可能導致死鎖。某系統中現有...