一种改进的源代码在线评测系统设计及实现

2014-03-10 07:49何爱华戚晓明蚌埠学院计算机科学与技术系安徽蚌埠233030
长江大学学报(自科版) 2014年1期
关键词:题库进程内存

何爱华,戚晓明 (蚌埠学院计算机科学与技术系,安徽 蚌埠233030)

随着计算机技术的广泛应用,程序设计能力正日益成为各专业学生的必备技能之一。程序设计能力的提高需要大量的编程练习和大量难度适宜的题目。除此之外,一些反馈信息,包括程序错误信息 (如语法错误,逻辑错误)和程序运行信息 (如运行时间,内存使用量,代码长度,使用语言,提交时间等)也是必不可少的。程序运行信息在线评测系统原是为适应竞赛的要求而开发的,不仅有利于选拔编程竞赛人才,更有利于提高学生对计算机程序设计的兴趣,从而有利于程序设计的辅助教学。下面,笔者描述了在Linux操作系统中如何在 .net平台下实现一个B/S结构的辅助教学系统,以实现C/C++/VC等源代码的在线自动评测。该系统采用黑盒测试技术,设计类似软件功能测试的程序评判原理,改进以往评测系统限制程序运行时间精度不高、不能限制物理内存等缺陷。学生通过上网在线提交他们的程序源代码,由服务器对提交的程序自动进行评测,并对成绩进行记录和统计,不但可以提高评测的效率和正确率,而且可以极大地减轻教师的劳动强度,缩短了考试或竞赛环节的周期,减少了人为的错误,学生的程序和评测结果都给予保留,这样很容易就能够查看成绩、排名和统计数据。

1 系统架构

系统采用B/S三层架构。表示层是用于与用户交流,引导用户操作,并反馈操作结果。业务逻辑层负责实现系统各模块的功能逻辑,处理数据,数值计算,逻辑检查,调用数据库接口维护数据。数据访问层用于对数据库的具体增加、删除、修改的操作。3层架构方便了后期维护与二次开发,哪里需要修改就修改哪里,各层之间各自独立,实现了责、权、利分离。

系统的开发基于ASP.net,控制逻辑使用C#语言编写,数据库采用SQL Server 2005。

2 总体设计

系统主要角色有学生、普通用户、教师、题库管理员、系统管理员,分为教师作业发布和学生作业提交模块以及学校内外练习和比赛模块2大主要模块。

2.1 数据库的设计

根据系统要求,系统主要由以下数据表组成:学生表包括学号、姓名、性别、E-mail、电话号码、班级号、学校名;普通用户表包括用户号 (用户名)、密码、E-mail、电话号码;教师信息表包括教师工号、密码、名字、职称、所在学校;班级信息表包括班级号、学校名;教师班级联系表,包括教师工号、教授课程号、教授班级号;管理员信息表包括管理员号、密码、权限;课程表包括课程表和课程名;项目表包括项目号、项目名称、项目介绍、项目开始时间、结束时间、项目状态、是否需要申请、课程号 (外码)、题目数量;题目信息表包括题目号、题目标题、题目的详细描述、输入描述、输出描述、输入样例、输出样例、内存限制、运行时间限制、权值、总提交次数、总正确次数、项目号等;题目提交信息表包括用户号 (学生学号/普通用户号)、题目的编译号、题目号、程序使用的语言、提交次数、代码长度、提交结果、使用内存、使用时间、编译错误信息、源代码等。

2.2 主要模块设计

2.2.1 教师作业发布和学生作业提交模块

图1 教师作业发布和学生作业提交结构图

该模块分别设计教师模块、学生模块、系统管理员模块、题库管理员模块等,并定义出了每个子系统之间的接口。模块结构图如图1所示。

1)系统管理员 (教师的作业发布和学生作业的提交系统) ①课程管理。针对学校相关编程课程的需要进行课程的录入以及修改删除功能。同时为课程分配教师和该课程的学生 (学生一般是由老师录入)。②教师管理。针对学校教师的情况,进行教师信息的录入以及修改删除功能,查看教师对应的课程。③学生管理。针对学校学生的情况,进行学生信息的录入以及删除修改功能,查看学生的具体选修的课程情况。

