肖紅玉,賀 輝,陳紅順
(北京師范大學珠海分校 信息技術學院,廣東 珠海 519087)
在線評測教學輔助系統設計
肖紅玉,賀 輝,陳紅順
(北京師范大學珠海分校 信息技術學院,廣東 珠海 519087)
為滿足程序設計類課程實驗教學及程序設計競賽的需要,對國內外現有的在線評測系統進行研究。以ACM/ICPC競賽模式為藍本,采用Python、Mysql、Django 1.8、HTML5、jQuery 1.11、Bootstrap 3.5、Nginx 1.8等技術,設計并實現了基于RabbitMQ高級消息隊列和多級安全沙盒的在線評測輔助教學系統。基于Celery并行分布式框架,解決了系統大規模評測的并發性需求,可根據評測負載動態調整評測節點個數。系統具有高容錯性,個別評測節點的意外故障不影響系統整體運行。通過Linux用戶權限機制、全虛擬化技術、Linux Container (LTX)和setUID實現的多級安全沙盒,保證了評測環境的公平性和安全性。系統主要為日常實驗教學代碼評測而設計,共有4個角色,與面向競賽的評測系統相比,增加了教學管理模塊、作業管理模塊、統計分析管理模塊。系統已經成功應用在C/C++/Java/數據結構等課程的日常實驗教學中。運行結果表明,該輔助教學系統對促進教學質量、提升學生學習興趣非常有幫助。
在線評測;實驗教學;教學輔助系統;沙盒
C/C++/Java/數據結構等程序設計課程是高校理工類專業的核心課程。課程的培養目標是培養學生掌握程序設計的思想和方法,掌握基本的程序設計過程和技巧,初步具備分析問題和利用計算機求解問題的能力[1]。這類課程對實踐開發能力、邏輯性思維要求比較高[2]。提高學生實踐開發能力最有效的方法就是重視實驗教學,督促學生在課堂內外編寫大量代碼。在線判題系統可以實時評判學生提交的源代碼,不僅大大減輕了教師的負擔,對提高學生學習熱情也很有幫助[3]。ACM國際大學生程序設計競賽(ACM/ICPC)是目前全球公認水平最高影響最大的編程賽事,許多高校開發了基于ACM/ICPC的程序設計在線評測系統[4-9]。例如,孟學多等[3]基于多核平臺實現了在線判題系統;蔣輝等[10]從滿足學生實踐的角度設計了在線評測系統;莊奇東等[11]從頁面和數據庫緩存、服務器架構等方面討論了在線判題系統的優化;黃洪波等[12]討論了大規模程序評判系統的設計與實現。但這些系統主要為ACM比賽服務,不適合直接用于課程實驗教學。也有些高校以ACM/ICPC Online Judge (OJ)系統為藍本設計了在線評測教學輔助系統[13]。
文中對現有的在線判題系統進行了研究分析,綜合各系統的優缺點,結合我校程序設計類課程實際教學需要,設計了一個面向實驗教學兼顧競賽的在線評測教學輔助系統。與面向比賽的OJ系統相比,教學輔助系統增加了課程管理、作業管理子系統和教學中心。此外,設計了4級沙箱安全機制保證系統的安全,基于RabbitMQ和Celery設計了生產者-消費者模型的高效并發機制。
基于Linux/Windows、Python、MySQL、Django 1.8、Nginx 1.8、HTML5+jQuery 1.11+Bootstrap 3.5技術,以ACM/ICPC競賽模式為藍本,設計并實現了在線評測教學輔助系統。系統可對用戶提交的C/C++/Java源代碼進行編譯、運行、實時評測打分并給出明確的評判結果,為老師提供了課程管理、排課管理、題庫管理、作業管理、助教管理、教學資源管理等功能,是日常教學、考試、競賽的一體化平臺。學生借助該平臺可以完成日常課程作業、查看用戶排名、站內檢索、下載教學資源等。
系統采用多層分層架構,分為表現層、業務邏輯層、評測模塊、數據訪問層。層間關系如圖1所示。

圖1 系統體系結構
表現層:接收用戶提交的數據,并以圖表的形式向用戶展示請求的數據,主要用于實現與用戶的交互。
業務邏輯層:包含應用于業務對象的規則,系統的業務規則在這部分編寫,主要完成以下功能:完成系統業務規則和邏輯的實現,從表現層接受用戶請求,根據業務規則處理請求,通過數據訪問層完成與數據庫的交互任務,將處理結果返回給表現層。
數據訪問層:主要完成與數據庫的交互即CRUD(Create、Retrieve、Update、Delete)操作。數據訪問層為業務邏輯層提供服務,根據業務邏輯層的要求從數據庫中提取數據或者修改數據。
評測模塊:對學生提交的程序代碼進行編譯、運行。如果源代碼在編譯過程出現錯誤,直接返回CE(Compile Error),結束判題。編譯成功,則讀取預定的輸入數據并運行程序,獲取程序運行時間、內存和CPU使用情況,如果發現這些數據超出題目的設定值,則結束判題,并給出對應的提示。如果程序順利執行,則把輸出重定向到臨時的輸出文件中,并和預先給定的標準輸出進行對比。兩個文件的內容一模一樣則判定學生提交的代碼是正確的,并返回Accept;否則返回WA(Wrong Answer)。評測過程如圖2所示。

