◆程俊波
(西安石油大學(xué)計(jì)算機(jī)學(xué)院 陜西 710065)
基于java多線程的實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)
◆程俊波
(西安石油大學(xué)計(jì)算機(jī)學(xué)院 陜西 710065)
為了滿足實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)中多種操作并發(fā)執(zhí)行的需求,采用了多線程設(shè)計(jì)模式設(shè)計(jì)了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)構(gòu)架,利用java語(yǔ)言中多線程技術(shù)特性實(shí)現(xiàn)了多種任務(wù)的并發(fā)處理。多線程技術(shù)提高了程序的實(shí)時(shí)響應(yīng)能力,改進(jìn)程序的設(shè)計(jì)結(jié)構(gòu),更有效地發(fā)揮處理器的功能,減少對(duì)系統(tǒng)資源的頻繁調(diào)度和切換。同時(shí),增強(qiáng)了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的并行處理能力,改善了客戶的交互響應(yīng)時(shí)間,提高了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的整體性能。
多線程;實(shí)時(shí)數(shù)據(jù)庫(kù);并發(fā)處理;線程池
隨著社會(huì)和計(jì)算機(jī)科學(xué)的發(fā)展,許多企業(yè)要求以“及時(shí)方式”(即按所要求的時(shí)間)處理并管理大量的共享信息。這就要求維護(hù)大量的數(shù)據(jù)和應(yīng)用的實(shí)時(shí)性,應(yīng)用之間及數(shù)據(jù)與應(yīng)用之間帶有時(shí)間語(yǔ)義的彼此依賴關(guān)系。因此,產(chǎn)生了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)[1]。實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)需要完成對(duì)實(shí)時(shí)數(shù)據(jù)的各種操作:如實(shí)時(shí)數(shù)據(jù)處理、歷史數(shù)據(jù)存儲(chǔ)、統(tǒng)計(jì)數(shù)據(jù)處理、報(bào)警處理、事件處理、數(shù)據(jù)服務(wù)請(qǐng)求處理等。既需要數(shù)據(jù)庫(kù)技術(shù)來(lái)支持大量數(shù)據(jù)的共享,維護(hù)其數(shù)據(jù)的一致性,又需要實(shí)時(shí)處理技術(shù)來(lái)支持其任務(wù)與數(shù)據(jù)的定時(shí)限制的實(shí)現(xiàn)。針對(duì)以上多種事件并發(fā)處理,多個(gè)客戶端并發(fā)訪問(wèn),實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的并發(fā)控制與性能問(wèn)題成為需要解決的緊迫問(wèn)題。多線程程序設(shè)計(jì)是指單個(gè)程序中使用多個(gè)線程,這些線程在同一時(shí)間并發(fā)運(yùn)行,執(zhí)行不同的任務(wù)[2]。用多個(gè)線程同時(shí)為多個(gè)客戶端提供服務(wù)是提高服務(wù)器并發(fā)性能的最常用手段。并且,java線程池技術(shù)已經(jīng)越來(lái)越多地被應(yīng)用到服務(wù)器中,在一定程度上緩解了系統(tǒng)的壓力
1.1 實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的功能需求
實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)由1個(gè)主線程和5個(gè)線程組組成,它們分別是主控線程(MainThread)、OPC通訊線程組(OPCComThreadGroup)、Dtag計(jì)算線程組(DtagCalcThreadGroup)、事件計(jì)算線程組(EventCalcThreadGroup)、組播線程組(MultiCastThreadGroup)[3]、處理客戶端請(qǐng)求線程組(RequestProThreadGroup)。
主控線程負(fù)責(zé)初始化運(yùn)行時(shí)的內(nèi)存對(duì)象;OPC通訊線程組負(fù)責(zé)采集數(shù)據(jù);Dtag計(jì)算線程組負(fù)責(zé)計(jì)算Dgroup中Dtag的值;事件計(jì)算線程組負(fù)責(zé)處理事件;組播線程組(MultiCastThreadGroup)負(fù)責(zé)將組播隊(duì)列中的組播包組播給客戶端;處理客戶端請(qǐng)求線程組負(fù)責(zé)對(duì)客戶端的請(qǐng)求進(jìn)行響應(yīng)處理。
1.2 實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)架構(gòu)
圖1 實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)架構(gòu)
路徑1:OPC通訊線程組首先建立異步通訊,然后定期輪詢實(shí)時(shí)數(shù)據(jù),發(fā)現(xiàn)有數(shù)據(jù)更新就會(huì)復(fù)制tag點(diǎn)的實(shí)時(shí)值和時(shí)間戳,并計(jì)算報(bào)警。接下來(lái),組播線程組從數(shù)據(jù)區(qū)取出數(shù)據(jù)和報(bào)警記錄,最后組播給客戶端。
路徑2:Dtag計(jì)算線程組首先比較每個(gè)DGroup的周期和當(dāng)前時(shí)間,獲得到期的DGroup并計(jì)算Dtag點(diǎn)的值和報(bào)警。然后由組播線程組將其組播給客戶端。
路徑3:事件計(jì)算線程組首先比較每個(gè)Event的周期和當(dāng)前時(shí)間,獲得到期的Event,然后執(zhí)行Event腳本。
路徑4:處理客戶端請(qǐng)求線程組同步處理客戶端的請(qǐng)求。其中包含請(qǐng)求有7種:客戶端登錄、客戶端注銷、全組播、讀TIDs、寫(xiě)TIDs、讀取時(shí)間范圍的報(bào)警記錄、報(bào)警確認(rèn)記錄。
2.1 總控線程
主控線程是控制5個(gè)線程組的總控制器,它也是管理其他5個(gè)線程組的父線程組??偪鼐€程中的最大子線程額度為N,所以5個(gè)線程組的總子線程數(shù)量的和不能超過(guò)N。每個(gè)線程組也中各有一個(gè)額度(線程組中可以同時(shí)活動(dòng)的最大線程數(shù)量),分別用sign1,sign2,...,sign5來(lái)表示5個(gè)線程組中的子線程額度,即(N >= sign1+sign2+sign3+sign4+sign5)。
主控線程基于各個(gè)線程組的歷史吞吐量(在一個(gè)整體時(shí)間內(nèi)盡可能多地執(zhí)行完任務(wù),或者盡可能多地發(fā)出請(qǐng)求并響應(yīng))、任務(wù)隊(duì)列大小和任務(wù)對(duì)象類型,自動(dòng)增減并發(fā)的子線程數(shù)量,調(diào)整線程池的容量,能夠最大化線程池的吞吐量[4]。吞吐量(TPS)是在系統(tǒng)運(yùn)行穩(wěn)定后,主控線程計(jì)算單位時(shí)間內(nèi)各個(gè)線程組的完成的任務(wù)數(shù),單位:個(gè)數(shù)/s。主控線程動(dòng)態(tài)的根據(jù)時(shí)間段內(nèi)各個(gè)線程組的吞吐量來(lái)調(diào)整每個(gè)線程組的額度大小。
2.2 線程組內(nèi)架構(gòu)的實(shí)現(xiàn)
實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)服務(wù)器應(yīng)用程序中經(jīng)常出現(xiàn)單個(gè)任務(wù)處理的時(shí)間很短而請(qǐng)求的數(shù)目卻是巨大的。每當(dāng)一個(gè)請(qǐng)求到達(dá)就創(chuàng)建一個(gè)新線程,然后在新線程中為請(qǐng)求服務(wù)。那么為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新線程的開(kāi)銷很大,在一個(gè) JVM 里創(chuàng)建太多的線程可能會(huì)導(dǎo)致系統(tǒng)由于過(guò)度消耗內(nèi)存而用完內(nèi)存或“切換過(guò)度”。
線程池恰恰能夠解決以上問(wèn)題,父線程用于創(chuàng)建并管理線程池,任務(wù)隊(duì)列用于存放沒(méi)有處理的任務(wù),提供一種緩沖機(jī)制[5]。線程池在還沒(méi)有任務(wù)到來(lái)之前,預(yù)先創(chuàng)建一定數(shù)量的子線程,放入空閑隊(duì)列中。這些線程都是處于睡眠(Sleep)狀態(tài),不消耗CPU,但占用較小的內(nèi)存空間。
外部因素觸發(fā)產(chǎn)生任務(wù),任務(wù)的創(chuàng)建通過(guò)new操作,動(dòng)態(tài)的創(chuàng)建具體的任務(wù)對(duì)象,然后添加任務(wù)對(duì)象到任務(wù)隊(duì)列中,隊(duì)列頭head+1,任務(wù)隊(duì)列可以為無(wú)限大。同時(shí),外部因素喚醒了父線程,父線程便會(huì)分配任務(wù)給一個(gè)空閑子線程,即啟動(dòng)空閑子線程,把任務(wù)傳入此線程中運(yùn)行,進(jìn)行處理,任務(wù)隊(duì)列的頭head-1。子線程獲取到任務(wù)后,信號(hào)量sign-1。子線程執(zhí)行完任務(wù)后信號(hào)量sign+1。當(dāng)預(yù)先創(chuàng)建的線程都處于運(yùn)行(Run)狀態(tài),即預(yù)制線程不夠,線程池可以自由創(chuàng)建一定數(shù)量的新線程,用于處理更多的請(qǐng)求,但是總的子線程數(shù)不能超過(guò)線程組的額度(sign)。當(dāng)系統(tǒng)比較空閑時(shí),大部分線程都一直處于掛起(Suspend)狀態(tài),線程池自動(dòng)銷毀一部分線程,回收系統(tǒng)資源[6]。
2.3 線程組內(nèi)調(diào)度算法
父線程首先初始化線程運(yùn)行時(shí)的內(nèi)存對(duì)象,然后處于等待狀態(tài)。當(dāng)有外部因素或者其他子線程完成任務(wù)后,會(huì)喚醒父線程,父線程在分配任務(wù)給子線程之前,要檢查線程組的額度是否為0(if sign==0),如果額度不為0,則分配任務(wù)給子線程,否則,等待有空閑線程后才能分配任務(wù),然后自己掛起,等待再次被喚醒。子線程被喚醒之后執(zhí)行任務(wù),執(zhí)行完任務(wù)后喚醒其他組的父線程并掛起,等待下次喚醒。
父線程可以為子線程動(dòng)態(tài)的設(shè)置優(yōu)先級(jí),保證緊急任務(wù)盡早處理完成。父線程在靜態(tài)優(yōu)先級(jí)的基礎(chǔ)上,根據(jù)線程組的吞吐量以及某些特定條件動(dòng)態(tài)的提高或者降低子線程的優(yōu)先級(jí)。從而使得高優(yōu)先級(jí)的子線程能夠優(yōu)先得到處理器的執(zhí)行[7]。
2.4 線程間的協(xié)作
OPCServer與實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)建立異步通訊,當(dāng)有實(shí)時(shí)數(shù)據(jù)更新時(shí),OPCServer會(huì)喚醒OPC通訊線程組對(duì)數(shù)據(jù)進(jìn)行及時(shí)處理,OPC通訊線程對(duì)數(shù)據(jù)進(jìn)行處理之后喚醒組播線程組,同時(shí)也喚醒Dtag計(jì)算線程組,Dtag計(jì)算線程組對(duì)DGroup中的派生點(diǎn)進(jìn)行計(jì)算后將數(shù)值給組播線程組,最后由組播線程組通過(guò)UDP協(xié)議將數(shù)據(jù)和報(bào)警記錄組播給客戶端[8]。
數(shù)據(jù)區(qū)是共享資源區(qū),需要線程同步對(duì)數(shù)據(jù)區(qū)進(jìn)行保護(hù),Event計(jì)算線程組會(huì)定時(shí)輪詢事件,如果數(shù)據(jù)區(qū)的數(shù)據(jù)滿足事件條件表達(dá)式,就會(huì)喚醒Event計(jì)算線程組來(lái)處理事件,事件一般是往硬件物理地址讀寫(xiě)數(shù)據(jù),此時(shí)會(huì)觸發(fā)硬件物理驅(qū)動(dòng)。
客戶端通過(guò)TCP協(xié)議與服務(wù)器進(jìn)行互動(dòng),服務(wù)器會(huì)根據(jù)客戶端的不同請(qǐng)求返回不同的響應(yīng)[9]。
基于java多線程編程技術(shù)實(shí)現(xiàn)了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng),解決處理器單元內(nèi)多個(gè)線程執(zhí)行的問(wèn)題,顯著減少處理器單元的閑置時(shí)間,增加處理器單元的吞吐能力[10]。其中,java線程池的并發(fā)執(zhí)行多個(gè)任務(wù)而對(duì)線程高效的并發(fā)控制策略有效的提高了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的并行處理能力,改善了交互響應(yīng)時(shí)間,提高了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的整體性能。接下來(lái),要致力于整個(gè)系統(tǒng)中線程間的同步研究,設(shè)計(jì)出完善的同步機(jī)制。
[1]鄭阿奇,劉啟芬,顧韻華.SQL Server 2000實(shí)用教程[M].北京:電子工業(yè)出版,2002.
[2]閃四清.SQL Server 2000簡(jiǎn)明教程[M].北京:清華大學(xué)出版社.2003.
[3]文家焱,施平安.?dāng)?shù)據(jù)庫(kù)系統(tǒng)原理與應(yīng)用[M].北京:冶金工業(yè)出版社,2002.
[4]高榮芳,張曉濱,趙安科.?dāng)?shù)據(jù)庫(kù)原理[M] 西安電子科技大學(xué)出版社,2003.
[5]李國(guó)彬,趙麗娟,沈淑清.SQL Server 2000應(yīng)用基礎(chǔ)與實(shí)訓(xùn)教程[M].電子科技大學(xué)出版社,2004.
而在login.js文件中創(chuàng)建顯示驗(yàn)證碼和刷新驗(yàn)證碼的方法用于后期在網(wǎng)頁(yè)模板中的js函數(shù)調(diào)用。
2.2 在網(wǎng)頁(yè)模板中加載PHP文件輸出驗(yàn)證碼
要在網(wǎng)頁(yè)上顯示驗(yàn)證碼只需要在頁(yè)面加載過(guò)程中調(diào)用上述產(chǎn)生的兩個(gè)js函數(shù)即可,在頁(yè)面載入后顯示隨機(jī)驗(yàn)證碼,點(diǎn)擊“換一張”鏈接可以實(shí)現(xiàn)驗(yàn)證碼的刷新顯示。實(shí)現(xiàn)效果如圖2所示。
圖2 效果圖
網(wǎng)站的安全問(wèn)題是網(wǎng)民們考慮的首要問(wèn)題,因此網(wǎng)站應(yīng)該要向用戶提供一個(gè)安全的環(huán)境,使用驗(yàn)證碼技術(shù)能有效的避免網(wǎng)站上常見(jiàn)的“身份欺騙”現(xiàn)象,使網(wǎng)站用戶能享有一個(gè)公平、安全的網(wǎng)絡(luò)環(huán)境。因此,網(wǎng)站設(shè)計(jì)者在設(shè)計(jì)網(wǎng)站時(shí)要充分考慮到安全問(wèn)題,采用多種技術(shù)提高網(wǎng)站的安全性,同時(shí),用戶也要提高自己的安全意識(shí),消除安全隱患。
參考文獻(xiàn):
[1]龔莎.網(wǎng)頁(yè)驗(yàn)證碼技術(shù)綜述[J].信息與電腦,2014.
[2]歐志敏.關(guān)于驗(yàn)證碼原理與應(yīng)用的探討[J].華南金融電腦,2007.
[3]明日科技.PHP從入門(mén)到精通[M].北京:清華大學(xué)出版社,2012.
[4]宋尚平,李興保.PHP模板引擎Smarty的安裝配置及應(yīng)用實(shí)現(xiàn)[J].現(xiàn)代教育技術(shù),2007.