齊 躍,劉 瀏
(1.江蘇順天海運(yùn)集團(tuán)有限公司綜合辦公室,江蘇 南京 210016;2.武漢理工大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 武漢 430070)
GPS(global positioning system)憑借其高精度、全天候、高效率及全球性等特點在各領(lǐng)域發(fā)揮著重要的作用。在互聯(lián)網(wǎng)與移動通信交叉的領(lǐng)域尤其能顯示出其優(yōu)越性[1-5]。GPS車載監(jiān)控系統(tǒng)是依托衛(wèi)星定位、地理信息及無線通信等技術(shù)手段,實時掌握車輛位置和狀態(tài)數(shù)據(jù),為物流運(yùn)輸企業(yè)提供調(diào)度管理信息的軟硬件綜合系統(tǒng)。
然而車載終端必須與服務(wù)器程序和客戶端程序相融合才能發(fā)揮其作用。由于客戶連接數(shù)和數(shù)據(jù)量龐大,使服務(wù)器程序承受的壓力也很大[6-7]。高性能服務(wù)器程序的主要作用是能夠高效地處理大量并發(fā)客戶的請求,并且快速及時地處理客戶的數(shù)據(jù),同時將部分應(yīng)答信息回傳給客戶端。設(shè)計一個性能優(yōu)良的服務(wù)器程序,需要考慮很多方面的因素,如CPU的使用率、Memory的開銷等。要想高效處理并發(fā)用戶的請求,服務(wù)器程序就需要解決兩個主要問題,一是處理并發(fā)客戶的連接請求,二是處理并發(fā)數(shù)據(jù)。解決這些問題,可以根據(jù)處理器內(nèi)核的數(shù)量來創(chuàng)建等量的工作線程,并結(jié)合I/O完成端口(input/output completion port,IOCP)模型,以及操作系統(tǒng)的線程調(diào)度機(jī)制[8-9]。筆者基于多線程并結(jié)合IOCP模型設(shè)計和實現(xiàn)了高性能的服務(wù)器程序。
基于車載終端的并發(fā)服務(wù)器系統(tǒng)結(jié)構(gòu)圖如圖1所示??蛻敉ㄟ^車載終端使用GSM通信設(shè)備向服務(wù)端程序發(fā)送信息。由服務(wù)端程序?qū)?shù)據(jù)信息進(jìn)行分析處理,并將部分處理結(jié)果反饋給客戶,同時將數(shù)據(jù)存儲到數(shù)據(jù)庫作為備份以供網(wǎng)站使用,客戶可以通過網(wǎng)站查詢汽車的相關(guān)信息[10]。
圖1 基于車載終端的并發(fā)服務(wù)器系統(tǒng)結(jié)構(gòu)圖
IOCP是一種能夠合理利用與管理多線程的機(jī)制。它是迄今為止Windows平臺上最為復(fù)雜的一種I/O模型。當(dāng)應(yīng)用程序必須一次管理多個套接字時,I/O完成端口模型提供了最好的系統(tǒng)性能,也提供了最好的伸縮性,非常適合用來處理上百、上千個客戶請求。
IOCP模型提供了一個高效復(fù)雜的內(nèi)核對象,該對象通過指定線程的數(shù)量,可以在套接字上投遞重疊發(fā)送和接收請求處理I/O。
2.2.1 多線程的并發(fā)處理
高并發(fā)的大型服務(wù)器程序一直面臨著架構(gòu)復(fù)雜、線程眾多、難以管理及并發(fā)性能提升困難等問題。對于Windows平臺,通過IOCP的內(nèi)核對象,可以方便地創(chuàng)建高并發(fā)、高性能和可伸縮的網(wǎng)絡(luò)服務(wù)器程序。圖2為IOCP模型用來解決大量用戶同時請求連接服務(wù)器問題的示意圖。
圖2 IOCP模型圖
秉承低耦合的原則,在服務(wù)器程序設(shè)計中,創(chuàng)建了4個獨(dú)立的線程來進(jìn)行調(diào)度處理客戶的連接請求。采用這種4個線程(雙核處理器)處理的機(jī)制處理用戶連接請求的建立,能夠較好地解決大量并發(fā)用戶的連接請求。
2.2.2 并發(fā)客戶緩沖鏈表策略
在該服務(wù)器程序的設(shè)計中,采用鏈表緩沖策略進(jìn)一步解決這個問題。該策略的原理圖如圖3所示。
圖3 緩沖鏈表圖
把已經(jīng)建立的客戶插入到緩沖鏈表中以供其他線程接收客戶端發(fā)送過來的數(shù)據(jù)。在這種模式下,這4個線程只需與客戶建立連接,而不必處理客戶的其他請求,也不必因為等待客戶端的數(shù)據(jù)而阻塞在建立連接的線程中,從而提高了服務(wù)器程序處理客戶請求的速度。
2.2.3 并發(fā)互斥的控制
為處理好這幾個服務(wù)器程序中的幾個線程之間的互斥問題,筆者采用了臨界段,通過臨界段來控制線程之間對共享數(shù)據(jù)(數(shù)據(jù)緩沖鏈表)的操作。該機(jī)制在很大程度上可以解決服務(wù)器程序因訪問同一內(nèi)存地址,而導(dǎo)致的內(nèi)存訪問沖突[11-12]。
2.2.4 懶惰資源的智能回收機(jī)制
在服務(wù)器程序設(shè)計過程中還需考慮到系統(tǒng)的資源有限,不能把系統(tǒng)寶貴的資源分配給一些長時間沒有任何操作的客戶。在該服務(wù)器程序中把分配給這些用戶的資源稱為懶惰資源。為了充分利用系統(tǒng)資源,服務(wù)器程序采用了清理策略,即模擬線程池機(jī)制,先在系統(tǒng)中申請一塊連續(xù)的內(nèi)存空間,之后的內(nèi)存申請就在這些已經(jīng)申請好的內(nèi)存中進(jìn)行分配;另外,只要客戶在規(guī)定的時間內(nèi)不進(jìn)行任何相關(guān)的操作如未發(fā)送數(shù)據(jù),線程則強(qiáng)制關(guān)閉該客戶并將其所占的懶惰資源回收到內(nèi)存池重新利用。
然而,采用鏈?zhǔn)降奶幚硭枷氪嬖谝欢ǖ恼`差,即不能夠很準(zhǔn)確地在規(guī)定的時間內(nèi)將所有符合條件的客戶連接斷開,但是這種方法能夠減少系統(tǒng)寶貴資源的消耗。
在該服務(wù)器程序中客戶端每隔一定的時間便向服務(wù)器發(fā)送指定格式的信息,因此數(shù)據(jù)信息量是非常龐大的。為了解決這個問題,采用了雙緩沖機(jī)制的策略,通過使用兩個緩沖區(qū)實現(xiàn)對大量數(shù)據(jù)的接收和處理。其原理圖如圖4所示。
圖4 雙緩沖區(qū)原理圖
2.3.1 數(shù)據(jù)的接收
采用單獨(dú)的線程接收來自客戶端的數(shù)據(jù)。在數(shù)據(jù)接收線程中用while(true)來判斷,使該線程不斷地接收來自客戶端的數(shù)據(jù),從而避免緩沖區(qū)的數(shù)據(jù)沒有得到及時的處理。但若只是采用while(true),那么該線程將會消耗大量的系統(tǒng)資源。為解決該問題,采用事件通知機(jī)制,使得該線程只有當(dāng)客戶端有可以接收的數(shù)據(jù)時才進(jìn)行工作,從而避免了系統(tǒng)資源的消耗。
2.3.2 數(shù)據(jù)的處理
為了緩解緩沖區(qū)的壓力,應(yīng)及時處理緩沖區(qū)的數(shù)據(jù)。同樣,為了提高系統(tǒng)的性能,降低系統(tǒng)資源的開銷,采用了事件通知機(jī)制,即只有SQL處理隊列中有SQL語句,才使該線程做相關(guān)的工作。這種機(jī)制在很大程度上提高了服務(wù)器程序的性能。
由于服務(wù)器程序中存在若干個線程,只要一個線程因異?;蛘哌\(yùn)行結(jié)束而退出,那么其他線程基本上做的都是無用功。因而該系統(tǒng)必須解決線程退出或者因異常而結(jié)束的問題,從而確保整個系統(tǒng)能夠良好運(yùn)行。因此創(chuàng)建了一個檢測線程,在該線程中不斷地檢測各線程是否正常運(yùn)行;另外,由于考慮到服務(wù)器程序性能的問題,并不是使該線程一直使用時間片,而是采用在指定的時間間隔內(nèi)對服務(wù)器程序中的所有線程進(jìn)行檢測,如若發(fā)現(xiàn)線程異?;蛲顺鰟t重新啟動線程,從而使服務(wù)器程序能夠繼續(xù)正常工作。
為了檢測使用IOCP模型設(shè)計的服務(wù)器程序的性能,將從CPU利用率和內(nèi)存的使用率兩個方面進(jìn)行分析。并將其與Select模型的結(jié)果進(jìn)行對比,得出IOCP模型在服務(wù)器程序設(shè)計上具有較佳的性能。比較結(jié)果如表1和表2所示。
表1 IOCP與Select模型CPU利用率比較
表2 IOCP與Select模型內(nèi)存利用率比較
GPS車載終端要求服務(wù)端程序能夠高效地處理并發(fā)數(shù)據(jù)和并發(fā)客戶的連接請求,同時要求服務(wù)端程序能夠及時地對客戶的操作做出響應(yīng),筆者使用IOCP模型并結(jié)合多線程對服務(wù)器程序進(jìn)行設(shè)計,能夠較好地滿足GPS車載終端的要求。還采用了雙緩沖機(jī)制、懶惰資源回收機(jī)制、事件通知機(jī)制,以及智能線程啟動策略,對服務(wù)器程序性能進(jìn)行優(yōu)化。
該服務(wù)器程序在設(shè)計過程中雖然結(jié)合了多種算法和模型,但尚有很多需要改進(jìn)的地方,如在緩沖鏈表使用中可用哈希表來替換,以節(jié)約查詢時間。另外該服務(wù)器程序可以采用并行架構(gòu),使服務(wù)器上的處理器能夠被充分地利用,從而提高服務(wù)器程序性能。
[1] 王艷平.網(wǎng)絡(luò)與通信程序設(shè)計[M].北京:人民郵電出版社,2006:56-98.
[2] 馬金鑫,袁丁.基于IOCP的高并發(fā)通信服務(wù)器的設(shè)計與實現(xiàn)[J].通信技術(shù),2009,42(7):248 -250.
[3] 陳和平,周靜寧,顧晉廣.IOCP機(jī)制與網(wǎng)絡(luò)代理服務(wù)器實現(xiàn)方法[J].計算機(jī)應(yīng)用,2003,23(4):109 -114.
[4] 馮林,彭尉,滕弘飛.車輛監(jiān)控系統(tǒng)中通信服務(wù)器性能優(yōu)化設(shè)計與實現(xiàn)[J].計算機(jī)工程與應(yīng)用,2005,23(6):199-201.
[5] 翟戰(zhàn)強(qiáng),蔡少華.基于GPRS/GPS/GIS的車輛導(dǎo)航與監(jiān)控系統(tǒng)[J].測繪通報,2004(2):34-36.
[6] 宋薇.基于GPS-GSM車輛監(jiān)控系統(tǒng)服務(wù)器設(shè)計與實現(xiàn)[D].長春:吉林大學(xué)圖書館,2006.
[7] 孫豐金.車輛監(jiān)控系統(tǒng)中通信服務(wù)器的設(shè)計與研究[D].濟(jì)南:山東大學(xué)圖書館,2006.
[8] 何小兵,韓雪琴,文亞星.基于GIS/GPRS的城市交通決策指揮系統(tǒng)模型研究[J].重慶交通學(xué)院學(xué)報,2005,24(2):105 -108.
[9] 沈雪松,劉建業(yè),孫永榮.新型車輛導(dǎo)航監(jiān)控系統(tǒng)研究[J].重慶交通學(xué)院學(xué)報,2005,24(6):137-140.
[10] 顏伏伍,王攀,胡杰,等.基于車載總線的PC式汽車故障診斷系統(tǒng)[J].武漢理工大學(xué)學(xué)報:信息與管理工程版,2011,33(5):758 -762.
[11] 朱聰,劉濟(jì)林,李培弘.GPRS設(shè)備的被動訪問[J].江南大學(xué)學(xué)報:自然科學(xué)版,2006,5(3):265-269.
[12] 王曉強(qiáng),馮永祥.基于VC+MapX的保險理賠車輛監(jiān)控調(diào)度系統(tǒng)的設(shè)計與開發(fā)[J].內(nèi)蒙古大學(xué)學(xué)報:自然科學(xué)版,2005,36(3):324 -327.