圖2 代碼評測流程
系統共有管理員、老師、學生、助教4種角色,不同角色擁有不同的操作權限,系統功能結構框圖如圖3所示。

圖3 系統功能框圖
管理員:系統管理和權限管理子模塊是管理員獨享的子模塊,系統管理子模塊的功能包括:設置系統判題機是否啟用、網站名稱等初始參數設置;用戶管理;網站公告管理。權限管理子模塊對各用戶的使用權限進行設置和管理。
教師:教師是使用系統的主體,是系統使用的引導者和督促者,擁有除系統管理子模塊之外的其他所有功能子模塊。
(1)題目管理子模塊:該子模塊的功能主要有:題目分類管理,目前系統設置了4級分類;題目的CRUD管理,增加題目時需要輸入題目標題、題目描述、輸入輸出描述、樣例輸入輸出、時間和內存限制、題目提示和參考程序,其中時間限制、內存限制可以采用默認值;可以設置是否隱藏題目,被隱藏的題目只對老師可見;本人發布的題目只有自己可以修改、刪除,其他老師只能查看、布置作業時選用;每道題都可以查看評測歷史。
(2)測試數據管理子模塊:該模塊主要完成測試輸入輸出數據的CRUD操作。為了提高系統的易用性,還設計了自動生成測試輸出數據的功能。每組測試數據可以靈活地設置分值以及是否啟用。
(3)教學管理子模塊:教學中心包括課程管理(創建、編輯、刪除課程)、課程通知(發布、修改、刪除課程通知)、教學資料(上傳、刪除教學資料)、排課管理(設定上課的起止教學周、上課的具體時間、生成選課碼)、學生管理(批量導入上課學生名單、添加單個或多個、批量設定學生上課時間、學生調課管理)、助教管理(添加、修改、刪除助教)。
(4)作業管理子模塊:發布作業、修改作業、批改作業、刪除作業。發布作業時首先輸入作業基本信息(作業名稱、最高成績、備注、設置評測語言),接下來從題庫中選擇題目添加到作業中,設置每道題的分值以及是否必做,設置作業的訪問權限,人工批改作業(可批量修改),作業代碼打包下載。
(5)統計分析子模塊:作業統計分析、個人刷題情況統計分析、全站排行榜等。
學生:學生是使用系統的另一大主體,學生的主要功能是提交代碼以及各種查看功能,包括查看評測結果、題目詳情、課程公告、網站公告、教學資料、作業、排行榜、統計分析結果等。
采用MySQL數據庫,系統運行過程中產生的所有數據都需要持久化保存到數據庫中。根據系統功能需要,共設計了39張表。考慮到文章篇幅,只列出了作業管理和教學管理2個子模塊的相關表,各表含義如表1所示。