2)教师角色 ①布置作业。作业包括课程名、题目名称、题目主干、时间限制、内存限制、布置日期、截止日期。②查看作业。查看信息包括题目名称、学号、题目状态、耗时量、内存占用量、提交日期。③公布答案。答案包括题目名称、答案内容 (注:答案在截止日期后才能被显示)、耗时量、内存占用量。④学生信息。学生信息包括学号、班级、作业正确率、联系方式、未完成的作业。⑤题库管理。题库包括已有题目的各类信息,提供增加题目、删除题目和公布答案等各项链接,以及查看对应题目的正确率,答对题目学生名单。⑥学生管理。针对所教班级的学生,进行学生信息的录入和删除。

3)学生角色 ①个人信息编辑功能。昵称、密码、邮箱、手机号码等的信息修改。②查看作业。老师布置作业查看、完成和未完成题目查看。③提交作业。将源代码粘贴至对应的提交窗口进行提交,对同一道题目可以多次提交,作业提交与作业编译。④查看作业结果。如果题目已过期,则可以看标准的答案。同时可以观看自己提交作业的正确率排名等情况。⑤比赛的报名和参赛。

4)题库管理员 (与教师角色有部分重复) 包括题库的增加、修改、删除,以及查看对应题目的正确率,答对题目学生名单。

2.2.2 学校内外比赛、练习系统模块

该模块主要实现学生竞赛和平时模拟练习功能,模块结构图如图2所示。

1)系统管理员 ①赛事管理。发布比赛,选择比赛的题目。②用户管理。对比赛管理员、题库管理员、普通用户的管理。③公告新闻的管理。发布比赛信息,公布比赛结果。

2)比赛管理员 ①发布比赛信息。②审核参加比赛的用户。③从题库中选择比赛的题目。④对比赛的相关统计。

3)题库管理员 添加修改删除题库中的题目。题库包括:练习所需的题库,作业题库,比赛所用题库。

4)普通用户 ①平时题库练习。②申请参加比赛。③参加比赛。

图2 学校内外比赛、练习系统结构图

3 实现的关键技术

3.1 在线编译关键技术

3.1.1 在asp.net中调用可执行文件

评判过程中,需要2次调用可执行文件,一次是调用编译器手动编译源代码,一次是调用生成的可执行文件。在C#中的方法是System.Diagnostic.Process.Start,即创建一个进程。然后设置进程相关信息。

3.1.2 用命令行方式编译源程序

对于用C++语言编写的源程序,可用GCC编译器 (Linux下最常用的),它的编译基本行命令是g++-o file file.cpp,执行可执行文件的行命令是./file。

C文件类似,编译基本行命令是:gcc-o file file.c,执行可执行文件的行命令是./file。

若使用VC6.0自带的编译器cl.exe编译C或C++文件,首先运行cl.exe所在的文件夹里面的批处理VSVAR32.BAT,再使用cl命令行。

3.1.3 重定向输出到文件

该系统以子进程方式运行编译后的用户程序,需要在非键盘交互方式下将输入数据提交给用户程序,并将运算结构和运行错误捕获,这就需要将编译的结果信息重定向到文件,以备读取,给客户端显示。C#中 “>”为重定向符,语法如下:

p.StandardInput.WriteLine(“cl”+SrcPath+ “>”+TextPath);//“>”:文件重定向

将编译结果写入指定路径的.txt文件中,详细的错误信息可以从中读取。

3.2 黑盒测试

3.2.1 源代码评判原理

系统采用数据驱动方式,测试时只需评判输入的数据和确定的输出数据即可,不必考虑源程序的具体内容和算法。该系统实际运行中,待测源程序从控制台输入和输出,提交程序时同时设置时空阈值,以便超限时终止程序的执行并置错误标志。评判程序通过系统调用编译后的可执行文件 (二进制文件)为子进程,同时建立通向该子进程的标准输入输出管道,通过该管道写入待测程序的标准输入空间,待测程序读到数据后计算并输出。该过程中,操作系统在评判程序的控制下监控待测程序进程的时空数据,若超过了时空阈值则终止待测进程并通知评判程序,将程序运行错误信息写入到重定向的错误输出文件中,最后分析输出文件中的数据是否和标准答案数据完全一致,若一致则证明源程序是正确的。标准答案通常以正则表达式形式给出,以文本文件形式保存。

在黑盒测试方法中,采用穷举输入方法,输入数据通常由多组测试数据构成一个数据集,数据集包含若干组典型测试数据和全部边界测试数据。测试流程图如图3所示。

3.2.2 限制程序运行时间

