孔欽 葉長青 吳淳陽 姚斯源 王家輝



摘 要:Online Judge在線評測系統作為提高學生基礎編程能力的重要途徑之一,在當今十分強調編程能力的社會背景下顯得尤為重要。由于大一新生普遍存在編程能力不足的問題,在分析目前主流OJ平臺的基礎上,設計并實現了針對學校情況定制的OJ在線評測系統,為程序設計賽事培訓與課程實踐提供練習平臺。在詳細描述OJ平臺主要功能、技術架構及具體實現方案的同時,也重點強調了對于實現系統安全性和并發性方面的優化與創新。
關鍵詞:在線測評;程序設計;教學跟蹤
DOI: 10. 11907/rjdk.192263
開放科學(資源服務)標識碼(OSID):
中圖分類號:TP319
文獻標識碼:A
文章編號:1672-7800(2020)001-0172-04
0 引言
在線評測(Online Judge,簡稱OJ)平臺是一個基于WWW的服務器端軟件系統,主要功能包括:用戶注冊與管理、題庫管理、在線提交與實時評測、網上考試、題目討論、郵件服務等[1]。早期的OJ平臺以競賽為目標,能夠對用戶提交的程序進行“黑盒判定”并自動生成判題結果。傳統Online Judge系統主要針對解題訓練,并不針對課程教學輔助場景[2]。C語言是大學一年級學生學習計算機程序設計時廣泛使用的一種語言,通過學習C語言課程,學生不僅可以掌握該高級程序設計語言的語法與語義,還可以掌握結構化程序設計“自頂向下、逐步求精”的思想及方法、常用算法及實現技術,以及分析與解決實際問題的語言應用能力[3]。將Online Judge加入到日常教學中輔助教師授課,將會幫助學生更加容易地掌握C語言。因此,本校自主開發一個OJ平臺,不僅用于程序設計賽事培訓,還可將其用于平時的實驗教學中,通過精心設置的多組測試用例反映出程序問題所在,方便教師及時找出漏洞(BUG)并作出解答,也便于學生課后復習與鞏固。在教學領域,OnlineJudge可以彌補人工評判的缺點,有效減輕教師負擔,使評測更加公平、合理,學生在課內未完成的實驗還可以利用系統在課外時間完成,從而使整個實驗過程得到延伸[4]。同時也能增強師生間的互動交流,提高教學質量,形成新的程序設計實驗課教學模式。
Online Judge也為學生創造了一個模擬競賽環境的平臺。眾所周知,程序在線評測是ACM國際大學生程序設計競賽(ACM /ICPC)采用的訓練與比賽評測方式[5],ACM在線評測系統是該項比賽的評判事務處理平臺,也是一個基于B/S結構的多用戶在線系統,允許用戶在線提交自己的解題代碼,系統自動編譯運行給出裁判結果,并根據用戶解題數及用時進行排名[6]。但剛接觸編程的學生能力不是很強,如果一開始就讓他們到各大學公網上的在線裁判系統上進行練習,無疑會打擊其對編程的興趣及積極性,因此必須有一個循序漸進、由淺入深的練習系統[7]。
1 研究背景
1.1 主流OJ介紹
國內著名題庫有北京大學題庫、浙江大學題庫、電子科技大學題庫、杭州電子科技大學題庫等,國外題庫包括烏拉爾大學題庫、瓦拉杜利德大學題庫等[8],以下舉例分析一些現有的知名Online Judge。
(1)POJ。POJ是北京大學ACM/ICPC在線評測系統( Peking University Judge Online for AC M/ICPC)的簡稱,也是許多ACMer最開始使用的OJ平臺。POJ以題目優質著稱,幾乎涵蓋了編程學習的各類經典算法。北大為該系統的正常運行提供了硬件與網絡資源保障,所以其可以全天不間斷地為全球程序愛好者提供服務[9]。
(2)ZOJ。ZOJ是浙江大學在線評測系統(Zhejiang Uni-versity Online Judge)的簡稱,是國內最早也是最知名的OJ,有很多高手在上面練習。特點是數據比較刁鉆,經常會有意想不到的邊界數據,十分考驗答題人思維的全面性[10]。ZOJ相較于POJ,在首頁上有一個News項目,可以看到ZOJ的最新動向。ZOJ非常簡潔、直觀,同時其前端界面也比POJ更加整齊、美觀。
(3)hihoCoder。相較于以上兩個OJ平臺,hihoCoder能提供更好的用戶體驗。其有著最佳界面,并支持多種登錄方式。其宣傳語是“通過高水平的程序設計比賽提升編程水平,得到名企Offer”,這句話體現了OJ平臺的核心思想。hihoCoder主頁正下方即展示了3個正在進行或將要進行的程序設計比賽,這些比賽都是由名校或名企舉辦的。平臺所有題目都以中文形式呈現,并且給出算法使用提示,還注明了難度,讓用戶能夠更加靈活地使用題庫。它還有欄目“hiho -下”,可推送“每日一題”,讓編程成為hihoCoder用戶的生活習慣。hihoCoder擁有自己的討論社區,讓用戶能在社區里相互交流、探討。因此,該平臺功能十分強大,而且為用戶考慮得非常全面。
1.2 0J平臺功能分析
本校的Online Judge平臺設計目的主要有兩點:一是為學校提供一個獨立的擁有龐大題庫的在線測試平臺以輔助教學實踐與賽事培訓,以學生為中心,幫助學生樹立“算法”思想[11]。用戶瀏覽網頁選擇題目,通過網頁提交代碼,由服務器端調用編譯程序對用戶提交的程序進行編譯,然后由評測程序進行評判,并返回相應結果到網頁上供用戶查看[12];二是因為傳統采用實驗室FTP客戶端提交作業的方式,效率十分低下,且不利于學生利用課外時間練習,以及學生與教師之間的交流,影響了教學效果,因此通過搭建一個在線測試平臺以實現教師對學生練習情況的跟蹤監督。
通過實現以上兩個核心功能可達到以下目的:①計算機類競賽訓練。為藍橋杯、ACM等程序設計競賽提供一個訓練平臺,通過提供一個完善且龐大的題庫,讓學生可通過該平臺不斷鍛煉自己的答題水平,提升競賽能力,為將來在競賽中取得優異成績打下良好基礎;②教學實驗測試。為教學實驗課提供一個功能齊全的實踐平臺,由教師提供課程需要的實驗題目,系統即可快速制作一個實驗題庫。教師能夠根據自己所教科目創建每次實驗課內容,并按照不同難度設置每章節題目。該方式解決了目前學生在實驗課上只能通過FTP下載作業要求、上傳程序,教師也無法直接查看結果等諸多問題。
從程序設計跟蹤的角度,教師可通過系統查看最近幾日每日總體數據,包括學生總共提交次數、競賽題庫完成度、整個班或年級實驗完成情況等,避免了課程設計中代碼量較大,導致教師檢查代碼工作量大的問題[13]。學生用戶可通過個人中心查看自己答題信息與打卡進展,包括每個實驗、章節及每道題完成情況、通過數、正確率等重要指標信息。
從教學管理的角度,本系統可便于教師布置作業、管理實驗進度、控制教學進度、監督學生完成情況等。教師布置作業時可以設置截止時間,學生需要在截止時間之前完成,即使提交了作業,學生依然可以繼續復習作業中的題目并鞏固相關知識點。在講授課程時可以與本系統結合進行授課,例如教授C、C++、JAVA和C#等課程的教師可利用系統進行課堂在線程序的編寫,并利用系統的在線評分功能,及時展示出編程過程中可能存在的編譯錯誤及程序運行中的常見問題,為學生深入理解程序設計思想提供了一個更加直觀的平臺[14]。我校OJ平臺功能模塊如圖1所示。
2 0J平臺實現方案
2.1 網站設計
Online Judge是一種基于B/S結構的多用戶在線評測系統,允許用戶在線提交解題代碼,系統自動編譯運行并給出評測結果[15]。網站采用Vue+Spring Boot+MySQL框架進行系統開發。Vue和Spring Boot是當前主流的前后端框架,其中Vue是一套用于構建用戶界面的漸進式框架,采用自底向上增量開發的設計方式,是一種更加靈活的解決方案,構架更加簡單,適合開發人員快速掌握其全部特性并投入使用,還便于與第三方庫或既有項目整合[16],因此將其作為一個前端項目,與后臺邏輯分開部署,只需請求相應接口即可實現對應功能;使用undertow代替tomcat作為Web服務器,undertow與tomcat相比,并發狀態下差別不是很大,然而undertow負載能力明顯高于tomcat,擁有更高的吞吐量,同時結合ngmx技術實現反向代理與負載均衡;采用Linux作為服務器,提升系統的可操作性和可維護性。
2.2 判題核心
判題主程序是判題系統的核心子程序,其主要功能是負責接受與分派判題請求[17],實現機制是使用Linux系統自帶的gcc和g++進行編譯運行,通過C語言執行gcc、g++編譯命令,并將輸入的可執行文件放到指定目錄下。C語言的MySQL庫函數可以直接對數據庫進行修改,實時改變數據庫狀態。
2.2.1 編譯部分
對于C程序,完整的調用類似system(”/usr/bin/geclOOO.e -0 1000 -ansi -Wall -Wextra Im 2>/tmp/oj_ gcc_err.txt”),使用的gcc選項如表1所示[18]。
2.2.2 執行部分
為了解決學生在最初學習時會導致代碼進入死循環,以及有人惡意上傳危害服務器系統的代碼等問題,保證服務器的安全性,使判題系統能夠穩定運行,本文采用當今比較流行的Docker技術。
Docker是一個開源的應用容器引擎,讓開發者可以打包其應用及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。容器完全使用沙箱機制,相互之間不會有任何接口。
在環境搭建時,通過Dockerfile創建出適用于判題的Docker鏡像,可以自由地在Dockerfile中寫入安裝命令,方便以后針對其它語言進行判題。首先,在服務器上安裝gcc、g++、Java運行環境,在程序運行前先啟動一個容器,并將實際文件路徑映射到docker容器的虛擬路徑中,運行預先執行的命令,緊接著在“沙箱”中執行程序,最后將代碼輸出結果與測試結果相比較,即能獲得最后結果。
docker容器用完即銷毀,因而能完美地規避掉上面所提到的風險。倘若出現死循環的情況,則容器在運行一定時間后會因檢測到異常而自動關閉。對系統具有破壞性的代碼只會導致容器異常,而不會使服務器無法正常工作。
Docker命令:啟動一個名為OJ的容器將本機/root/Test文件夾下的內容映射到容器中的/Test下,執行一c之后的命令:
docker
run --rm --cap-add=SYS_PTRACE -u
oj -v/root/Test: /Test oj /bin/sh -e“cd /Test./a.out$1$2 $3 $4 $5 $6”
在進行判題時,首先通過pid()創建一個子線程,判題前需要對線程進行資源限制,以防止該線程出現。具體實現步驟如下:
1.while(1)的死循環
2.不停地malloc分配內存,占用地址空間
3.不停地創建子線程
通過int setrlimit( int resource,const struct rlimit *rlim);函數限定時間和空間
struct rlimit{
rlim_t rlim—cur; /*軟限制,當前限制*/
rlim_t rlim—max; /*硬限制,最大限制*/
};
通過判題,會根據判題結果返回不同信息,若通過則返回“通過”,若不通過,則會返回錯誤信息如“答案錯誤”、“編譯錯誤”、“超時”等。其中若存在編譯錯誤,返回信息中還會加入控制臺輸出的具體錯誤信息。判題流程如圖2所示。
兩個函數的resource參數取下列值之一:
RLIMIT AS
進程可用存儲區的最大總長度(字節)
RLIMIT CORE
core文件最大字節數
RLIMIT CPU
CPU時間最大量值(s)
RLIMIT DATA
數據段最大字節長度
RLIMIT FSIZE
可以創建的文件最大字節長度
RLIMIT LOCKS
一個進程可持有的文件鎖最大數
RLIMIT MEMLOCK -個進程使用mlock(2)能夠鎖定在存
儲器中的最大字節長度
RLIMIT NOFILE 每個進程能打開的最大文件數
RLIMIT NPROC
每個實際用戶ID可擁有的最大子進
程數
RLIMIT RSS
最大駐內存集的字節長度(resident set
size in bytes,RSS)
RLIMITSBSIZE
用戶在任一給定時刻可占用的套接字
緩沖區最大長度(字節)
RLIMIT_STACK
棧的最大字節長度
RLIMIT_VMEM
RLIMIT—AS的同義詞(Linux 2.4.22不
支持)
3 主要模塊介紹
3.1 學生實驗模塊
學生在課堂練習模塊(見圖3)中選擇課程后,可看到課程每個實驗完成情況和總體完成率。每個實驗作為一組,展示每個實驗截止日期以及該組中題目名稱,點擊題目即可進入答題界面。如果一個實驗所有題目都已完成,在頂部顯示完成標志,沒有完成則顯示未完成。
3.2 答題模塊
點擊題目名稱進入答題模塊,界面顯示題目難度及題目信息。提交答案之后,系統返回程序運行需要的時間與內存空間,以及程序編譯、運行結果(見圖4),以便學生針對錯誤進行修改。
4 網站優化
為了能夠在低成本條件下提供更加強大的性能,除之前提到的更換服務器外,還可以對Java啟動參數進行調整,更改JVM內存空間與堆的大小,使程序能夠承受更大壓力。因為docker內存消耗略大,可以將主要判題業務從后臺項目中剝離出來,部署在另一臺服務器上,形成分布式架構。
Spring Cloud是基于Spring Boot推出的一系列框架、組件的有序集合,簡化了分布式系統基礎設施開發[19]。通過Eureka注冊中心,將主要業務與其它業務一起注冊。使用Spring Cloud可以直接調用另一臺服務器的服務,相比之前都部署在一臺服務器上,可以大大減小服務器壓力。
5 結語
Online Judge系統作為計算機專業學生在程序設計初期的訓練平臺,有著十分重要的意義。本文在調研主流OJ平臺的基礎上,詳細描述了本校OJ平臺的功能模塊、技術架構及實現方案。在具體實現上,采用Vue+Spring Boot+MySQL流行框架,并借助undertow Web服務器的優越性與docker容器運行的安全性,有效提升了系統性能。未來可在其基礎上進一步添加競賽比拼、積分激勵等新功能,再與課程教學緊密結合,注重提升學生的實際動手能力,激發學生學習的主動性與創新性,鍛煉其編程能力,提高學生學習效率[20]。同時還可在賽事培訓、課程跟蹤、教學反饋、教學分析等若干教學管理環節中發揮更大作用,提高教學質量,形成程序設計學習閉環,以期為社會培養更多高質量的計算機專業應用型人才。
參考文獻:
[1]張麗萍,東升.程序設計類課程考核評價方法的改革與實踐[J].計算機教育,2010,110( 2):16-20.
[2] 羅英偉,汪小林,張正熠.編程網格:一個基于Online Judge的程序設計類課程教學輔助系統[J].教育與教學研究,2009(2):87-11.
[3]季曉慧,張玉清.C程序設計教學中的在線評測系統應用[J].電腦知識與技術,2014,10(7):1465-1466.
[4] 魯靜軒,孫晶,李元高.程序在線評側系統的設計與實現[J].硅谷,2008( 24):38-38.
[5]尤楓,史晟輝,趙瑞蓮.編譯程序在線評測系統的實現[J].實驗室研究與探索,2010,29( 12):69-77.
[6] 劉楠,孫國道,田賢忠.ACM在線評判系統設計與實現[J].計算機時代,2010(2):34-38.
[7] 王騰,姚丹霖.Online Judge系統的設計開發[J].計算機應用與軟件,2006, 23( 12): 129-137.
[8] 熊茜,雷亮,許莎,等.基于在線判題系統的C語言實驗教學改革[J].重慶科技學院學報(社會科學版),2015( 10):67-69.
[9] 李文新,郭煒.北京大學程序在線評測系統及其應用[J].吉林大學學報(信息科學版),2005( 23):170-177.
[10] 蔡崇超.基于Web的在線判題系統設計與實現[J].軟件導刊,2016.15(3):107-109.
[11] 肖瀟,賀細平.C語言程序設計教學探索[J].計算機教育,2011(5):65-68.
[12]莊奇東,王鍵聞,張楠,等.Online Judge系統的優化[J].計算機系統應用,2011,20(8):115-121.
[13] 陳湘驥,徐東風,楊秋妹.在線評判在C語言課程設計教學中的應用[J].計算機教育,2010(3):97-100.
[14] 喬少杰,楊燕,葛永明,等.基于B/S架構的多用戶在線程序評判系統設計與實現[J].計算機工程與科學,2011,33(Al):58-61.
[15]何迎升,羅強.Online Judge評判內核的設計與實現[J].吉首大學學報,2010,31(6):37-38.
[16] 朱二華.基于Vue.is的Web前端應用研究[J].科技與創新,2017( 20):119-121.
[17]韓志科,王貴,韓俊杰.基于API自動測試的程序設計在線判題系統的研究與實現[J].計算機系統應用,2008,17( 7):9-13.
[18] 楊志偉,曾艷姍.基于Linux的ACM在線評測系統研究[J].計算機與現代化,2010(6):166-169.
[19] 王方旭.基于Spring Cloud和Docker的微服務架構設計[J].中國信息化,2018(3):53-55.
[20] 王娟.基于Online Judge的高級語言程序設計課程教學改革[J].吉林省教育學院學報,2012,28(10):85-87.
(責任編輯:黃健)
基金項目:全國高等院校計算機基礎教育研究會計算機基礎教學研究與改革項目(AFCEC-2016-18);南京大學金陵學院校級教改項目( 0010521816)
作者簡介:孔欽(1983-),女,碩士,南京大學金陵學院信息科學與工程學院講師,研究方向為計算機應用、數據分析。