表1 數據庫設計
提交的程序是用戶編寫的,可能有危害系統安全的行為,常見的惡意行為有[12]:
(1)使用非法指令停止系統,如在提交的代碼中嵌入shutdown等指令;
(2)試圖刪除系統關鍵文件;
(3)大量占用硬盤資源,在代碼中反復執行寫文件操作,試圖消耗掉服務器的硬盤空間;
(4)可能耗盡服務器CPU資源的死循環;
(5)申請大量內存或線程;
(6)故意出錯,嘗試暴露檢測代碼。
以上惡意行為不一定是故意的人為攻擊,可能是用戶不成熟的編程水平造成的。作為輔助教學系統,用戶大部分是大一剛接觸編程的學生,死循環是很常見的錯誤之一,對此在判題機內部對運行時間和內存占用會進行判斷,如果超過了題目的預設值,則啟動進程將此評測任務kill并釋放其占用的資源。
對于資源濫用之外的不安全行為,提出一種多級安全Sandbox(沙盒)的權限控制機制。Sandbox在計算機領域主要指一個嚴格受控的環境,程序在該環境運行時的狀態、所使用或訪問的資源都受到嚴格的記錄和控制。Sandbox根據指令對全系統進行模擬,對程序的訪問資源、執行環境按照規則賦予一定的訪問權限。程序只能在Sandbox里面進行相關操作,限制了惡意程序的危害,每個程序在自己受保護的Sandbox之中運行,不會影響到其他程序。同樣,這些程序的運行也不會影響操作系統的正常運行[12,14]。
文中提出的多級安全Sandbox機制共分4層,分別是setUID Sandbox、Linux Container容器(LTX)、全虛擬化虛擬機和操作系統。為了保證服務器的安全,評測機不是直接運行在操作系統之上,而是運行架設在操作系統之上的全虛擬化層。一方面用戶提交的shutdown、刪除文件等非法操作不會影響底層真實系統的正常運行;另一方面,全虛擬化與物理硬件和服務器操作系統隔離,為評測機提供了完整的運行環境,也便于虛擬機的無縫遷移和部署。全虛擬化帶來安全保障的同時帶來了對服務器硬件結構和運行性能的高要求,鑒于評測機需要的系統資源不多,在生產環境中將服務器的計算資源劃分給多個評測機實例。出于防止相互干擾、易于部署等因素的考慮,各評測機之間需要互相隔離,在考察了相關文獻后,使用LXC技術實現各評測機之間的隔離。LXC是操作系統級別的輕量級虛擬化手段[15],提供了在單一可控主機節點上支持多個相互隔離的服務器容器同時執行機制。LXC提供了一個擁有自己進程的和網絡空間的虛擬環境,與傳統的硬件抽象層次的虛擬化技術相比,具有更小的虛擬化開銷、快速部署、不用單獨為內核打補丁等優勢。評測機運行在各自的LXC環境中,相互獨立、互不干擾。
用戶提交的源代碼可能對服務器造成攻擊,所以編譯代碼不能跟評測機放在同一個運行環境,以免源代碼的缺陷影響評測機的工作。為了保證評判結果的公正和客觀,所有源代碼要保證運行環境和策略完全一致,所以在每個源代碼被評測前,評測機需要為它準備Sandbox運行環境,并且該環境是可重入的。全虛擬化和操作系統級虛擬化的初始成本較高,考慮到能耗比和實際運行的需求,設計了基于Linux的setUID Sandbox。在Linux中每個進程都會有uid,不同uid的進程之間相互隔離,各自都有自己獨立的權限,互不干擾。對于不可信的程序,在啟動該程序時可以為其分配一個隨機uid。基于上述原理,文中將被源代碼降權為隨機用戶,從而實現了源代碼與其他進程的相互隔離。
評測機編譯和運行用戶提交的源代碼需要創建和銷毀子進程,這個過程需要花費一定的時間。為了評判結果的公平,1個評測機1次只執行1個評測任務,并使用單個邏輯處理器,為了加速系統的響應時間、提高系統的并發性,采用RabbitMQ-Celery設計了基于生產者-消費者模型的并發機制,以滿足大規模教學評測的吞吐量需求。
RabbitMQ是基于AMQP(Advanced Message Queuing Protocol,高級消息隊列協議)的開源消息隊列系統。RabbitMQ可以根據消費者對消息的處理情況靈活調整消費者權重,將消息優先分配給處理時間短的消費者,從而實現系統的負載均衡。Celery是基于Python開發的分布式任務隊列,支持使用任務隊列的方式在分布的機器/進程/線程上執行任務調度,總體架構包括4部分:任務生產者、任務代理、任務消費者(評測機)和任務執行結果存儲。在文中,生產者是與用戶交互的網頁前端,消費者是評測機,任務代理由RabbitMQ負責。用戶提交的源程序封裝成RabbitMQ消息,在封裝時附上相關的消息頭,如使用的編程語言、評測任務類型等。RabbitMQ在分配消息時根據已聲明的任務調度器投遞給對應的評測機,所以,不同的評測機可支持不同的編程語言或者評測任務。從而,在實際評測時可根據系統具體的負載情況,動態地增減對應編程語言或評測任務的評測機,適應系統用戶規模的變化。另外,Celery支持分布式部署和橫向擴展,可以在多個節點增加評測機的數量來增加系統的高可用性和并發性。
平臺目前已是我院程序設計類課程(C/C++/Java/數據結構)日常實驗教學的輔助平臺,平臺訪問地址為https://oj.bnuz.edu.cn/,已建設實驗題庫5個:C程序設計、數據結構、Java程序設計、C++程序設計、ACM日常訓練。圖4是某題(題號是1275)的評測統計情況截圖。目前,系統平均在線活躍用戶數約2 000,已成功完成評測任務幾十萬次,這些數字還將隨著系統的持續運行不斷增長。

