

線(xiàn)程池的優(yōu)化設計
- 期刊名字:四川大學(xué)學(xué)報(自然科學(xué)版)
- 文件大?。?57kb
- 論文作者:趙海,李志蜀,韓學(xué)為,葉浩
- 作者單位:四川大學(xué)計算機學(xué)院
- 更新時(shí)間:2020-09-29
- 下載次數:次
2005年2月四川大學(xué)學(xué)報(自然科學(xué)版)Feb.2005第42卷第1期Journal of Sichuan University (Natural Science Edition)Vol.42 No.1文章編號:0490-6756(2005)01-0063-05線(xiàn)程池的優(yōu)化設計趙海,李志蜀,韓學(xué)為,葉浩(四川大學(xué)計算機學(xué)院,成都610064)摘要:在各種業(yè)務(wù)解決方案的設計中,服務(wù)器處理任務(wù)的效率是衡量方案優(yōu)劣的一個(gè)重要標準.使用線(xiàn)程池技術(shù)并發(fā)處理任務(wù)是提高服務(wù)器效率的一個(gè)主要手段.在幾乎所有線(xiàn)程池的設計中,線(xiàn)程的算法都沒(méi)有根據線(xiàn)程所要執行的任務(wù)特點(diǎn)進(jìn)行調整,導致實(shí)際使用過(guò)程中的效率并不高.作者設計了一個(gè)通用的線(xiàn)程池,并且可以根據不同任務(wù)的特點(diǎn),調整線(xiàn)程池參數,最大幅度地提高系統性能.關(guān)鍵詞:多線(xiàn)程;阻塞;線(xiàn)程池;任務(wù);量級中圖分類(lèi)號:TP391文獻標識碼:A1引言在各種業(yè)務(wù)解決方案的設計過(guò)程中,服務(wù)器處理任務(wù)的效率往往決定了方案的成敗.使用線(xiàn)程池技術(shù)處理任務(wù)是提高服務(wù)器效率的主要手段,它提高了對服務(wù)器資源的利用,使得任務(wù)可以并發(fā)處理.線(xiàn)程池是預先創(chuàng )建線(xiàn)程的一種技術(shù). 線(xiàn)程池在還沒(méi)有任務(wù)到來(lái)之前,創(chuàng )建-定數量(N1)的線(xiàn)程 ,放人空閑隊列中.這些線(xiàn)程都是處于睡眠(Sleep)狀態(tài),不消耗CPU,但占用較小的內存空間.當任務(wù)到來(lái)后,緩沖池給次任務(wù)分配-個(gè)空閑線(xiàn)程,把任務(wù)傳人此線(xiàn)程中運行.當N1個(gè)線(xiàn)程都在處理任務(wù)后,緩沖池自動(dòng)創(chuàng )建- -定數量的新線(xiàn)程,用于處理更多的任務(wù).當系統比較空閑時(shí),大部分線(xiàn)程都一直處于暫停狀態(tài),線(xiàn)程池自動(dòng)銷(xiāo)毀-部分線(xiàn)程,回收系統資源.在大多數情況下,不同業(yè)務(wù)中服務(wù)器處理的任務(wù)的特點(diǎn)都是不相同的.如果單個(gè)任務(wù)很復雜卻采用一個(gè)線(xiàn)程處理多個(gè)任務(wù)的策略,那么單個(gè)任務(wù)在處理過(guò)程中會(huì )因為長(cháng)時(shí)間占用-一個(gè)線(xiàn)程 ,而延長(cháng)任務(wù)的響應速度.如果單個(gè)任務(wù)比較簡(jiǎn)單卻采用一個(gè)線(xiàn) 程處理一個(gè)任務(wù)的策略,那么頻繁的給任務(wù)分配線(xiàn)程也會(huì )導致系統利用率降低.線(xiàn)程池的設計,不僅要實(shí)現線(xiàn)程的分配功能,還要根據任務(wù)特點(diǎn)調整分配過(guò)程的分配算法,增加可移植性,減少重復開(kāi)發(fā).設計中需要考慮的重點(diǎn)是:(1)任務(wù)對象的通用性; (2)線(xiàn)程創(chuàng )建和銷(xiāo)毀策略;(3)任務(wù)的分配策略.2算法分析與設計2.1任 務(wù)對象的通用性不同的業(yè)務(wù)解決方案有各自獨特的任務(wù)處理方法,任務(wù)的劃分上也就千差萬(wàn)別.為了使得在處理任務(wù)對象時(shí)達到一定程度的通用性,任務(wù)對象的設計必須與實(shí)際任務(wù)的處理邏輯完全無(wú)關(guān).從任務(wù)執行的角度看,任務(wù)不過(guò)是處理流程的一次或多次的執行過(guò)程,可中國煤化工class Task°TYHCNMHG收稿日期:2004-07-01作者簡(jiǎn)介:趙海(1981 - ) ,男,2003級碩士研究生.54四川大學(xué)學(xué)報(自然科學(xué)版)第42卷{public:Task();virtual ~ Task();virtual bool run() = 0;};Task類(lèi)是所有任務(wù)類(lèi)的基類(lèi),其中的純虛函數run( )是任務(wù)流程的人口,工作線(xiàn)程在處理任務(wù)的時(shí)候就從此處開(kāi)始執行任務(wù)的處理流程.設計--個(gè)新的任務(wù)時(shí),只需要繼承Task接口,新的任務(wù)就可以放入線(xiàn)程池中執行.任務(wù)的創(chuàng )建、執行和銷(xiāo)毀設計:(1)任務(wù)在其需要的時(shí)候才創(chuàng )建,任務(wù)的創(chuàng )建通過(guò)new操作,動(dòng)態(tài)創(chuàng )建具體的任務(wù)對象,然后傳人線(xiàn)程池,由線(xiàn)程池自動(dòng)分配線(xiàn)程來(lái)執行此任務(wù);(2)任務(wù)是否執行完畢由其自身來(lái)決定,一個(gè)未知任務(wù)什么時(shí)候執行完畢是不可能預測的,必須由任務(wù)本身來(lái)決定,這個(gè)策略通過(guò)Task: :run()的返回值來(lái)實(shí)現.當工作線(xiàn)程執行一次任務(wù)時(shí),如果返回值為true, 表示任務(wù)執行完畢,就用delete操作銷(xiāo)毀此任務(wù);如果返回值為false,表示任務(wù)需要執行的工作并未完成,繼續執行此任務(wù).這樣的策略,使得在設計新的任務(wù)處理流程時(shí),不需要過(guò)多的關(guān)心任務(wù)的接口規范,只需要在新任務(wù)類(lèi)的構造函數中初始化各種資源,在新任務(wù)類(lèi)的析構函數中回收資源,在run()方法中實(shí)現主要的處理邏輯,那么新的任務(wù)類(lèi)即可在線(xiàn)程池中執行.2.2線(xiàn)程的創(chuàng )建與銷(xiāo)毀分析線(xiàn)程緩沖池中的維持線(xiàn)程數量按照任務(wù)處理的需求來(lái)定.在緩沖池剛剛建立時(shí),線(xiàn)程池中有一定數量(N;)的已創(chuàng )建好的線(xiàn)程,這樣可以使得新任務(wù)可以及時(shí)的得到執行.比如,某客戶(hù)端在向服務(wù)器發(fā)送登陸請求時(shí),這樣一個(gè)請求使得服務(wù)器通常需要創(chuàng )建好幾個(gè)相互有關(guān)聯(lián)的任務(wù).也就是說(shuō),客戶(hù)端與服務(wù)器端的-次交互,通常會(huì )產(chǎn)生- -定數量的任務(wù).根據一個(gè)服務(wù)器所處理的業(yè)務(wù),估計出平均情況下,- -次業(yè)務(wù)產(chǎn)生的任務(wù)數量N2.那么N1應該是N2的整數倍, N;= N2 X n,減少由于線(xiàn)程不夠而再創(chuàng )建線(xiàn)程的概率,才能使得服務(wù)器在業(yè)務(wù)處理初期最為高效.在線(xiàn)程緩沖池中的所有線(xiàn)程都處于繁忙狀態(tài)的時(shí)候,線(xiàn)程池就會(huì )創(chuàng )建新的線(xiàn)程(設創(chuàng )建N3個(gè)).由以上分析,為了減少由于線(xiàn)程不夠而再創(chuàng )建線(xiàn)程的概率,N3也應該是N2的整數倍,N3=N2X n2.當服務(wù)器業(yè)務(wù)減少,出現大量線(xiàn)程閑置的情況,就應該銷(xiāo)毀-部分線(xiàn)程.很顯然,這里應該使用超時(shí)策略,當某些線(xiàn)程在超過(guò)時(shí)間T仍然處于閑置狀態(tài),就銷(xiāo)毀一部分 空閑線(xiàn)程.設銷(xiāo)毀Ns個(gè)空閑線(xiàn)程,為了減少由于線(xiàn)程不夠而再創(chuàng )建線(xiàn)程的概率, N4也應該是N2的整數倍,N4=N2Xn3.當然,為了使得新任務(wù)及時(shí)得到處理,即使服務(wù)器一直處于空閑,也應該保留N;個(gè)線(xiàn)程.2.3任務(wù)分配算法分析在業(yè)務(wù)處理中,會(huì )有各種各樣的任務(wù)對象,這些業(yè)務(wù)對象對系統資源的使用也不同.這些任務(wù),無(wú)論其空間復雜度如何,從線(xiàn)程執行任務(wù)這一角度來(lái)看,應該關(guān)心的主要是時(shí)間復雜度.線(xiàn)程緩沖池在接收到新任務(wù)的時(shí)候,首先要尋找空閑線(xiàn)程,傳人新任務(wù),然后執行任務(wù),最后還要刪除任務(wù),置空閑線(xiàn)程的標志.尋找空閑線(xiàn)程、傳人任務(wù)、最后的清理工作,這些都是為了執行任務(wù)而產(chǎn)生的額外開(kāi)銷(xiāo),如果所執行的任務(wù)大多數都是輕量級任務(wù),那么額外開(kāi)銷(xiāo)帶來(lái)的資源浪費就顯得很突出了.為了解決這個(gè)問(wèn)題,可以給-一個(gè)線(xiàn)程傳人Ns個(gè)輕量級任務(wù),這-一個(gè)線(xiàn)程依次執行Ns個(gè)輕量級任務(wù),由于都是在很短時(shí)間內完成,并不影響任務(wù)響應的及時(shí)性.顯然,Ns≥中國煤化工3實(shí)現TYHCNMHG由于源代碼的篇幅關(guān)系,并不能把所有代碼--列舉,這里以偽代碼的形式給出線(xiàn)程緩沖池在線(xiàn)程的第1期趙海等:線(xiàn)程池的優(yōu)化設計6創(chuàng )建、銷(xiāo)毀、任務(wù)分配以及任務(wù)執行方面的流程.(1)線(xiàn)程池任務(wù)分配主循環(huán)(也是一個(gè)線(xiàn)程)這里除了任務(wù)分配算法外也包括了部分線(xiàn)程的創(chuàng )建與銷(xiāo)毀的算法.for(;;) {pThread = GetIdleThread(); // 檢查空閑線(xiàn)程隊列if( pThread! = NULL) {if( CheckNewTask() ){ // 有新任務(wù)TaskList tl;GetTask( tl ); // 取得- -定 數量的任務(wù)AddTaskToThread( pTask, tl ); // 把任務(wù)傳人線(xiàn)程continue; // 繼續循環(huán)}if (pThread == NULL & & nThread < THREAD-MAX ) //股 有空閑線(xiàn)程了CreateNewThread(); // 創(chuàng )建新線(xiàn)程Continue; // 繼續循環(huán)//沒(méi)有要處理的任務(wù)或者已經(jīng)到達線(xiàn)程數的上限,進(jìn)入超時(shí)等待if( WaitForTaskOrThreadTimeout() ) {if( IncrldleTime() ) > IDLE-MAX) { // 系統空閑,計時(shí)//系統長(cháng)時(shí)間處于空閑,銷(xiāo)毀-定數量的空閑線(xiàn)程DecrIdleThread();elseretumn0; // 線(xiàn)程終止(2)工作線(xiàn)程的任務(wù)執行流程for(;) {//檢查任務(wù)隊列是否有任務(wù)要運行if( ! CheckTaskQueue() ) { // 隊列中沒(méi)有任務(wù)pPool - >OnTaskIdle( this ); // 通知線(xiàn)程池,此線(xiàn)程已經(jīng)空閑if( WaitForTask() )return0; // 終止線(xiàn)程} else { //有任務(wù)需要運行pTask = GetTask(); // 取得新任務(wù)中國煤化工try {while( ! pTask- >Run() ){MYHCNMHG.//此處循環(huán)體為空,不斷運行直到任務(wù)執行完畢6四川大學(xué)學(xué)報(自然科學(xué)版)第42卷cach(-.) {WrteLog(-.); // 執行任務(wù)時(shí)產(chǎn)生異常,記錄人日志delete pTask; // 任務(wù)執行完畢,刪除此任務(wù)}在任務(wù)執行的核心部分,使用了try-catch控制塊進(jìn)行異常捕獲.雖然異常會(huì )對程序速度有很微的影響,但是因為要執行的任務(wù)是未知的,不能保證任務(wù)可以正常執行.因為一個(gè)任務(wù)的異常而導致服務(wù)器的服務(wù)程序崩潰,這是絕對不允許的.使用異常捕獲不僅可以保證服務(wù)器流程的順利執行,而且把異常信息存入日志文件,還可以跟蹤錯誤.4性能分析為了檢驗此線(xiàn)程池的性能是否和預期相同,并且分析出線(xiàn)程池的不同參數配置對系統性能的影響,特編寫(xiě)了測試程序對3組參數進(jìn)行了測試,測試結果如附圖所示.橫坐標是任務(wù)數量;縱坐標是消耗時(shí)間,以秒(s)為單位.60「參數1:N2=1, Ns=1;參數2:N2=5, Ns=1;50 t一參數1參數3:N2=5, Ns=5.測試中,系統的總線(xiàn)程數限制40 t一參數2言30一參數:3為500,任務(wù)都是5ms.這里只針對N2和Ns進(jìn)行測試,N2是平均情況下系統每次向線(xiàn)程池中增加的任純20務(wù)數量, Ns是每個(gè)線(xiàn)程一次執行任務(wù)數量.0t參數1和參數2代表的是傳統的線(xiàn)程池,對于相204000200005000同的任務(wù),他們都采用固定不變的策略來(lái)執行任務(wù);而參數3代表的是可調整的線(xiàn)程池,經(jīng)過(guò)分析并調整線(xiàn)任務(wù)數量(個(gè))程池的參數后,把系統性能調整到了最佳狀態(tài).附圖3 組不同參數的線(xiàn)程池性能測試結果在任務(wù)量比較小的情況下,三者對系統性能的占Add Fig. The performance c∞ompares of three thread pool用基本上相等.但是當任務(wù)量很巨大時(shí)(500000個(gè)任with different pararneters務(wù)),參數3的所用時(shí)間是參數1的55.3% ,是參數2的47.8% ,執行效率幾乎是前兩者的一倍.系統每次產(chǎn)生5個(gè)任務(wù)時(shí),參數1的線(xiàn)程池會(huì )執行5次查找空閑線(xiàn)程的操作和5次分配任務(wù)的動(dòng)作,參數2的線(xiàn)程池會(huì )執行1次查找空閑線(xiàn)程操作和5次分配任務(wù)動(dòng)作,而參數3的線(xiàn)程池只會(huì )執行1次空閑線(xiàn)程的查找和1次線(xiàn)程的分配動(dòng)作.雖然執行任務(wù)的時(shí)候,參數1和參數2是并行執行任務(wù)而參數3是依次執行5個(gè)任務(wù),但是任務(wù)都是輕量級的,執行任務(wù)的時(shí)間比較短,在空閑線(xiàn)程的查找和任務(wù)的分配上面耗費的時(shí)間占很大比重.由此可見(jiàn),參數3之所以比前兩者快很多,就在于參數3針對任務(wù)的輕量級特點(diǎn)來(lái)調整線(xiàn)程池的分配策略,減少線(xiàn)程的查找和任務(wù)分配次數,極大地提高了系統的利用率.5結束語(yǔ)中國煤化工MYHCNMHG通過(guò)測試可以看出,在服務(wù)器中使用線(xiàn)程池后,必須要根據任務(wù)特點(diǎn)對線(xiàn)程池的分配算法進(jìn)行調整,才能更進(jìn)- -步提高系統的利用率.這些參數就是上面分析過(guò)程中的NI,N2,N3,N4,Ns,n1,n2,n3.第1期趙海等:線(xiàn)程池的優(yōu)化設計6從理論.上說(shuō),影響線(xiàn)程池性能還不只這些.比如單CPU環(huán)境和多CPU環(huán)境對線(xiàn)程的執行效果并不相同線(xiàn)程的創(chuàng )建銷(xiāo)毀算法就要進(jìn)一步調整. 而且實(shí)際系統中,任務(wù)的量級很不平均,可以考慮對各個(gè)任務(wù)加上量級的權值評估,這就需要對線(xiàn)程的任務(wù)分配和執行進(jìn)行更進(jìn)-步的研究.參考文獻:[1] Jeffrey Richter 著(zhù).王建華,侯麗坤,等譯. Windows 核心編程(第四版)[M].北京:機械工業(yè)出版社,2000.[2] Bjarne Stroustrup蓍.裘宗燕譯.C+ +程序設計語(yǔ)言(特別版)[M].北京:機械工業(yè)出版社,2002.[3] Sott Meyers著(zhù).侯捷譯. EffectiveC+ + 2*[M].武漢:華中科技大學(xué)出版社,2001.[4] Jim Beveridge, Robert Wiener著(zhù)侯捷譯. Win32多線(xiàn)程程序設計[M].武漢:華中科技大學(xué)出版社,2002.[5] Deepak Alur, Dan Malls, John Crupi著(zhù).牛志奇譯. J2EE核心模式[M].北京:機械工業(yè)出版社,2002.[6] Herb Sutter著(zhù).卓小濤譯. Exceptional C+ + [M].北京:中國電力出版社,2003.[7] Bruce FEckel. C+ +編程思想(英文原版第二版)[M].北京:機械工業(yè)出版社,2002.[8] Andrew s著(zhù).潘愛(ài)民譯.計算機網(wǎng)絡(luò )(第四版)[M].北京:清華大學(xué)出版社, 2004.Optimizing in the Design of Thread PoolZHAO Hai, LI Zhishu, HAN Xue-rwei, YE Hao(College of Computer Science, Sichuan University, Chengdu 610065 ,China)Abstract: In the designs of various kinds of business solutions, the efficiency of processing tasks in the serveris an important standard to weight these solutions. A main means to improve the efficiency is to adopt threadpooling technology to process task concurrently. But the algorithm of most thread pool is not based on thecharacteristic of tasks. As a result, the efficiency of system is improved scarcely. An extensible thread pool is .designed in the thesis. It can be set up the corresponding parameters according to the different characteristicof processing tasks in different server. And in this way the improvement of server performance will be themost enormous.Key words: multithreading; suspend; thread pool; task; weight中國煤化工MYHCNMHG
-
C4烯烴制丙烯催化劑 2020-09-29
-
煤基聚乙醇酸技術(shù)進(jìn)展 2020-09-29
-
生物質(zhì)能的應用工程 2020-09-29
-
我國甲醇工業(yè)現狀 2020-09-29
-
JB/T 11699-2013 高處作業(yè)吊籃安裝、拆卸、使用技術(shù)規程 2020-09-29
-
石油化工設備腐蝕與防護參考書(shū)十本免費下載,絕版珍藏 2020-09-29
-
四噴嘴水煤漿氣化爐工業(yè)應用情況簡(jiǎn)介 2020-09-29
-
Lurgi和ICI低壓甲醇合成工藝比較 2020-09-29
-
甲醇制芳烴研究進(jìn)展 2020-09-29
-
精甲醇及MTO級甲醇精餾工藝技術(shù)進(jìn)展 2020-09-29