OJ平台在程序设计中的应用分析与实现Word格式文档下载.docx
- 文档编号:16975920
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:10
- 大小:596.12KB
OJ平台在程序设计中的应用分析与实现Word格式文档下载.docx
《OJ平台在程序设计中的应用分析与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《OJ平台在程序设计中的应用分析与实现Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
文章编号:
1672-7800(2020)001-0172-04
0引言
在线评测(OnlineJudge,简称OJ)平台是一个基于WWW的服务器端软件系统,主要功能包括:
用户注册与管理、题库管理、在线提交与实时评测、网上考试、题目讨论、邮件服务等[1]。
早期的OJ平台以竞赛为目标,能够对用户提交的程序进行“黑盒判定”并自动生成判題结果。
传统OnlineJudge系统主要针对解题训练,并不针对课程教学辅助场景[2]。
C语言是大学一年级学生学习计算机程序设计时广泛使用的一种语言,通过学习C语言课程,学生不仅可以掌握该高级程序设计语言的语法与语义,还可以掌握结构化程序设计“自顶向下、逐步求精”的思想及方法、常用算法及实现技术,以及分析与解决实际问题的语言应用能力[3]。
将OnlineJudge加入到日常教学中辅助教师授课,将会帮助学生更加容易地掌握C语言。
因此,本校自主开发一个OJ平台,不仅用于程序设计赛事培训,还可将其用于平时的实验教学中,通过精心设置的多组测试用例反映出程序问题所在,方便教师及时找出漏洞(BUG)并作出解答,也便于学生课后复习与巩固。
在教学领域,OnlineJudge可以弥补人工评判的缺点,有效减轻教师负担,使评测更加公平、合理,学生在课内未完成的实验还可以利用系统在课外时间完成,从而使整个实验过程得到延伸[4]。
同时也能增强师生间的互动交流,提高教学质量,形成新的程序设计实验课教学模式。
OnlineJudge也为学生创造了一个模拟竞赛环境的平台。
众所周知,程序在线评测是ACM国际大学生程序设计竞赛(ACM/ICPC)采用的训练与比赛评测方式[5],ACM在线评测系统是该项比赛的评判事务处理平台,也是一个基于B/S结构的多用户在线系统,允许用户在线提交自己的解题代码,系统自动编译运行给出裁判结果,并根据用户解题数及用时进行排名[6]。
但刚接触编程的学生能力不是很强,如果一开始就让他们到各大学公网上的在线裁判系统上进行练习,无疑会打击其对编程的兴趣及积极性,因此必须有一个循序渐进、由浅入深的练习系统[7]。
1研究背景
1.1主流OJ介绍
国内著名题库有北京大学题库、浙江大学题库、电子科技大学题库、杭州电子科技大学题库等,国外题库包括乌拉尔大学题库、瓦拉杜利德大学题库等[8],以下举例分析一些现有的知名OnlineJudge。
(1)POJ。
POJ是北京大学ACM/ICPC在线评测系统(PekingUniversityJudgeOnlineforACM/ICPC)的简称,也是许多ACMer最开始使用的OJ平台。
POJ以题目优质著称,几乎涵盖了编程学习的各类经典算法。
北大为该系统的正常运行提供了硬件与网络资源保障,所以其可以全天不间断地为全球程序爱好者提供服务[9]。
(2)ZOJ。
ZOJ是浙江大学在线评测系统(ZhejiangUni-versityOnlineJudge)的简称,是国内最早也是最知名的OJ,有很多高手在上面练习。
特点是数据比较刁钻,经常会有意想不到的边界数据,十分考验答题人思维的全面性[10]。
ZOJ相较于POJ,在首页上有一个News项目,可以看到ZOJ的最新动向。
ZOJ非常简洁、直观,同时其前端界面也比POJ更加整齐、美观。
(3)hihoCoder。
相较于以上两个OJ平台,hihoCoder能提供更好的用户体验。
其有着最佳界面,并支持多种登录方式。
其宣传语是“通过高水平的程序设计比赛提升编程水平,得到名企Offer”,这句话体现了OJ平台的核心思想。
hihoCoder主页正下方即展示了3个正在进行或将要进行的程序设计比赛,这些比赛都是由名校或名企举办的。
平台所有题目都以中文形式呈现,并且给出算法使用提示,还注明了难度,让用户能够更加灵活地使用题库。
它还有栏目“hiho-下”,可推送“每日一题”,让编程成为hihoCoder用户的生活习惯。
hihoCoder拥有自己的讨论社区,让用户能在社区里相互交流、探讨。
因此,该平台功能十分强大,而且为用户考虑得非常全面。
1.20J平台功能分析
本校的OnlineJudge平台设计目的主要有两点:
一是为学校提供一个独立的拥有庞大题库的在线测试平台以辅助教学实践与赛事培训,以学生为中心,帮助学生树立“算法”思想[11]。
用户浏览网页选择题目,通过网页提交代码,由服务器端调用编译程序对用户提交的程序进行编译,然后由评测程序进行评判,并返回相应结果到网页上供用户查看[12];
二是因为传统采用实验室FTP客户端提交作业的方式,效率十分低下,且不利于学生利用课外时间练习,以及学生与教师之间的交流,影响了教学效果,因此通过搭建一个在线测试平台以实现教师对学生练习情况的跟踪监督。
通过实现以上两个核心功能可达到以下目的:
①计算机类竞赛训练。
为蓝桥杯、ACM等程序设计竞赛提供一个训练平台,通过提供一个完善且庞大的题库,让学生可通过该平台不断锻炼自己的答题水平,提升竞赛能力,为将来在竞赛中取得优异成绩打下良好基础;
②教学实验测试。
为教学实验课提供一个功能齐全的实践平台,由教师提供课程需要的实验题目,系统即可快速制作一个实验题库。
教师能够根据自己所教科目创建每次实验课内容,并按照不同难度设置每章节题目。
该方式解决了目前学生在实验课上只能通过FTP下载作业要求、上传程序,教师也无法直接查看结果等诸多问题。
从程序设计跟踪的角度,教师可通过系统查看最近几日每日总体数据,包括学生总共提交次数、竞赛题库完成度、整个班或年级实验完成情况等,避免了课程设计中代码量较大,导致教师检查代码工作量大的问题[13]。
学生用户可通过个人中心查看自己答题信息与打卡进展,包括每个实验、章节及每道题完成情况、通过数、正确率等重要指标信息。
从教学管理的角度,本系统可便于教师布置作业、管理实验进度、控制教学进度、监督学生完成情况等。
教师布置作业时可以设置截止时间,学生需要在截止时间之前完成,即使提交了作业,学生依然可以继续复习作业中的题目并巩固相关知识点。
在讲授课程时可以与本系统结合进行授课,例如教授C、C++、JAVA和C#等课程的教师可利用系统进行课堂在线程序的编写,并利用系统的在线评分功能,及时展示出编程过程中可能存在的编译错误及程序运行中的常见问题,为学生深入理解程序设计思想提供了一个更加直观的平台[14]。
我校OJ平台功能模块如图1所示。
20J平台实现方案
2.1网站设计
OnlineJudge是一种基于B/S结构的多用户在线评测系统,允许用户在线提交解题代码,系统自动编译运行并给出评测结果[15]。
网站采用Vue+SpringBoot+MySQL框架进行系统开发。
Vue和SpringBoot是当前主流的前后端框架,其中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-01000-ansi-Wall-WextraIm2>
/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:
/Testoj/bin/sh-e“cd/Test./a.out$1$2$3$4$5$6”
在进行判题时,首先通过pid()创建一个子线程,判题前需要对线程进行资源限制,以防止该线程出现。
具体实现步骤如下:
1.while
(1)的死循环
2.不停地malloc分配内存,占用地址空间
3.不停地创建子线程
通过intsetrlimit(intresource,conststructrlimit*rlim);
函数限定时间和空间
structrlimit{
rlim_trlim—cur;
/*软限制,当前限制*/
rlim_trlim—max;
/*硬限制,最大限制*/
};
通过判题,会根据判题结果返回不同信息,若通过则返回“通过”,若不通过,则会返回错误信息如“答案错误”、“编译错误”、“超时”等。
其中若存在编译错误,返回信息中还会加入控制台输出的具体错误信息。
判题流程如图2所示。
两个函数的resource参数取下列值之一:
RLIMITAS
进程可用存储区的最大总长度(字节)
RLIMITCORE
core文件最大字节数
RLIMITCPU
CPU时间最大量值(s)
RLIMITDATA
数据段最大字节长度
RLIMITFSIZE
可以创建的文件最大字节长度
RLIMITLOCKS
一个进程可持有的文件锁最大数
RLIMITMEMLOCK-个进程使用mlock
(2)能够锁定在存
储器中的最大字节长度
RLIMITNOFILE每个进程能打开的最大文件数
RLIMITNPROC
每个实际用户ID可拥有的最大子进
程数
RLIMITRSS
最大驻内存集的字节长度(residentset
sizeinbytes,RSS)
RLIMITSBSIZE
用户在任一给定时刻可占用的套接字
缓冲区最大长度(字节)
RLIMIT_STACK
栈的最大字节长度
RLIMIT_VMEM
RLIMIT—AS的同义词(Linux2.4.22不
支持)
3主要模块介绍
3.1学生实验模块
学生在课堂练习模块(见图3)中选择课程后,可看到课程每个实验完成情况和总体完成率。
每个实验作为一组,展示每个实验截止日期以及该组中题目名称,点击题目即可进入答题界面。
如果一个实验所有题目都已完成,在顶部显示完成标志,没有完成则显示未完成。
3.2答题模块
点击题目名称进入答题模块,界面显示题目难度及题目信息。
提交答案之后,系统返回程序运行需要的时间与内存空间,以及程序编译、运行结果(见图4),以便学生针对错误进行修改。
4网站优化
为了能够在低成本条件下提供更加强大的性能,除之前提到的更换服务器外,还可以对Java启动参数进行调整,更改JVM内存空间与堆的大小,使程序能够承受更大压力。
因为docker内存消耗略大,可以将主要判题业务从后台项目中剥离出来,部署在另一台服务器上,形成分布式架构。
SpringCloud是基于SpringBoot推出的一系列框架、组件的有序集合,简化了分布式系统基础设施开发[19]。
通过Eureka注册中心,将主要业务与其它业务一起注册。
使用SpringCloud可以直接调用另一台服务器的服务,相比之前都部署在一台服务器上,可以大大减小服务器压力。
5结语
OnlineJudge系统作为计算机专业学生在程序设计初期的训练平台,有着十分重要的意义。
本文在调研主流OJ平台的基础上,详细描述了本校OJ平台的功能模块、技术架构及实现方案。
在具体实现上,采用Vue+SpringBoot+MySQL流行框架,并借助undertowWeb服务器的优越性与docker容器运行的安全性,有效提升了系统性能。
未来可在其基础上进一步添加竞赛比拼、积分激励等新功能,再与课程教学紧密结合,注重提升学生的实际动手能力,激发学生学习的主动性与创新性,锻炼其编程能力,提高学生学习效率[20]。
同时还可在赛事培训、课程跟踪、教学反馈、教学分析等若干教学管理环节中发挥更大作用,提高教学质量,形成程序设计学习闭环,以期为社会培养更多高质量的计算机专业应用型人才。
参考文献:
[1]张丽萍,东升.程序设计类课程考核评价方法的改革与实践[J].计算机教育,2010,110
(2):
16-20.
[2]罗英伟,汪小林,张正熠.编程网格:
一个基于OnlineJudge的程序设计类课程教学辅助系统[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]王腾,姚丹霖.OnlineJudge系统的设计开发[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]庄奇东,王键闻,张楠,等.OnlineJudge系统的优化[J].计算机系统应用,2011,20(8):
115-121.
[13]陈湘骥,徐东风,杨秋妹.在线评判在C语言课程设计教学中的应用[J].计算机教育,2010(3):
97-100.
[14]乔少杰,杨燕,葛永明,等.基于B/S架构的多用户在线程序评判系统设计与实现[J].计算机工程与科学,2011,33(Al):
58-61.
[15]何迎升,罗强.OnlineJudge评判内核的设计与实现[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]王方旭.基于SpringCloud和Docker的微服务架构设计[J].中国信息化,2018(3):
53-55.
[20]王娟.基于OnlineJudge的高级语言程序设计课程教学改革[J].吉林省教育学院学报,2012,28(10):
85-87.
(责任编辑:
黄健)
基金项目:
全国高等院校计算机基础教育研究会计算机基础教学研究与改革项目(AFCEC-2016-18);
南京大学金陵学院校级教改项目(0010521816)
作者简介:
孔钦(1983-),女,硕士,南京大学金陵学院信息科学与工程学院讲师,研究方向为计算机应用、数据分析。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OJ 平台 程序设计 中的 应用 分析 实现