• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于消息隊列的在線編譯系統(tǒng)

    2016-07-19 01:42:20于述春
    懷化學院學報 2016年5期

    于述春,  葉 青,  王 鵬

    (懷化學院 計算機科學與工程學院,湖南 懷化 418008)

    ?

    基于消息隊列的在線編譯系統(tǒng)

    于述春,葉青,王鵬

    (懷化學院 計算機科學與工程學院,湖南 懷化418008)

    摘要:在線編譯系統(tǒng)是程序設(shè)計類網(wǎng)上課程練習或程序設(shè)計競賽類網(wǎng)站的一個關(guān)鍵組件,其性能直接影響到系統(tǒng)或網(wǎng)站所支持的并發(fā)用戶數(shù).基于消息隊列的在線編譯系統(tǒng)將在線編譯服務(wù)與Web服務(wù)器變成松耦合結(jié)構(gòu),因而可通過部署更多套在線編譯服務(wù)來支持大用戶量并發(fā)訪問.論文提出了以消息隊列作為Web服務(wù)器和在線編譯系統(tǒng)的中間組件,分析了二者交互的接口技術(shù)JMS以及activemq-cpp,并研究了對于C/C++程序如何限制其運行時間和所用內(nèi)存.測試結(jié)果說明了這種松耦合結(jié)構(gòu)是可行的.

    關(guān)鍵詞:消息隊列;JMS;activemq;在線編譯

    1引言

    編程類在線練習因為方便及練習結(jié)果可馬上知道而大受學習者歡迎[1,3,13],特別是隨著MOOC[12,14]課程的興起,程序設(shè)計類在線課程數(shù)量就更多了,因而訪問量上升,原來未考慮的性能問題現(xiàn)在變成了必須考慮并解決的問題.這種在線編譯與評判技術(shù)最先被很多ACM競賽類網(wǎng)站采用,作為提供練習與交流的工具.在網(wǎng)站訪問量少,并發(fā)訪問數(shù)未達到臨界點時,系統(tǒng)根本不受在線編譯性能影響[2,4,6,7,8,9,10,11].隨著并發(fā)訪問量增大,系統(tǒng)的性能極大受限于在線編譯系統(tǒng).例如,一類全國類的競賽就因為受到在線編譯系統(tǒng)性能的影響,導致比賽時許多參與者的代碼不能及時提交,影響成績.

    語言類編譯器,根據(jù)編譯結(jié)果是中間碼文件還是機器可直接執(zhí)行的最終機器碼文件,依賴于平臺或與平臺無關(guān).C/C++語言依賴于平臺,編譯成機器碼文件,因而在不同的操作系統(tǒng)上,需要用不同的編譯器;java語言由于編譯成中間字節(jié)代碼,因而其編譯產(chǎn)生的目標文件與平臺無關(guān),故可用java API提供的編譯模塊.

    在這樣的在線編譯系統(tǒng)中,由于其源文件由Web后臺提供,而且其編譯結(jié)果也需要通過Web反饋給前臺,因而與Web應(yīng)用系統(tǒng)關(guān)聯(lián)密切.所以一種最方便的做法就是將在線編譯系統(tǒng)與Web應(yīng)用服務(wù)器部署在同一臺機器上,或者讓在線編譯系統(tǒng)訪問與Web應(yīng)用系統(tǒng)相同的數(shù)據(jù)庫.這種做法降低了在線編譯系統(tǒng)的可擴展性,因而,對于C10K問題其性能會顯著下降.

    我們通過將在線編譯系統(tǒng)與Web應(yīng)用系統(tǒng)中間耦合環(huán)節(jié)用消息隊列取代,使Web應(yīng)用系統(tǒng)與在線編譯系統(tǒng)變成一種松耦合結(jié)構(gòu),因而構(gòu)建出一種可擴展的在線編譯系統(tǒng).

    2系統(tǒng)模塊

    2.1系統(tǒng)框架

    構(gòu)建可擴展的在線編譯系統(tǒng)的關(guān)鍵是將Web應(yīng)用系統(tǒng)與在線編譯系統(tǒng)的緊耦合結(jié)構(gòu)變成一種松耦合結(jié)構(gòu).我們采用消息隊列作為Web應(yīng)用系統(tǒng)與在線編譯系統(tǒng)交互的中間組件.

    系統(tǒng)框架如下所示:

    圖1 系統(tǒng)構(gòu)架圖

    圖1所示的構(gòu)架中,客戶端將代碼粘貼到文本框,提交到Web服務(wù)器后,后者指明語言類型,并將該編程題的輸入數(shù)據(jù)及結(jié)果文件數(shù)據(jù)一起組成一個編譯請求,發(fā)送到消息隊列,編譯服務(wù)程序通過消息隊列獲取一份編譯請求,進行編譯或運行,將結(jié)果返回.

    2.2前端頁面

    前端頁面除了為用戶提供編輯代碼的界面外,還有一個作用:等待接收編譯服務(wù)返回的編譯或運行的結(jié)果.通過用一個消息隊列的異步模塊,頁面通過javascript啟動消息隊列異步接收模塊.從而,使Web服務(wù)器對每個Web請求從同步處理變成異步處理,減輕Web服務(wù)器的負擔.

    2.3Web服務(wù)器

    Web服務(wù)器除了直接處理前臺的Web請求外,還將前臺提交的代碼的編程語言類型以及代碼所屬題目的測試數(shù)據(jù)及答案數(shù)據(jù)等一起組成一個編譯請求,用Java消息服務(wù)接口(JMS)發(fā)送到消息隊列.前臺提交的代碼其結(jié)果直接由編譯服務(wù)通過消息隊列傳遞給客戶.

    2.4消息隊列

    消息隊列在整個系統(tǒng)中起著一個中間件的作用,一端連接Web服務(wù)器,另一端連接編譯服務(wù).它本身并不需要很多編程工作,只需要將其啟動運行即可.

    2.5編譯服務(wù)器

    編譯服務(wù)器主要完成用戶提交代碼的編譯或運行,如果編譯出現(xiàn)錯誤,則直接將編譯錯誤作為結(jié)果,發(fā)送到消息隊列,由客戶接收;如果無編譯錯誤,則用Web服務(wù)器提供的測試數(shù)據(jù)運行程序,將得到的結(jié)果與Web服務(wù)器提供的結(jié)果文件進行比較.并將運行結(jié)果通過消息隊列返回給客戶.

    編譯服務(wù)器從消息隊列接收或向消息隊列發(fā)送消息,運用消息隊列activemq提供的C++編程接口.

    3關(guān)鍵技術(shù)

    3.1JMS接口

    為在Web服務(wù)器中使用activemq消息隊列,需要一個activemq-client jar包,把這個jar包加入lib目錄后,就可使用JMS接口發(fā)送消息到activemq消息隊列了.

    當收到客戶提供的代碼時,調(diào)用JMS接口將代碼放進消息隊列:

    新建一個連接工廠;

    創(chuàng)建一個連接;

    創(chuàng)建一個連接上的會話;

    在會話上創(chuàng)建一個主題;

    設(shè)置代碼語言屬性;

    將代碼作為消息發(fā)送到消息隊列.

    3.2消息隊列通信接口

    先下載activemq-cpp源程序包,接著下載其依賴包源程序包:cppunit,apr,apr-util,apr-iconv;然后再編譯四個依賴包,分別得到cppunit.dll,apr.dll,apr-util.dll,apr-iconv,最后再編譯activemq-cpp,得activemq-cpp.dll.

    在編譯服務(wù)程序入口端,通過調(diào)用activemq-cpp接口從activemq消息隊列中接收提交的源程序:

    獲取CMS連接工廠;

    創(chuàng)建一個連接;

    創(chuàng)建一個連接上的會話;

    在會話上創(chuàng)建一個主題;

    創(chuàng)建一個消息接收者;

    重載onMessage()方法.

    在onMessage()中接收提供的代碼.

    在編譯服務(wù)程序出口端,將相關(guān)編譯錯誤消息或運行結(jié)果信息作為一個消息隊列到activemq消息隊列:

    獲取CMS連接工廠;

    創(chuàng)建一個連接;

    創(chuàng)建一個連接上的會話;

    在會話上創(chuàng)建一個主題;

    創(chuàng)建一個消息發(fā)送者;

    設(shè)置消息編號屬性;

    發(fā)送消息到消息隊列.

    在用activemq-c++編程接口從消息隊列接收或向其發(fā)送消息時,需要解決字符編碼問題.在Web服務(wù)器端,由于采用Java開發(fā),字符編碼用UTF-8,在編譯服務(wù)器一端,由于要以windows服務(wù)的形式運行,采用的編譯繼承windows默認編碼.由于兩端編碼不同,導致通過消息隊列收發(fā)的消息不正確.因此,我們提供了一個編碼接口.

    3.3編譯服務(wù)

    在編譯服務(wù)中,通過消息隊列接口獲取待編譯代碼及測試數(shù)據(jù)和測試結(jié)果,然后根據(jù)代碼語言類型分別調(diào)用相應(yīng)語言的編譯服務(wù).

    Java語言類的編譯服務(wù)不是直接調(diào)用javac進行編譯,而是通過調(diào)用java動態(tài)編譯類進行編譯,同時獲取編譯可能的錯誤信息.

    C/C++語言類的編譯服務(wù)只能直接調(diào)用不同平臺下的編譯器進行編譯,例如,windows平臺下調(diào)用cl,linux平臺下調(diào)用gcc/g++進行編譯,通過分析其輸出結(jié)果判斷編譯有無錯誤.

    在編譯有錯誤時,停止對程序的運行,并將錯誤消息通過消息隊列接口發(fā)送到消息隊列.

    當編譯正確時,對于所運行的用戶程序必須限制其資源和運行時間.對于java類程序,可通過動態(tài)編譯運行工具的支持對所運行的java程序設(shè)置內(nèi)存及運行時間的限制.

    對于C/C++類編譯器生成的機器碼程序,由于無相關(guān)的動態(tài)編譯運行機制,必須通過system方法調(diào)用這些機器碼程序運行,因而比較難于控制.因此,在編譯服務(wù)程序中為每個編譯服務(wù)創(chuàng)建一個新進程,并將每個新創(chuàng)建的進程的啟動時間記錄到一個哈希表中,以進程句柄為鍵值,設(shè)置一個計時器,計時器中斷時間為1秒,在WM_TIMER事件中用當前系統(tǒng)時間減去哈希表中所記錄每個進程的啟動時間,如果超時,則調(diào)用TerminateProcess中止該進程,并通過activemq-cpp消息隊列接口向該用戶發(fā)送超時消息.

    為監(jiān)控C/C++程序使用內(nèi)存情況,可用SetTimer設(shè)置第二個計時器,并將每個新建進程當前所用內(nèi)存記錄到第二個哈希表,也以進程句柄為鍵值,在WM_TIMER事件中用其計時器ID來區(qū)分第一個與第二個,用Get Process Memory Info函數(shù)獲取當前運行進程占用的內(nèi)存,每當某個進程所用內(nèi)存超過上限,則用Terminate Process終止此進程,并將內(nèi)存超限的錯誤消息通過消息隊列接口發(fā)送到消息隊列.

    4測試環(huán)境與結(jié)果

    測試環(huán)境:局域網(wǎng)帶寬100 Mbps,Web服務(wù)器由一臺PC機承擔,編譯服務(wù)放在另一臺PC機上,windows平臺.PC機2G內(nèi)存,Intel i3 4核CPU,客戶機也由PC機承擔.

    測試過程:分別由5臺PC機作C、C++和java在線編程練習,檢驗其響應(yīng)時間和結(jié)果.其中一個C程序是一個無限循環(huán)程序,另一個C程序則分配10M的內(nèi)存,導致內(nèi)存超限(內(nèi)存限制設(shè)置為2M),計時限制為1秒.對每個測試程序,都提交兩遍:一遍是正確的,另一遍是錯誤的.

    測試代碼提交與結(jié)果返回:

    圖2 代碼提交與編譯結(jié)果返回示意圖

    左邊是代碼提交,右邊是由編譯服務(wù)器返回的編譯運行結(jié)果.

    測試結(jié)果如表1.

    表1 測試結(jié)果

    測試結(jié)果說明對于C/C++程序運行的時間控制和使用內(nèi)存限制正常發(fā)揮作用,對于java程序運行的時間限制和內(nèi)存限制也是正常的;整個程序流程從前臺到編譯服務(wù)程序再返回到前臺是完全正確的.

    我們再將編譯服務(wù)程序部署到一臺新的機器上,讓測試機器提交測試代碼,結(jié)果部署的兩套編譯服務(wù)程序都正常工作.這說明我們的基于消息隊列的在線編譯系統(tǒng)具有可擴展性.

    5結(jié)束語

    在線編譯系統(tǒng)是程序設(shè)計類網(wǎng)上課程或競賽系統(tǒng)的一個關(guān)鍵模塊,大多的這類系統(tǒng)都受限于部署在線編譯系統(tǒng)的機器的性能,所能支持的并發(fā)用戶數(shù)有限.我們的系統(tǒng)由于與Web服務(wù)器的耦合被消息隊列所間隔,因而可將在線編譯系統(tǒng)部署在其他機器上,而且部署機器數(shù)不會受到系統(tǒng)因素的限制,因而具有可擴展性.系統(tǒng)存在的一個問題是,編譯服務(wù)程序運行的結(jié)果直接返回給用戶,而未經(jīng)過Web服務(wù)器的評判記分,這是一個有待改進的地方.但編譯服務(wù)程序給出的結(jié)果信息還是明確的:提交的代碼是正確還是錯誤的.

    參考文獻:

    [1]田地.支持移動端的C語言在線編譯系統(tǒng)的設(shè)計與實現(xiàn)[J].信息通信,2015(1):113-115.

    [2]尤楓,史晟輝,趙瑞蓮.編譯程序在線評測系統(tǒng)的實現(xiàn)[J].實驗室研究與探索,2010(12):69-73.

    [3]張巍.在線編譯教學系統(tǒng)在C/C++課程中的應(yīng)用與研究[J].才智,2009(11):69-70.

    [4]劉曉君.基于Web的虛擬教學系統(tǒng)設(shè)計與實現(xiàn)[D].成都:電子科技大學,2012:31-43.

    [5]蔣燕敏.自動判題算法及網(wǎng)絡(luò)考試平臺研究[D].杭州:浙江工業(yè)大學,2014,碩士論文.

    [6]汪松松.基于在線服務(wù)模式的程序編譯平臺的研究[J].科技信息,2011(31):461-462.

    [7]翟紅英,王波.基于C#.NET的在線編譯方法的應(yīng)用與研究[J].計算機光盤軟件與應(yīng)用,2013(7):97-98.

    [8]梅剛,林齡,潘峰.基于Web的在線編譯環(huán)境設(shè)計[J].計算機時代,2015(5):29-31.

    [9]汪松松.基于在線服務(wù)模式的程序編譯平臺的研究.2011(41):462+461.

    [10]張恒升,陳翰博,王偉,等.基于net和Ajax的在線編譯器網(wǎng)絡(luò)平臺開發(fā)[J].價值工程,2010(5):152-153.

    [11]陳元靜.基于J2EE/SSH在線代碼評測系統(tǒng)的設(shè)計與實現(xiàn)[D].成都:電子科技大學,2013:23-32.

    [12]昝鎮(zhèn).面向MOOC的程序設(shè)計輔助教學系統(tǒng)[D].西安:西北大學,2014:32-45.

    [13]熊茜,雷亮,許莎,等.基于在線判題系統(tǒng)的C語言實驗教學改革[J].重慶學院學報(社會科學版),2015(10):67-69.

    [14]龍虎,張小梅,唐林海.大數(shù)據(jù)背景下智慧教育云平臺的構(gòu)建研究[J].電腦知識與技術(shù),2015(20):109-111.

    The Online Compiling System Based on Message Queue

    YU Shu-chun,YE Qing,WANG Peng

    (CollegeofComputerScienceandEngineering,HuaihuaUniversity,Huaihua,Hunan418008)

    Abstract:The online compiling system is the key component of the programming online course exercise or programming design contest,its performance directly affects the concurrent user number of the web site.The online compiling system based on the message queue make a loose coupling structure between the Web server and the online compiling service,so it can support more concurrent user by deploying more than one online compiling system.Paper proposed using the message queue as the middle component between the Web server and the online compiling system,analyzed the interactive interface technique,such as JMS and activemq-cpp,and studied how to limit the run time and the used memory of the C/C++ program.Test shows that this loose coupling structure is flexible.

    Key words:message queue;JMS;activemq;online compiling

    收稿日期:2015-11-29

    基金項目:湖南省教育廳科研資助項目(13C714);懷化學院重點學科建設(shè)項目;懷化學院大學生創(chuàng)新項目.

    作者簡介:于述春,1965年生,男,講師,研究方向:計算機網(wǎng)絡(luò)、云計算、計算機視覺.

    中圖分類號:TP311

    文獻標識碼:A

    文章編號:1671-9743(2016)05-0056-04

    溧阳市| 当涂县| 静安区| 克东县| 星座| 招远市| 东光县| 大足县| 新宾| 静乐县| 连州市| 读书| 始兴县| 凉城县| 梅州市| 霍州市| 玛沁县| 南通市| 岱山县| 英德市| 始兴县| 含山县| 原阳县| 石阡县| 天峻县| 孙吴县| 广丰县| 揭东县| 内江市| 四会市| 廊坊市| 仙桃市| 五莲县| 德令哈市| 陇南市| 汉源县| 新野县| 札达县| 南江县| 晋城| 吉水县|