何愛華,戚曉明 (蚌埠學院計算機科學與技術系,安徽 蚌埠233030)
隨著計算機技術的廣泛應用,程序設計能力正日益成為各專業(yè)學生的必備技能之一。程序設計能力的提高需要大量的編程練習和大量難度適宜的題目。除此之外,一些反饋信息,包括程序錯誤信息 (如語法錯誤,邏輯錯誤)和程序運行信息 (如運行時間,內(nèi)存使用量,代碼長度,使用語言,提交時間等)也是必不可少的。程序運行信息在線評測系統(tǒng)原是為適應競賽的要求而開發(fā)的,不僅有利于選拔編程競賽人才,更有利于提高學生對計算機程序設計的興趣,從而有利于程序設計的輔助教學。下面,筆者描述了在Linux操作系統(tǒng)中如何在 .net平臺下實現(xiàn)一個B/S結構的輔助教學系統(tǒng),以實現(xiàn)C/C++/VC等源代碼的在線自動評測。該系統(tǒng)采用黑盒測試技術,設計類似軟件功能測試的程序評判原理,改進以往評測系統(tǒng)限制程序運行時間精度不高、不能限制物理內(nèi)存等缺陷。學生通過上網(wǎng)在線提交他們的程序源代碼,由服務器對提交的程序自動進行評測,并對成績進行記錄和統(tǒng)計,不但可以提高評測的效率和正確率,而且可以極大地減輕教師的勞動強度,縮短了考試或競賽環(huán)節(jié)的周期,減少了人為的錯誤,學生的程序和評測結果都給予保留,這樣很容易就能夠查看成績、排名和統(tǒng)計數(shù)據(jù)。
系統(tǒng)采用B/S三層架構。表示層是用于與用戶交流,引導用戶操作,并反饋操作結果。業(yè)務邏輯層負責實現(xiàn)系統(tǒng)各模塊的功能邏輯,處理數(shù)據(jù),數(shù)值計算,邏輯檢查,調(diào)用數(shù)據(jù)庫接口維護數(shù)據(jù)。數(shù)據(jù)訪問層用于對數(shù)據(jù)庫的具體增加、刪除、修改的操作。3層架構方便了后期維護與二次開發(fā),哪里需要修改就修改哪里,各層之間各自獨立,實現(xiàn)了責、權、利分離。
系統(tǒng)的開發(fā)基于ASP.net,控制邏輯使用C#語言編寫,數(shù)據(jù)庫采用SQL Server 2005。
系統(tǒng)主要角色有學生、普通用戶、教師、題庫管理員、系統(tǒng)管理員,分為教師作業(yè)發(fā)布和學生作業(yè)提交模塊以及學校內(nèi)外練習和比賽模塊2大主要模塊。
根據(jù)系統(tǒng)要求,系統(tǒng)主要由以下數(shù)據(jù)表組成:學生表包括學號、姓名、性別、E-mail、電話號碼、班級號、學校名;普通用戶表包括用戶號 (用戶名)、密碼、E-mail、電話號碼;教師信息表包括教師工號、密碼、名字、職稱、所在學校;班級信息表包括班級號、學校名;教師班級聯(lián)系表,包括教師工號、教授課程號、教授班級號;管理員信息表包括管理員號、密碼、權限;課程表包括課程表和課程名;項目表包括項目號、項目名稱、項目介紹、項目開始時間、結束時間、項目狀態(tài)、是否需要申請、課程號 (外碼)、題目數(shù)量;題目信息表包括題目號、題目標題、題目的詳細描述、輸入描述、輸出描述、輸入樣例、輸出樣例、內(nèi)存限制、運行時間限制、權值、總提交次數(shù)、總正確次數(shù)、項目號等;題目提交信息表包括用戶號 (學生學號/普通用戶號)、題目的編譯號、題目號、程序使用的語言、提交次數(shù)、代碼長度、提交結果、使用內(nèi)存、使用時間、編譯錯誤信息、源代碼等。
2.2.1 教師作業(yè)發(fā)布和學生作業(yè)提交模塊
圖1 教師作業(yè)發(fā)布和學生作業(yè)提交結構圖
該模塊分別設計教師模塊、學生模塊、系統(tǒng)管理員模塊、題庫管理員模塊等,并定義出了每個子系統(tǒng)之間的接口。模塊結構圖如圖1所示。
1)系統(tǒng)管理員 (教師的作業(yè)發(fā)布和學生作業(yè)的提交系統(tǒng)) ①課程管理。針對學校相關編程課程的需要進行課程的錄入以及修改刪除功能。同時為課程分配教師和該課程的學生 (學生一般是由老師錄入)。②教師管理。針對學校教師的情況,進行教師信息的錄入以及修改刪除功能,查看教師對應的課程。③學生管理。針對學校學生的情況,進行學生信息的錄入以及刪除修改功能,查看學生的具體選修的課程情況。
2)教師角色 ①布置作業(yè)。作業(yè)包括課程名、題目名稱、題目主干、時間限制、內(nèi)存限制、布置日期、截止日期。②查看作業(yè)。查看信息包括題目名稱、學號、題目狀態(tài)、耗時量、內(nèi)存占用量、提交日期。③公布答案。答案包括題目名稱、答案內(nèi)容 (注:答案在截止日期后才能被顯示)、耗時量、內(nèi)存占用量。④學生信息。學生信息包括學號、班級、作業(yè)正確率、聯(lián)系方式、未完成的作業(yè)。⑤題庫管理。題庫包括已有題目的各類信息,提供增加題目、刪除題目和公布答案等各項鏈接,以及查看對應題目的正確率,答對題目學生名單。⑥學生管理。針對所教班級的學生,進行學生信息的錄入和刪除。
3)學生角色 ①個人信息編輯功能。昵稱、密碼、郵箱、手機號碼等的信息修改。②查看作業(yè)。老師布置作業(yè)查看、完成和未完成題目查看。③提交作業(yè)。將源代碼粘貼至對應的提交窗口進行提交,對同一道題目可以多次提交,作業(yè)提交與作業(yè)編譯。④查看作業(yè)結果。如果題目已過期,則可以看標準的答案。同時可以觀看自己提交作業(yè)的正確率排名等情況。⑤比賽的報名和參賽。
4)題庫管理員 (與教師角色有部分重復) 包括題庫的增加、修改、刪除,以及查看對應題目的正確率,答對題目學生名單。
2.2.2 學校內(nèi)外比賽、練習系統(tǒng)模塊
該模塊主要實現(xiàn)學生競賽和平時模擬練習功能,模塊結構圖如圖2所示。
1)系統(tǒng)管理員 ①賽事管理。發(fā)布比賽,選擇比賽的題目。②用戶管理。對比賽管理員、題庫管理員、普通用戶的管理。③公告新聞的管理。發(fā)布比賽信息,公布比賽結果。
2)比賽管理員 ①發(fā)布比賽信息。②審核參加比賽的用戶。③從題庫中選擇比賽的題目。④對比賽的相關統(tǒng)計。
3)題庫管理員 添加修改刪除題庫中的題目。題庫包括:練習所需的題庫,作業(yè)題庫,比賽所用題庫。
4)普通用戶 ①平時題庫練習。②申請參加比賽。③參加比賽。
圖2 學校內(nèi)外比賽、練習系統(tǒng)結構圖
3.1.1 在asp.net中調(diào)用可執(zhí)行文件
評判過程中,需要2次調(diào)用可執(zhí)行文件,一次是調(diào)用編譯器手動編譯源代碼,一次是調(diào)用生成的可執(zhí)行文件。在C#中的方法是System.Diagnostic.Process.Start,即創(chuàng)建一個進程。然后設置進程相關信息。
3.1.2 用命令行方式編譯源程序
對于用C++語言編寫的源程序,可用GCC編譯器 (Linux下最常用的),它的編譯基本行命令是g++-o file file.cpp,執(zhí)行可執(zhí)行文件的行命令是./file。
C文件類似,編譯基本行命令是:gcc-o file file.c,執(zhí)行可執(zhí)行文件的行命令是./file。
若使用VC6.0自帶的編譯器cl.exe編譯C或C++文件,首先運行cl.exe所在的文件夾里面的批處理VSVAR32.BAT,再使用cl命令行。
3.1.3 重定向輸出到文件
該系統(tǒng)以子進程方式運行編譯后的用戶程序,需要在非鍵盤交互方式下將輸入數(shù)據(jù)提交給用戶程序,并將運算結構和運行錯誤捕獲,這就需要將編譯的結果信息重定向到文件,以備讀取,給客戶端顯示。C#中 “>”為重定向符,語法如下:
p.StandardInput.WriteLine(“cl”+SrcPath+ “>”+TextPath);//“>”:文件重定向
將編譯結果寫入指定路徑的.txt文件中,詳細的錯誤信息可以從中讀取。
3.2.1 源代碼評判原理
系統(tǒng)采用數(shù)據(jù)驅動方式,測試時只需評判輸入的數(shù)據(jù)和確定的輸出數(shù)據(jù)即可,不必考慮源程序的具體內(nèi)容和算法。該系統(tǒng)實際運行中,待測源程序從控制臺輸入和輸出,提交程序時同時設置時空閾值,以便超限時終止程序的執(zhí)行并置錯誤標志。評判程序通過系統(tǒng)調(diào)用編譯后的可執(zhí)行文件 (二進制文件)為子進程,同時建立通向該子進程的標準輸入輸出管道,通過該管道寫入待測程序的標準輸入空間,待測程序讀到數(shù)據(jù)后計算并輸出。該過程中,操作系統(tǒng)在評判程序的控制下監(jiān)控待測程序進程的時空數(shù)據(jù),若超過了時空閾值則終止待測進程并通知評判程序,將程序運行錯誤信息寫入到重定向的錯誤輸出文件中,最后分析輸出文件中的數(shù)據(jù)是否和標準答案數(shù)據(jù)完全一致,若一致則證明源程序是正確的。標準答案通常以正則表達式形式給出,以文本文件形式保存。
在黑盒測試方法中,采用窮舉輸入方法,輸入數(shù)據(jù)通常由多組測試數(shù)據(jù)構成一個數(shù)據(jù)集,數(shù)據(jù)集包含若干組典型測試數(shù)據(jù)和全部邊界測試數(shù)據(jù)。測試流程圖如圖3所示。
3.2.2 限制程序運行時間
限制運行時間主要用來防止程序出現(xiàn)死循環(huán),避免CPU資源過度開銷。系統(tǒng)通過進程管理的方法將程序運行時間最少限制到1ms。限制程序流程圖如圖4所示。進程管理的核心是進程的執(zhí)行,內(nèi)核通過系統(tǒng)調(diào)用接口 (System call Interface,SCI)提供一個API來創(chuàng)建一個新進程 (frok()方法),停止進程 (kill()方法),并在它們之間進行通信和同步。進程管理實現(xiàn)了活動進程共享CPU的需求,內(nèi)核采用新型的調(diào)度算法,即O(1)調(diào)度算法,該算法可以在固定的時間內(nèi)進行操作,不管有多少個進程在競爭CPU。
圖4中,黑盒評測程序是父進程,它通過fork()方法生成子進程,在子進程中通過excelp()方法將用戶程序裝入子進程的內(nèi)存并開始獨立執(zhí)行,此過程中,父進程不斷檢測子進程是否死鎖,如果沒有死鎖則檢查相應進程信息中的運行總時間,若超時則通過kill命令結束子進程。獲取子進程的實際CPU時間是整個流程的重點,黑盒評測程序通過讀取Linux內(nèi)建的proc文件系統(tǒng)信息來檢測CPU的時間開銷和內(nèi)存開銷,proc文件系統(tǒng)是動態(tài)從系統(tǒng)內(nèi)核讀取的進程信息,它存在于內(nèi)存,應用以下命令來獲取進程信息:
進程信息中有進程開銷的用戶時間和內(nèi)核時間,目標程序的運行總時間= (stat第<14>項數(shù)據(jù)+第<15>項數(shù)據(jù))×10(ms)。
3.2.3 限制物理內(nèi)存
為了防止一些程序過度開銷物理內(nèi)存而導致系統(tǒng)運行過慢或服務器崩潰,常常需要內(nèi)存的使用量。該系統(tǒng)實現(xiàn)了子進程駐留內(nèi)存的直接限制,而傳統(tǒng)的方法通過設置rusage結構體只能限制子進程的虛擬內(nèi)存量。
限制子進程物理內(nèi)存的流程圖如圖4所示,在用戶程序進入子進程運行空間開始運行后,父進程不斷從proc文件系統(tǒng)檢測子程序的物理內(nèi)存,若超過規(guī)定的用量,則通過kill命令終止子進程的執(zhí)行。應用以下命令來獲取目標進程的內(nèi)存信息:
內(nèi)存信息有目標進程的內(nèi)存數(shù)據(jù),它是以頁為單位的整數(shù),一般一頁的大小為4KB,目標進程的內(nèi)存總量= (statm第<2>項×4)KB。
圖3 黑盒測試流程圖
圖4 父進程限制子進程運行圖
介紹了源代碼在線評測系統(tǒng)的設計思路和關鍵實現(xiàn)技術。不同于以往的已開發(fā)的在線評測系統(tǒng),該系統(tǒng)從技術上實現(xiàn)了物理內(nèi)存限制、高精度控制程序運行時間等難點,從功能上將系統(tǒng)定位在教學、自學、競賽培訓及競賽這4個方面。在教學方面,該系統(tǒng)可以用于學生作業(yè)的電子提交,提交后對源代碼進行動態(tài)測試,并給出評價結果,以代替教師的人工測評。在自學方面,因為有規(guī)模較大的數(shù)據(jù)庫支持,可以實現(xiàn)大容量的題庫鏈接,以供有興趣的學生進行進一步學習。在競賽培訓方面,該系統(tǒng)可以模擬競賽時的真實環(huán)境,從而使學生更快地進入比賽狀態(tài),提高比賽成績。在競賽方面,借助這一系統(tǒng),學校可以定期舉辦比賽,以激發(fā)學生們的編程熱情,營造良好的學習氛圍。
[1]曾棕根 .源程序在線評測系統(tǒng)技術改進 [J].計算機工程與應用,2011,47(4):68-71.
[2]王忠貴 .基于ASP.NET在線測試系統(tǒng)的設計與實現(xiàn) [J].計算機工程與設計,2007,28(5):1166-1168.
[3]楊晉吉,劉太根 .網(wǎng)絡課程中基于Web的在線測試系統(tǒng)的研究與實現(xiàn) [J].計算機應用研究,2007(2):230-232.
[4]王輝,胡新華,張廣泉,等 .集群式程序設計競賽評測系統(tǒng)設計與開發(fā) [J].計算機應用與軟件,2009,26(9):119-122.
[5]朱紹風,劉方愛 .教育網(wǎng)格中教學督導評測系統(tǒng)設計與實現(xiàn) [J].計算機技術與發(fā)展,2009,19(8):189-192.
[6]周必水,羅川林 .在線測試系統(tǒng)的研究與實現(xiàn) [J].計算機工程與應用,2005(21):189-121.
[7]孫媛,邱莉榕 .嵌入式系統(tǒng)基礎及應用 [M].北京:機械工業(yè)出版社,2009:119-175.
[8]賈麗,許靜,金鑫,等 .基于控件約束關系的 Web功能測試系統(tǒng) [J].計算機工程,2010,36(5):46-48.