期刊封面
基于模式的在线评测系统的设计与实现
随着信息技术的迅猛发展,传统的试卷考核学生算法编程能力的方式已经淡出人们的视野,由于数据量大、主观性强、算法思路好坏不一,这种方式显得尤为耗时且容易出错,给老师带来很大的负担。一套完整而在线评测系统必将取代传统的纸质形式的测试。本文设计并实现了基于LAMP的在线评测系统,在普通Web项目的基础上嵌入判题内核,确保提交的程序能够平稳运行。
With the rapid development of information technology,the traditional method of assessing student's algorithmic programming ability has faded people's method is particularly time-consuming and error-prone because of the large amount of data,subjectivity,and mixed algorithm ideas,bringing a great burden to the complete and online judge system will replace the traditional paper form paper designs and implements an online judge system based on LAMP.It embeds the judgment kernel on the basis of common Web projects to ensure the smooth running of submitted programs.
1.引言
ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest (ICPC))是由美国计算机协会(ACM)主办的一项旨在展示大学生编写程序、分析和解决问题能力的年度竞赛[1][2]。在线评测系统起源于ICPC中用来自动评判参赛选手成绩的ACM评测系统,其评判原理是基于黑盒测试。在线评测系统对于培养学生编程兴趣、提高学生编程能力具有重要意义,目前国内较著名的在线评测系统如北京大学的POJ、浙江大学的ZOJ等。
本系统[3]-[9]采用B/S架构下Web程序应用平台中主流的LAMP模式[10][11][12][13][14]进行开发,即选用Linux系统,使用Apache搭建服务器,前端使用PHP语言编写,数据库使用体积小、速度快、成本低、灵活性高的MySQL。
2.系统设计
2.1.系统架构
为了满足程序系统的需求,进行灵活的判题分析,系统采用B/S架构。架构图如图1所示。具体分析该系统,将其设计为如下四个组成部分:
1)网站系统(Web端):Web端与普通系统相同,解决用户管理、题库管理、提交代码和统计分析等基本功能。
2)判题核心(Judge):和判题守护进程相互配合,一旦判题队列中出现了用户提交的代码,就对这段代码进行编译、运行,并对运行下来的结果与样式输出进行比较,将结果存入数据库。需要修建围墙来保证系统的安全性,不能够接受恶意代码。
architecture diagram图1.系统架构图
3)封装层(Judge Wrapper):这一层是Web端与判题内核互通的一个桥梁,它负责调用Judge层来完成Web端的响应,这使得判题核心成为一个独立的功能模块。此外,可以屏蔽掉Web端带来的一些恶意代码的危害,将一些潜在的威胁在进入到核心判题层之前先打退回去,确保系统安全平稳运行。
4)侦听守护进程(Daemon):守护程序是一个基于多线程的TCP服务,始终轮询数据库的solution表是否有新的记录出现,若有,则调用封装层,并由封装层对核心判题层进行调用。
系统将采用LAMP的模式,如图2所示,客户访问架设在Apache服务器上的Web前端,服务器会读取目录下存放的.html和.php文件,并使用PHP连接MySQL,通过标准SQL语句操作存储网站内容的数据库反馈给用户。
mode schematic图2.LAMP模式原理图
2.2.功能设计
整个系统划分为六个功能模块,即用户管理模块、题库管理模块、答题模块、判题模块、统计分析模块和算法教育模块。整个系统的功能结构图3所示。
diagram图3.功能模块图
2.3.数据库设计
数据库中设计了用户表、题目表、状态表、源代码表和编译表5张表,建库后数据库关系图如图4所示。
diagram图4.数据库关系图
3.判题模块设计
3.1.判题模块构成
判题模块由两部分组成:
judged(judge daemon):是一个守护进程,负责隔一段时间查找一下数据库中solution表是否存在新的用户提交的代码,若有,则加入判题队列。当有新的任务时开启judge client进程。judged流程图如图5所示。
Judge_client是核心的判题程序,担负着编译、运行和监测的工作,是系统的核心功能模块,也是最容易出现问题导致系统不能正常运行的一个模块。Judge_client流程图如图6所示。
3.2.关键技术
3.2.1.轮询
用于判题守护进程中响应用户的答案提交行为,判题守护进程隔一段时间检查 solution表中是否有新增数据,若有,则生成一个子进程来编译用户的代码,这些子进程形成一个任务队列,由判题内核依次执行。
文章来源:《水力采煤与管道运输》 网址: http://www.slcmygdys.cn/qikandaodu/2021/0728/669.html
上一篇:品管圈活动在降低住院患者留置管道固定缺陷发
下一篇:
矿业工程论文_水力采煤与管道运输