池邦強(qiáng) 王麗麗
【摘要】 從實(shí)現(xiàn)現(xiàn)代化計(jì)算機(jī)教學(xué)管理的角度出發(fā),在程序評(píng)測(cè)機(jī)制,多核測(cè)評(píng)技術(shù),負(fù)載均衡,源代碼抄襲檢測(cè),教學(xué)管理,Cache緩存、異步響應(yīng)等方面搭建并優(yōu)化了在線(xiàn)測(cè)評(píng)系統(tǒng),使得在線(xiàn)評(píng)測(cè)程序更加容易應(yīng)用于計(jì)算機(jī)教學(xué)管理。后討論了基于在線(xiàn)測(cè)評(píng)系統(tǒng)實(shí)現(xiàn)智能教學(xué)管理的統(tǒng)一測(cè)試平臺(tái)的方式和問(wèn)題。
【關(guān)鍵字】 在線(xiàn)測(cè)評(píng) 緩存 抄襲檢測(cè)
一、在線(xiàn)測(cè)評(píng)系統(tǒng)的架構(gòu)
程序在線(xiàn)測(cè)評(píng)系統(tǒng)(Online Judge System,以下簡(jiǎn)稱(chēng)OJ),起于ACM/ICPC競(jìng)賽,是一個(gè)基于web的應(yīng)用程序。該系統(tǒng)在Linux環(huán)境下開(kāi)發(fā),站點(diǎn)采用LAMP結(jié)構(gòu)(Mysql版本>= 5.1,PHP版本>=5.3.28),其作用是與用戶(hù)交互,存儲(chǔ)業(yè)務(wù)數(shù)據(jù)。judge_client進(jìn)程為實(shí)際判題程序,由judged觸發(fā),負(fù)責(zé)準(zhǔn)備運(yùn)行環(huán)境、數(shù)據(jù),運(yùn)行并監(jiān)控目標(biāo)程序的系統(tǒng)調(diào)用,采集運(yùn)行指標(biāo),判斷運(yùn)行結(jié)果。前后端的耦合處是數(shù)據(jù)庫(kù)。同時(shí)歸咎于LAMP的結(jié)構(gòu),該系統(tǒng)前端的移植性較好。但如果想要做到在Windows下判題,需要重寫(xiě)部分判題程序的代碼。
二、在線(xiàn)測(cè)評(píng)系統(tǒng)的前端/站點(diǎn)結(jié)構(gòu)
Controller層和Model層均使用class來(lái)編程。Controller層負(fù)責(zé)從View層讀取數(shù)據(jù),控制用戶(hù)輸入,并向Model層發(fā)送/取出數(shù)據(jù)。Model層負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)。View層不能直接與Model層通信,所有的數(shù)據(jù)都通過(guò)Controller層獲得。這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,View層可以根據(jù)不同要求快速改造頁(yè)面。利用CSS3的@media screen特性,可以控制不同尺寸設(shè)備的顯示效果。UJSOJ利用這種特性快速編寫(xiě)了移動(dòng)端。
三、在線(xiàn)測(cè)評(píng)系統(tǒng)的后端判題服務(wù)
后端判題服務(wù)與前端站點(diǎn)的耦合點(diǎn)是數(shù)據(jù)庫(kù)。通信方式是對(duì)Mysql輪詢(xún)。當(dāng)用戶(hù)提交新的代碼至數(shù)據(jù)庫(kù)中,judged程序?qū)㈤_(kāi)啟一個(gè)judged_client進(jìn)程,將代碼交由judged_ client處理。這里也是系統(tǒng)開(kāi)銷(xiāo)最大的地方。為了實(shí)現(xiàn)judged_client流暢運(yùn)行,其運(yùn)用了以下一些技術(shù)。
3.1 沙箱機(jī)制
由于用戶(hù)提交的是需要運(yùn)行的代碼,安全性是最大的問(wèn)題。沙箱機(jī)制被用來(lái)保證程序不影響服務(wù)器環(huán)境,它主要從以下幾個(gè)方面進(jìn)行限制:
a時(shí)間,資源方面:針對(duì)不同的題型有不同的內(nèi)存限制,運(yùn)行時(shí)間限制。
b敏感詞過(guò)濾:設(shè)立黑名單數(shù)組,通過(guò)正則搜尋,不允許代碼中出現(xiàn)類(lèi)似以下的詞組:system(“shutdown …”)。
c管道技術(shù):一般適用于linux系統(tǒng),在系統(tǒng)執(zhí)行用戶(hù)提交的代碼前,系統(tǒng)首先把輸入流定向到標(biāo)準(zhǔn)輸入文件,然后使用chroot改變用戶(hù)程序的執(zhí)行目錄,讓其只能在一個(gè)臨時(shí)目錄下面做操作。
d權(quán)限與訪(fǎng)問(wèn)控制方面,不允許代碼讀取規(guī)定目錄和用戶(hù)相關(guān)目錄以外的任何文件。
3.2 任務(wù)隊(duì)列與負(fù)載均衡
根據(jù)教學(xué)實(shí)際情況,學(xué)生提交程序一般集中在一個(gè)時(shí)間段。在這個(gè)時(shí)間段內(nèi)系統(tǒng)會(huì)接收到大量的運(yùn)算任務(wù)。任務(wù)隊(duì)列模型用于排序提交的任務(wù)。負(fù)載均衡的前提是使用了多個(gè)判題機(jī),目的是減少單機(jī)負(fù)荷,提高判題效率。任務(wù)隊(duì)列模型中,用戶(hù)提交的任務(wù)成隊(duì)列排序,先進(jìn)先出。當(dāng)用戶(hù)提交新的答案后,Web程序就將判題任務(wù)加入數(shù)據(jù)庫(kù)的任務(wù)隊(duì)列,隨后判題服務(wù)程序Judged 則自動(dòng)鎖定任務(wù)并完成,可以防止同一任務(wù)被多次判斷而浪費(fèi)系統(tǒng)資源。同時(shí),系統(tǒng)可以設(shè)置多個(gè)判題機(jī)以增大負(fù)荷能力,采用對(duì)數(shù)據(jù)庫(kù)輪詢(xún)策略實(shí)現(xiàn)負(fù)載均衡。這里的負(fù)載均衡并非是以“判題機(jī)在該時(shí)刻CPU或者內(nèi)存占比的大小“為參數(shù)的均衡,而是以“任務(wù)數(shù)量”作為參數(shù)。因此在分配任務(wù)時(shí),任務(wù)分配到哪一臺(tái)判題機(jī)上是以“任務(wù)ID”對(duì)?!比蝿?wù)總數(shù)“取余決定的。這樣的設(shè)計(jì)不但能夠適應(yīng)日常教學(xué)的小范圍使用,而且可以從多個(gè)層面擴(kuò)大服務(wù)器集群的規(guī)模,高效應(yīng)對(duì)大規(guī)模的并發(fā)服務(wù)。
3.3 防抄襲機(jī)制
當(dāng)用戶(hù)代碼的通過(guò)測(cè)試后,judge_client將產(chǎn)生所提交代碼的MD5碼(信息-摘要算法5)記錄于數(shù)據(jù)庫(kù)中。這意味著想要找到兩個(gè)不同的數(shù)據(jù),使它們具有相同的MD5值時(shí)非常困難的。但這也應(yīng)當(dāng)注意到,防抄襲機(jī)制在這種情況下不是很有效,增加一個(gè)空格就會(huì)生成不同的MD5。所以只有用戶(hù)(這里主要指向?qū)W生)原封不動(dòng)復(fù)制代碼應(yīng)付作業(yè),才會(huì)發(fā)生這種狀況。為了增強(qiáng)防抄襲機(jī)制的有效性,可以利用正則表達(dá)式,先對(duì)通過(guò)的代碼的去處多余的空格,換行符,制表符等,類(lèi)似一種簡(jiǎn)單的壓縮,再生成其MD5碼,這將增強(qiáng)防抄襲機(jī)制的有效性,但是其冗余的步驟對(duì)系統(tǒng)的開(kāi)銷(xiāo)需要系統(tǒng)管理員納入考慮范圍。
四、總結(jié)
該系統(tǒng)的實(shí)現(xiàn),很快地運(yùn)用到現(xiàn)實(shí)的學(xué)習(xí)生活中去,有效的考核學(xué)生的真實(shí)水平,促使學(xué)生更好的學(xué)習(xí)計(jì)算機(jī)知識(shí),強(qiáng)化學(xué)生的實(shí)踐能力,減輕了老師在教學(xué)管理上的負(fù)擔(dān);還使學(xué)生將來(lái)能更好地適應(yīng)快速發(fā)展的信息化時(shí)代,進(jìn)一步發(fā)揮出計(jì)算機(jī)網(wǎng)絡(luò)對(duì)當(dāng)今教育領(lǐng)域甚至其他行業(yè)的突出貢獻(xiàn)。
參 考 文 獻(xiàn)
[1] 管賦勝.基于集群技術(shù)的源代碼自動(dòng)評(píng)測(cè)系統(tǒng)研究[J].硅谷, 2009(16):48—49.
[2] 游春暉.基于語(yǔ)義情感傾向的文本相似度計(jì)算[D].西安:電子 科技大學(xué),2008.