路燈作為現(xiàn)代城市的基礎(chǔ)設(shè)施,在城市的日常運作和人們的生活中起著重要作用,路燈系統(tǒng)的先進程度標志著一座城市的現(xiàn)代化水平。路燈控制系統(tǒng)能夠及時準確的統(tǒng)計路燈設(shè)備的運行情況和亮燈情況,將路燈故障或線路斷線的報警信號送到監(jiān)控中心,遠程管理和設(shè)置亮燈時間策略及調(diào)光規(guī)則,做到合理亮燈和按需亮燈,從而能夠?qū)崿F(xiàn)真正的路燈管理的“五遙(遙測、遙控、遙信、遙調(diào)、遙視)。通信服務器作為路燈監(jiān)控系統(tǒng)中的重要組成部分,負責與監(jiān)控操作的客戶端以及道路兩旁的多臺遠程路燈集中控制器進行數(shù)據(jù)通信、數(shù)據(jù)處理。通信服務器必須能夠保證長時間的為大量監(jiān)控終端軟件和路燈集中控制器提供穩(wěn)定的通信服務。
路燈系統(tǒng)結(jié)構(gòu)圖在一般的并發(fā)服務器架構(gòu)中,一個單獨的線程等待客戶端的連接請求,當有請求到來時該線程創(chuàng)建一個新的服務線程來進行處理,在新線程創(chuàng)建完畢后主線程再回復至等待請求狀態(tài)。但面對大量的客戶端連在整個系統(tǒng)中,通信服務器固定IP地址,并提供兩個端口號。通信服務器通過Intemet/GPRS網(wǎng)絡(luò)與路燈集中控制器通信,接收路燈系統(tǒng)的實時運行情況,存入數(shù)據(jù)庫,必要時向用戶監(jiān)控端轉(zhuǎn)發(fā),另外通信服務器通過Internet網(wǎng)絡(luò)與用戶客戶端相連,接收它的控制命令,并向路燈集中控制器轉(zhuǎn)發(fā)。
2C/S通信模型與線程池的工作原理在管理中心和服務器以及路燈集中控制器和服務器間的網(wǎng)絡(luò)通信模式采用的都是常見的C/S模式,即客戶端/服務器通信模式。在C/S結(jié)構(gòu)下,服務器程序通常在一個固定的地址監(jiān)聽客戶端的請求,客戶端和服務器通過TCP協(xié)議建立數(shù)據(jù)傳輸,服務器進程通常情況下處于“休眠”狀態(tài),直到客戶端對該服務器發(fā)出連接請求,將其“喚醒”。此時,服務線程“醒來”并對客戶端的請求做出適當?shù)姆磻?蛻舳丝偸侵鲃拥恼埱髥油ㄐ,而服務器一直等待被動通信。這種請求/應答的過程如所示。
線程池是一種管理一定數(shù)量線程的手段。線程池中的線程數(shù)量是由運行時機器容量負載的配置信息以及動態(tài)信息決定的。
線程池的基本思想是在程序開始時就在內(nèi)存中開辟一些線程,形成一個預派生的線程池,同時創(chuàng)建一個任務隊列氣當有新的客戶端請求到達時,將新連接的請求任務首先投遞到任務隊列,從“線程池”中選擇一個空閑的線程為新的客戶端請求服務,服務完畢后,線程不是退出,而是進入空閑線程池中。通過對多個任務重用已經(jīng)存在的線程對象,降低了對線程對象創(chuàng)建和銷毀的開銷。當客戶端請求時,線程對象已經(jīng)存在,可以提高請求的響應時間,從而整體地提高了系統(tǒng)服務程如下:綁定本地的服務知名端口。
以監(jiān)聽套接口為參數(shù)創(chuàng)建多個服務線程,主線程休眠。
月艮務線程的流程如下:接受外來連接請求,accept函數(shù)返回服務套接口。
處理客戶端服務的請求,關(guān)閉服務套接口,并返回步驟(1)。
3服務器端軟件的設(shè)計與實現(xiàn)3.1月艮務器端軟件的設(shè)計思路在服務器程序中主要包括兩個線程,主線程和工作者線程,主線程主要負責監(jiān)聽客戶端的連接,接收到新的連接后,將新套接字安排給工作線程進行處理。先創(chuàng)建幾個并行的工作者線程,一般這個數(shù)目為CPU的個數(shù),它們?yōu)榧磳⒌降目蛻舳诉B接提供服務。當有一個新的服務連接請求,則取出一個工作者線程為它提供服務,如果沒有空閑的工作者線程,則將這個新的套接字連接加入到任務隊列中,該隊列采用先進先出的(FIFO)的策略來保證對后續(xù)未能得到及時服務的連接請求得到公平的服務。另外采用先進先出的策略可以減少CPU在不同線程間的切換次數(shù),降低線程上下文切換帶來的系統(tǒng)開銷。
程序用下面的CONNCTX結(jié)構(gòu)來記錄每個客戶端套接字的信息,用THREADOB結(jié)構(gòu)來記錄每個工作者線程的信息,它們的關(guān)系如所示。
每接收到一個新的連接,就會為這個新的連接創(chuàng)建一個該結(jié)構(gòu)并初始化該結(jié)構(gòu)的內(nèi)部成員。當連接關(guān)閉或者出錯時,就釋放該客戶端連接對應CONNCTX結(jié)構(gòu)對象所占用的內(nèi)存,以免造成內(nèi)存的泄露。
句柄的表現(xiàn)。
一個較為簡單的基于線程池模型的服務器程序流每創(chuàng)建一個工作者線程,便為該線程申請一個THREADOB結(jié)構(gòu)并初始化該結(jié)構(gòu)中的成員,當這個工作者線程關(guān)閉時,再釋放它所對應的THREADOB結(jié)構(gòu)對象所占用的內(nèi)存空間,并且將定義一個gpThi'eadList來指向該線程對象鏈表的表頭。tvpedefstruct數(shù)量套接字對象列表的表頭接字對象列表的表尾//指向下一個THREADOB對象,以形成表線程對象和套接字對象間的關(guān)系主線程程序主要創(chuàng)建監(jiān)聽套接字、初始化全局變量、創(chuàng)建線程池,將新到來的客戶端連接加入到客戶端的連接列表中,等空閑的工作線程的處理。主框架代碼如下://變量的聲明及其初始化//創(chuàng)建監(jiān)聽套接字//綁定本地地址到監(jiān)聽套接字//處理客戶端的連接請求while(TRUE)//循環(huán)處理所有未決的連接請求//將一個套接字對象安排給空閑的工作線程處理該線程運行后,取得本線程對象的指針,進入無限循環(huán)并在events數(shù)組所記錄的事件對象上等待,處理網(wǎng)絡(luò)事件,工作線程的框架代碼如下:理網(wǎng)絡(luò)事件//信息的處理與存睹4服務器端軟件的仿真測試線程池模型相付于多線程來說。服務器對大呈并發(fā)客戶端的連接請求擁有更快的響應速度。為r測試此基于線程池技術(shù)的服務器端軟汴的響應速度。編寫了多線程的服務器軟件和能夠?qū)Ψ⻊掌鞑粩嗟陌l(fā)起并發(fā)連接的客戶端軟件,做如下仿真壓力測試:服務器的硬件環(huán)境為Intel)2DuoCPU,2.93GHz,2G內(nèi)存;服務器分別運丨7基于線程池技術(shù)和多線技術(shù)的服務器端軟件,通過分析它們各自占用的物理內(nèi)存使用情況和客戶端一次連接成功率來對服務器端軟件進行分析。具體的測試結(jié)果如表丨所示:表1服務器軟件測試比較服務器軟件版本線程池模M多線程模型客戶端數(shù)物理內(nèi)存使幣/M客戶端一次連接成功率/%從表I可以看出。多線技術(shù)由十預先刨建線等待客P端的連接請求,它的客戶端一次連接明顯高十多線模坳。H隨著客戶端的多。多線模型的客戶端一次連接率在下降,而線程池漠型相對來說較為穩(wěn)定另外由于線程池模型減少了CPU在線程上下文之間的切換次數(shù)。而多線程池模型在大量新的客戶端連接時需要大量的創(chuàng)建新的線程和銷毀線程。因此線程池模型比多線程模型的物理內(nèi)存占用M要少。更能節(jié)約系統(tǒng)資源2008環(huán)境為開發(fā)環(huán)境,以
5結(jié)論線程池技術(shù)的引。能夠有效的解決服務端與大量客戶端并發(fā)連接的問題,將由T線程的創(chuàng)建和銷毀而帶來的系統(tǒng)消耗盡可能的降到最低?梢燥@著的提服務器端軟件的穩(wěn)定性和對客戶端發(fā)起的并發(fā)連接快速響應的能九本文給出了線程池技術(shù)在服務器端軟件的設(shè)計思路和和人體的框架實現(xiàn)代碼,并H.通過和多線模型進行比較測試來證明線程池模型的優(yōu)越性。