劉 碩 莫文濤 劉陸光 張蕊峰 肖 爽
(國(guó)家核電技術(shù)有限公司北京軟件技術(shù)中心 北京 102209) (國(guó)家能源核電軟件重點(diǎn)實(shí)驗(yàn)室 北京 102209)
?
面向核電分析軟件耦合計(jì)算的實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
劉碩莫文濤劉陸光張蕊峰肖爽
(國(guó)家核電技術(shù)有限公司北京軟件技術(shù)中心北京 102209) (國(guó)家能源核電軟件重點(diǎn)實(shí)驗(yàn)室北京 102209)
針對(duì)核電分析軟件耦合計(jì)算過程中遇到的數(shù)據(jù)交換效率低下和數(shù)據(jù)格式不統(tǒng)一等技術(shù)難點(diǎn),提出一種利用網(wǎng)絡(luò)通信和內(nèi)存存儲(chǔ)技術(shù),將實(shí)時(shí)數(shù)據(jù)庫作為數(shù)據(jù)交換中心,并設(shè)計(jì)實(shí)現(xiàn)統(tǒng)一的訪問接口,應(yīng)用于多個(gè)計(jì)算程序之間耦合計(jì)算過程的解決方案,從而實(shí)現(xiàn)了計(jì)算程序之間的高速數(shù)據(jù)交互及簡(jiǎn)單通用的數(shù)據(jù)庫訪問接口。該成果目前已經(jīng)應(yīng)用于核電廠全范圍仿真環(huán)境中,為多個(gè)仿真計(jì)算程序提供數(shù)據(jù)共享服務(wù),其高效性和通用性完全滿足仿真環(huán)境的性能和功能需求。同時(shí),其可擴(kuò)展的特性也支持在不同編程語言開發(fā)的計(jì)算程序耦合過程中進(jìn)行應(yīng)用。
實(shí)時(shí)數(shù)據(jù)庫耦合計(jì)算高速存儲(chǔ)
目前,核電分析軟件自主化正在我國(guó)穩(wěn)步的推進(jìn),但是一些功能模塊的計(jì)算分析程序仍然需要引用國(guó)外已有的成熟軟件進(jìn)行計(jì)算。例如核電廠仿真程序,在模擬核電廠運(yùn)行環(huán)境的時(shí)候,需要根據(jù)一定的時(shí)間間隔,實(shí)時(shí)地控制多個(gè)計(jì)算程序進(jìn)行計(jì)算,同時(shí)在每個(gè)時(shí)間間隔的同步點(diǎn)上,會(huì)有大量的數(shù)據(jù)進(jìn)行交互。為了保證運(yùn)行仿真環(huán)境的實(shí)時(shí)性,必須要求數(shù)據(jù)交換效率非常高,原有的以文件存儲(chǔ)形式作為數(shù)據(jù)交換的手段很難滿足需求。因此如何控制這類計(jì)算程序的運(yùn)行和實(shí)現(xiàn)計(jì)算程序之間的數(shù)據(jù)共享,成為了核電分析軟件開發(fā)人員必須要面對(duì)的問題。
針對(duì)上述核電分析軟件開發(fā)中所面臨的問題,需要找到一個(gè)可行的解決方法,從而使各個(gè)計(jì)算程序得以有效的控制和數(shù)據(jù)資源共享。
1.1Fortran語言的局限性
核電分析軟件一般采用Fortran語言進(jìn)行軟件開發(fā),原因在于Fortran語言具備強(qiáng)大的計(jì)算能力,它可以解決很多數(shù)值問題和非數(shù)值問題。因此,在數(shù)值計(jì)算、科學(xué)和工程技術(shù)領(lǐng)域,具有強(qiáng)大的優(yōu)勢(shì)。但是,由于Fortran語言本身的局限性,并不支持面向網(wǎng)絡(luò)通信的API接口,無法通過消息機(jī)制傳遞數(shù)據(jù)信息。
1.2計(jì)算流程復(fù)雜
核電分析軟件與一般應(yīng)用軟件存在著本質(zhì)區(qū)別,它是通過建立數(shù)學(xué)模型和數(shù)學(xué)方程表達(dá)式進(jìn)行方程式的數(shù)值求解。針對(duì)不同的求解模塊采用多種數(shù)學(xué)模型進(jìn)行建模,通過求解多元高次方程得到計(jì)算結(jié)果,其中還包括迭代等計(jì)算過程,使得這類軟件具有求解多種數(shù)學(xué)模型的能力。在計(jì)算過程中,每次迭代計(jì)算之前都需要對(duì)計(jì)算內(nèi)核中的計(jì)算變量進(jìn)行初始化。這些變量的數(shù)值一般來自用戶預(yù)先的設(shè)置、其他計(jì)算程序的計(jì)算結(jié)果或者計(jì)算程序上一次迭代的計(jì)算結(jié)果。特別是對(duì)于其他計(jì)算程序的計(jì)算結(jié)果,往往很難將數(shù)據(jù)引入計(jì)算內(nèi)核中。
1.3數(shù)據(jù)交換效率低下
核電分析軟件耦合計(jì)算的交互方式通常使用文本文件或二進(jìn)制文件進(jìn)行數(shù)據(jù)交互,但這種交互方式需要進(jìn)行耦合計(jì)算的程序具有數(shù)據(jù)輸出和數(shù)據(jù)解析的業(yè)務(wù)功能。這就要求該類程序在交互的過程中需要遵守統(tǒng)一的數(shù)據(jù)格式約定。同時(shí),在數(shù)據(jù)讀寫過程中會(huì)占用大量的時(shí)間和存儲(chǔ)空間,交互效率非常低下。
2.1架構(gòu)設(shè)計(jì)
實(shí)時(shí)數(shù)據(jù)庫是一種服務(wù)程序,主要由服務(wù)平臺(tái)和通信函數(shù)類庫兩部分組成,如圖1所示。服務(wù)平臺(tái)主要負(fù)責(zé)接收計(jì)算程序發(fā)送的請(qǐng)求信息。然后,對(duì)請(qǐng)求信息進(jìn)行解析并創(chuàng)建線程單獨(dú)完成指派的任務(wù),包括對(duì)內(nèi)存數(shù)據(jù)資源進(jìn)行數(shù)據(jù)的增、刪、改、查以及檢查等操作。最終,將操作結(jié)果信息進(jìn)行響應(yīng)反饋至計(jì)算程序。通信函數(shù)類庫主要負(fù)責(zé)為計(jì)算程序提供訪問服務(wù)平臺(tái)的接口,將計(jì)算程序執(zhí)行過程中的實(shí)時(shí)數(shù)據(jù)封裝打包,并發(fā)送至服務(wù)平臺(tái)[1]。
圖1 系統(tǒng)架構(gòu)示意圖
2.2數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
實(shí)時(shí)數(shù)據(jù)庫采用了“命名數(shù)據(jù)”的方案,即數(shù)據(jù)庫中每個(gè)記錄點(diǎn)都有一個(gè)全局唯一的名稱以及相關(guān)的數(shù)據(jù)信息,如表1所示。數(shù)據(jù)處理模塊根據(jù)記錄點(diǎn)名稱找到該數(shù)據(jù)所有的對(duì)應(yīng)地址,并執(zhí)行相應(yīng)的訪問操作(讀或?qū)?。為了提高訪問效率,記錄點(diǎn)名稱與數(shù)據(jù)地址的映射關(guān)系采用Hash表進(jìn)行保存,并通過不同的前綴進(jìn)行區(qū)分。通常計(jì)算程序發(fā)送的請(qǐng)求信息只會(huì)更新記錄點(diǎn)的實(shí)時(shí)值,而記錄點(diǎn)的其他數(shù)據(jù)信息則由服務(wù)平臺(tái)進(jìn)行更新。
表1 實(shí)時(shí)數(shù)據(jù)庫命名數(shù)據(jù)列表
2.3服務(wù)平臺(tái)設(shè)計(jì)
服務(wù)平臺(tái)作為實(shí)時(shí)數(shù)據(jù)庫的核心引擎,負(fù)責(zé)計(jì)算程序發(fā)送的請(qǐng)求信息的監(jiān)聽、處理和響應(yīng)。服務(wù)平臺(tái)包括連接監(jiān)聽、連接管理、消息處理、任務(wù)處理、數(shù)據(jù)處理和變量注冊(cè)等功能模塊。實(shí)時(shí)數(shù)據(jù)庫的工作流程如圖2所示。
圖2 實(shí)時(shí)數(shù)據(jù)庫工作流程示意圖
在數(shù)據(jù)存儲(chǔ)方式方面,該服務(wù)平臺(tái)采用內(nèi)存作為存儲(chǔ)介質(zhì),以BYTE數(shù)組的方式向內(nèi)存中連續(xù)的存儲(chǔ)一組數(shù)據(jù)。同時(shí),利用HASHTABLE存儲(chǔ)某一組數(shù)據(jù)的索引和長(zhǎng)度。如圖3所示,采用上述存儲(chǔ)方式的原因是,一般的數(shù)組存儲(chǔ)方式是將數(shù)據(jù)逐個(gè)存儲(chǔ)到數(shù)組開辟的內(nèi)存空間中,這種方式雖然靈活、快捷,但是到達(dá)毫秒級(jí)數(shù)據(jù)訪問時(shí),就無法滿足性能需求;而采用BYTE數(shù)組存儲(chǔ)方式,可以使用HASHTABLE快速查找需要更新的數(shù)據(jù)索引,然后一次性訪問該索引所對(duì)應(yīng)的數(shù)據(jù)信息。假設(shè)我們要更新要素A到要素F這6個(gè)值,在使用一般數(shù)組存儲(chǔ)的時(shí)候,需要根據(jù)索引更新6次。但是,在使用BYTE數(shù)組方式時(shí),首先定義一個(gè)要更新的數(shù)據(jù)列表并取得索引編號(hào),然后根據(jù)索引更新這6個(gè)數(shù)據(jù)對(duì)應(yīng)的數(shù)值。當(dāng)同一時(shí)刻數(shù)據(jù)訪問量達(dá)到數(shù)以萬次時(shí),所述方式基本上沒有延遲。如果是非相鄰的情況,則需要更新若干次,比如更新數(shù)據(jù)A、數(shù)據(jù)B、數(shù)據(jù)E、數(shù)據(jù)F,則需要更新兩次,因?yàn)锳B是相鄰的,EF是相鄰的,但是他們?cè)趦?nèi)存中的存儲(chǔ)位置并不相鄰。
圖3 BYTE數(shù)組存儲(chǔ)方式示意圖
2.4通信函數(shù)類庫設(shè)計(jì)
通信函數(shù)類庫為計(jì)算程序提供了訪問服務(wù)平臺(tái)的接口,如表2所示。
表2 通信函數(shù)類庫接口定義表
續(xù)表2
3.1服務(wù)平臺(tái)
服務(wù)平臺(tái)使用C#語言實(shí)現(xiàn),運(yùn)行在.net Framework框架上。利用Socket網(wǎng)絡(luò)編程、多線程、XML解析等技術(shù),將計(jì)算程序發(fā)送的請(qǐng)求信息經(jīng)過收包、組包、解析消息、任務(wù)判定、任務(wù)創(chuàng)建、任務(wù)執(zhí)行等一系列流程后,最終將結(jié)果反饋至計(jì)算程序[2-6]。
該平臺(tái)的內(nèi)部存在C#類型的Dictionary
在一次同步計(jì)算的過程中,計(jì)算程序的每一次同步周期都會(huì)通過通信函數(shù)類庫提供的接口訪問實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái),進(jìn)行一次數(shù)據(jù)交換,并且利用鎖的機(jī)制,控制訪問數(shù)據(jù)庫的線程不允許同時(shí)進(jìn)行讀寫操作[8]。既實(shí)現(xiàn)了數(shù)據(jù)的共享,也保證了數(shù)據(jù)的一致性,增強(qiáng)了計(jì)算程序耦合計(jì)算的執(zhí)行效率。
在運(yùn)行調(diào)度方面,利用多線程技術(shù)實(shí)現(xiàn)任務(wù)調(diào)度管理模塊。當(dāng)服務(wù)端收到客戶端的任務(wù)指令時(shí),啟動(dòng)獨(dú)立的線程向任務(wù)管理隊(duì)列中添加任務(wù),并在運(yùn)行開始時(shí),自動(dòng)讀取任務(wù)線程,控制固定數(shù)量的空余線程,并發(fā)式地從任務(wù)隊(duì)列中讀取任務(wù)進(jìn)行處理。所有任務(wù)都繼承自一個(gè)任務(wù)基類,根據(jù)類型來區(qū)分不同任務(wù)的流程,使程序盡量的松耦合,方便以后的擴(kuò)展及維護(hù)。
3.2通信函數(shù)類庫
通信函數(shù)類庫使用C++語言實(shí)現(xiàn),因此,該類庫可以和絕大多數(shù)開發(fā)語言進(jìn)行混合編程,使那些使用不具備通信機(jī)制開發(fā)語言的程序可以很容易地與實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái)進(jìn)行數(shù)據(jù)傳遞,具有很好的兼容性。
通常,在該類庫使用過程中會(huì)遵循如圖4所示的流程。
圖4 計(jì)算程序運(yùn)行流程
(1) 讀取連接配置文件,并發(fā)送連接請(qǐng)求;
(2) 當(dāng)連接成功后,發(fā)送變量注冊(cè)請(qǐng)求,將需要進(jìn)行數(shù)據(jù)共享的變量列表通知實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái);
(3) 初始化計(jì)算內(nèi)核啟動(dòng)參數(shù);
(4) 通知實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái),初始化成功,等待任務(wù)指令;
(5) 當(dāng)接收到任務(wù)指令后,根據(jù)任務(wù)指令類型,執(zhí)行不同的計(jì)算功能模塊;
(6) 向?qū)崟r(shí)數(shù)據(jù)庫服務(wù)平臺(tái)發(fā)送獲取變量數(shù)值請(qǐng)求,并等待反饋結(jié)果;
(7) 執(zhí)行任務(wù)指令,比如運(yùn)行、停止、暫停、重啟動(dòng)等;
(8) 向?qū)崟r(shí)數(shù)據(jù)庫服務(wù)平臺(tái)發(fā)送更新變量數(shù)值請(qǐng)求,將計(jì)算完成的結(jié)果反饋至實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái);
(9) 完成更新后,會(huì)繼續(xù)等待下一次任務(wù)指令。
如圖5所示,實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái)作為核電廠全范圍仿真環(huán)境的數(shù)據(jù)中心,主要負(fù)責(zé)計(jì)算程序耦合計(jì)算過程中的數(shù)據(jù)交互和數(shù)據(jù)存儲(chǔ)。調(diào)度控制服務(wù)所管理的模擬計(jì)算程序在進(jìn)行耦合計(jì)算的過程中,每次啟動(dòng)計(jì)算程序前,都會(huì)從實(shí)時(shí)數(shù)據(jù)庫中獲得本次計(jì)算周期所需要的參數(shù)集合,并進(jìn)行參數(shù)初始化。當(dāng)經(jīng)過計(jì)算流程后,到達(dá)下一個(gè)同步節(jié)點(diǎn)時(shí),就會(huì)將本次計(jì)算周期所計(jì)算出的結(jié)果參數(shù)更新回實(shí)時(shí)數(shù)據(jù)庫,最后等待下一次執(zhí)行指令。在這個(gè)過程中,同一時(shí)刻會(huì)產(chǎn)生大約20個(gè)模擬計(jì)算程序并發(fā)訪問,總共約5萬個(gè)數(shù)值信息,為達(dá)到仿真環(huán)境的實(shí)時(shí)性,實(shí)時(shí)數(shù)據(jù)庫可以在50毫秒內(nèi)完成所有請(qǐng)求的處理。
圖5 核電廠全范圍仿真環(huán)境
本文介紹了一種實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn),并針對(duì)核電分析軟件中的耦合計(jì)算過程進(jìn)行了分析,提出一種可行的解決方案。通過提供共享數(shù)據(jù)服務(wù)和訪問接口的方式,將計(jì)算程序執(zhí)行過程中產(chǎn)生的中間結(jié)果,通過消息傳遞至實(shí)時(shí)數(shù)據(jù)庫服務(wù)平臺(tái)上。在實(shí)時(shí)性方面,其高速存儲(chǔ)的特性明顯優(yōu)于其他的數(shù)據(jù)存儲(chǔ)方式,有效地提高了計(jì)算程序耦合計(jì)算過程中數(shù)據(jù)交互效率。在通用性方面,通信函數(shù)類庫也提供了統(tǒng)一的接口規(guī)范,使得不同的仿真計(jì)算程序可以很容易地集成到仿真環(huán)境中,增強(qiáng)了仿真環(huán)境模擬計(jì)算的可擴(kuò)展性。
[1] 李德泉,何文春,阮志宇,等.氣象實(shí)時(shí)數(shù)據(jù)庫服務(wù)監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].成都信息工程學(xué)院學(xué)報(bào),2012,27(2):147-152.
[2] 納永良.大型實(shí)時(shí)數(shù)據(jù)庫關(guān)鍵技術(shù)及應(yīng)用研究[D].北京:北京化工大學(xué),2010.
[3] 徐葉軍,謝曉鳴,俞成海.基于Socket的異地?cái)?shù)據(jù)復(fù)制實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2013,26(3):96-98.
[4] 李揚(yáng),耿昌宇,張麗芬.基于Socket通訊模式下的跨平臺(tái)數(shù)據(jù)同步[J].北京理工大學(xué)學(xué)報(bào),2002,22(1):81-84.
[5] 黃顯信.利用Socket通信進(jìn)程實(shí)現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)的同步[J].計(jì)算機(jī)與數(shù)字工程,2003,31(5):28-30.
[6] 李光明.應(yīng)用Socket實(shí)現(xiàn)網(wǎng)絡(luò)通信[J].煤炭技術(shù),2012,31(8):156-157.
[7] 金舒,戴宏斌,賈志敏.面向?qū)ο蟮母咝阅軐?shí)時(shí)數(shù)據(jù)庫ChRDB[J].電力自動(dòng)化設(shè)備,2009,29(12):88-93.
[8] 白天,李國(guó)徽,劉云生.一種實(shí)時(shí)數(shù)據(jù)庫服務(wù)質(zhì)量管理策略[J].湖南大學(xué)學(xué)報(bào):自然科學(xué)版,2011,38(11):88-92.
[9] 徐慧.實(shí)時(shí)數(shù)據(jù)庫中數(shù)據(jù)壓縮算法的研究[D].浙江:浙江大學(xué),2006.
DESIGN AND IMPLEMENTATION OF REAL-TIME DATABASE SERVICE PLATFORM FOR COUPLING CALCULATION OF NUCLEAR POWER ANALYSIS SOFTWARE
Liu ShuoMo WentaoLiu LuguangZhang RuifengXiao Shuang
(StateNuclearPowerSoftwareDevelopmentCenter,Beijing102209,China) (NationalEnergyKeyLaboratoryofNuclearPowerSoftware,Beijing102209,China)
For technical difficulties encountered in coupling calculation of nuclear power analysis software such as low data exchange efficiency and not uniform in data formats, the article presents a solution, it makes use of network communication and memory storage technology, takes the real-time database as data exchange centre, and designs and implements the unified access interface, and has been applied in the coupling calculation process between a plurality of calculation programs, so that achieves the high-speed data interaction between calculation programs and simple and universal database access interfaces. This achievement has been used in the full scope simulation environment of nuclear power plants. It provides data sharing services for multiple simulation programs with adequate efficiency and versatility that fully meet the performance and functional requirements of the simulation environment. At the same time, its scalable feature makes it possible to support the applications in coupling calculation processes developed with different programming languages.
Real-time databaseCoupling calculationHigh-speed storage
2014-12-15。國(guó)家重大專項(xiàng)項(xiàng)目(2011ZX06004-024)。劉碩,工程師,主研領(lǐng)域:核電軟件開發(fā)。莫文濤,高工。劉陸光,助理工程師。張蕊峰,助理工程師。肖爽,助理工程師。
TP311
A
10.3969/j.issn.1000-386x.2016.08.025