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