圖4 實際應用部分截圖
以ACM/ICPC在線評測系統為藍本,設計了程序設計實驗教學在線評測輔助系統。系統對學生提交的程序源代碼進行實時評測,具有人工評判所無法比擬的優點。
系統有別于傳統意義上面向比賽的OJ系統,擁有更適合課程教學的教學中心和作業管理子系統,對程序設計類課程如C/C++/Java/數據結構等的實驗教學起到了很好的輔助作用,有效地提升了教學質量。文中設計的基于setUID、LXC、全虛擬化、Linux操作系統權限機制的多級沙箱模型,不但可以隔離非受信的源代碼,而且降低了維護成本,兼顧了系統運行效率。為了適應大規模并發評測的需求,設計了基于RabbitMQ-Celery的生產者-消費者并發機制,在實際評測時系統可自動調整評測機的數量以適應不同規模的教學需求。系統已成為我院程序設計課程輔助教學的有利工具,對提高教學質量、提升學生學習興趣很有幫助。
[1] 何欽銘,顏 暉,蘇小紅,等.“程序設計基礎”課程教學實施方案[J].中國大學教學,2010(5):62-65.
[2] 葛文庚,藺 莉.程序設計基礎課程教學模式研究與設計[J].電子設計工程,2012,20(4):44-46.
[3] 孟學多,俞雪永,顏 暉.基于多核的在線判題系統的設計與研究[J].計算機時代,2011(7):7-9.
[4] 韓建平,劉春英,胡維華.“課內外貫穿,競賽教學融合”的程序設計教學模式[J].實驗室研究與探索,2014,33(6):169-171.
[5] 劉 楠,孫國道,田賢忠.ACM在線評判系統設計與實現[J].計算機時代,2012(2):34-35.
[6] 謝 迪,李文新,郭 煒.“百練”:一個程序設計技能訓練與水平測試平臺[J].合肥工業大學學報:社會科學版,2008,22(4):172-176.
[7] 張浩斌.基于開放式云平臺的開源在線評測系統設計與實現[J].計算機科學,2012,39(11A):339-343.
[8] 曾棕根.源程序在線評測系統技術改進[J].計算機工程與應用,2011,47(4):68-71.
[9] 車明洙,紀洪波.一種基于ACM程序設計競賽在線評測系統解決方案[J].微型機與應用,2010(4):11-13.
[10] 蔣 輝,汪大菊.在線評測系統的設計與實現[J].計算機與現代化,2012(2):111-115.
[11] 莊奇東,王鍵聞,張 楠,等.Online Judge系統的優化[J].計算機系統應用,2011,20(8):115-121.
[12] 黃洪波,宋鴻陟,彭紅星,等.大規模程序評判系統的設計與實現[J].計算機工程與設計,2016,37(3):825-831.
[13] 韓君澤,鐘 美,劉東升.程序設計在線評測輔助教學系統的設計與實現[J].內蒙古師范大學學報:自然科學漢文版,2010,39(5):473-476.
[14] 陳丹偉,唐 平,周書桃.基于沙盒技術的惡意程序檢測模型[J].計算機科學,2012,39(6A):12-14.
[15] 吳佳杰.基于LXC的Android系統虛擬化關鍵技術設計與實現[D].杭州:浙江大學,2014.
DesignofOnlineJudgeTeachingAssistantSystem
XIAO Hong-yu,HE Hui,CHEN Hong-shun
(School of Information Technology,Beijing Normal Univerity,Zhuhai,Zhuhai 519087,China)
To meet the requirements of experimental teaching of programming courses as well as programming contest,the existing online judge teaching system at home and abroad are researched.On the basis of ACM/ICPC competition,an online judge assistant system is designed and implemented in accordance with the RabbitMQ advanced message queue and multi-level safe sandbox by use of Python,Mysql,Django 1.8,HTML5,jQuery 1.11,Bootstrap 3.5 and Nginx 1.8.The needs of concurrency in large-scale judge for system are satisfied based on Celery and the number of judging nodes is adjusted dynamically according to system load.The accidental failures of some nodes have no impact on system operation due to its high fault tolerance.The fairness and security in judging environment is guaranteed by multi-level safe sandbox realized by user permission mechanism of Linux,full virtualization,Linux Container and setUID.The system is mainly designed for judging code in experiment teaching,with four roles,and in comparison with judging system to competition,adds the three modules of teaching management,schoolwork management and statistic analysis.It has been successfully applied in daily experiment teaching like C,C++,Java and data structure.The operation shows that it is very helpful to promoting teaching quality and enhancing students’ learning interest.
online judge;experiment teaching;teaching assistant system;sandbox
2016-12-07
2017-04-13 < class="emphasis_bold">網絡出版時間
時間:2017-08-01
廣東省自然科學基金-博士啟動(2014A030310415);廣東省教育研究課題(GDJY-2015-C-b048)
肖紅玉(1976-),女,博士,副教授,研究方向為分布式水文系統、軟件工程。
http://kns.cnki.net/kcms/detail/61.1450.TP.20170801.1557.074.html
TP302
A
1673-629X(2017)11-0141-05
10.3969/j.issn.1673-629X.2017.11.031