限制运行时间主要用来防止程序出现死循环,避免CPU资源过度开销。系统通过进程管理的方法将程序运行时间最少限制到1ms。限制程序流程图如图4所示。进程管理的核心是进程的执行,内核通过系统调用接口 (System call Interface,SCI)提供一个API来创建一个新进程 (frok()方法),停止进程 (kill()方法),并在它们之间进行通信和同步。进程管理实现了活动进程共享CPU的需求,内核采用新型的调度算法,即O(1)调度算法,该算法可以在固定的时间内进行操作,不管有多少个进程在竞争CPU。

图4中,黑盒评测程序是父进程,它通过fork()方法生成子进程,在子进程中通过excelp()方法将用户程序装入子进程的内存并开始独立执行,此过程中,父进程不断检测子进程是否死锁,如果没有死锁则检查相应进程信息中的运行总时间,若超时则通过kill命令结束子进程。获取子进程的实际CPU时间是整个流程的重点,黑盒评测程序通过读取Linux内建的proc文件系统信息来检测CPU的时间开销和内存开销,proc文件系统是动态从系统内核读取的进程信息,它存在于内存,应用以下命令来获取进程信息:

进程信息中有进程开销的用户时间和内核时间,目标程序的运行总时间= (stat第<14>项数据+第<15>项数据)×10(ms)。

3.2.3 限制物理内存

为了防止一些程序过度开销物理内存而导致系统运行过慢或服务器崩溃,常常需要内存的使用量。该系统实现了子进程驻留内存的直接限制,而传统的方法通过设置rusage结构体只能限制子进程的虚拟内存量。

限制子进程物理内存的流程图如图4所示,在用户程序进入子进程运行空间开始运行后,父进程不断从proc文件系统检测子程序的物理内存,若超过规定的用量,则通过kill命令终止子进程的执行。应用以下命令来获取目标进程的内存信息:

内存信息有目标进程的内存数据,它是以页为单位的整数,一般一页的大小为4KB,目标进程的内存总量= (statm第<2>项×4)KB。

图3 黑盒测试流程图

图4 父进程限制子进程运行图

4 结语

介绍了源代码在线评测系统的设计思路和关键实现技术。不同于以往的已开发的在线评测系统,该系统从技术上实现了物理内存限制、高精度控制程序运行时间等难点,从功能上将系统定位在教学、自学、竞赛培训及竞赛这4个方面。在教学方面,该系统可以用于学生作业的电子提交,提交后对源代码进行动态测试,并给出评价结果,以代替教师的人工测评。在自学方面,因为有规模较大的数据库支持,可以实现大容量的题库链接,以供有兴趣的学生进行进一步学习。在竞赛培训方面,该系统可以模拟竞赛时的真实环境,从而使学生更快地进入比赛状态,提高比赛成绩。在竞赛方面,借助这一系统,学校可以定期举办比赛,以激发学生们的编程热情,营造良好的学习氛围。

[1]曾棕根 .源程序在线评测系统技术改进 [J].计算机工程与应用,2011,47(4):68-71.

[2]王忠贵 .基于ASP.NET在线测试系统的设计与实现 [J].计算机工程与设计,2007,28(5):1166-1168.

[3]杨晋吉,刘太根 .网络课程中基于Web的在线测试系统的研究与实现 [J].计算机应用研究,2007(2):230-232.

[4]王辉,胡新华,张广泉,等 .集群式程序设计竞赛评测系统设计与开发 [J].计算机应用与软件,2009,26(9):119-122.

[5]朱绍风,刘方爱 .教育网格中教学督导评测系统设计与实现 [J].计算机技术与发展,2009,19(8):189-192.

[6]周必水,罗川林 .在线测试系统的研究与实现 [J].计算机工程与应用,2005(21):189-121.

[7]孙媛,邱莉榕 .嵌入式系统基础及应用 [M].北京:机械工业出版社,2009:119-175.

[8]贾丽,许静,金鑫,等 .基于控件约束关系的 Web功能测试系统 [J].计算机工程,2010,36(5):46-48.

猜你喜欢
题库进程内存
“勾股定理”优题库
“轴对称”优题库
债券市场对外开放的进程与展望
“轴对称”优题库
“整式的乘法与因式分解”优题库
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
改革开放进程中的国际收支统计
内存搭配DDR4、DDR3L还是DDR3?
社会进程中的新闻学探寻