APP下载

计算机编程课程在线评测系统的探究与设计

2019-03-07刘振超孙娜黄建昌

考试周刊 2019年16期

刘振超 孙娜 黄建昌

摘 要:目前计算机编程课程考试都是基于OJ系统的,评价一个OJ系统性能的标准,主要看它的判题效率及准确性。本文在对判题端的设计中,使用python来编写判题逻辑,通过增加判题节点来提高判题效率,并将预先设计好的测试数据存储到利用PostgreSQL和Redis构建的后台数据库中,用于测试用户程序的正确性。

关键词:OJ系统;判题逻辑;Python;PostgreSQL

随着教育信息化的发展,OJ系统通常被用作练习编程和考试的平台。它的出现增加了学习的灵活性,提高了学生的学习效率,减轻了教师的工作负担。评价一个OJ系统性能的好坏,最关键的性能指标就是判题效率及准确性,所以在OJ系统的开发过程中,判题端的设计和开发显得尤为重要。在判题端的设计部分,本文基于python来编写判题逻辑,并对用户程序的运行时间、占用内存进行了限制。还将预先设计好的测试数据存储到了利用PostgreSQL和Redis提前构建好的后台数据库中,用于测试用户程序的正确性,并通过增加判题节点的方法提高了判题效率。

一、 概述

OJ系统是通过对代码进行编译执行,使用预设数据进行测试,从而分析出用户所提交代码正确性的系统。它整体可以分为两部分——web部分和judge部分。其中,judge就是判题机,它的核心被称为judge-server,也就是判题逻辑。当用户提交了源代码后,判题程序会对该源代码进行编译、运行。用户程序执行的结果会被捕捉并保存,然后转交给一个裁判程序。该裁判程序会调用题目对应文件夹内的输入输出数据与用户程序的输出数据进行比較,然后由系统返回给用户一个状态和程序占用内存、运行时间等信息。

二、 判题逻辑

本文使用python对判题逻辑进行了编写,它就是一个能够去编译和运行用户提交上来的源代码的程序。它将启动两个进程来实现判题功能。其中judged是服务进程,负责轮询solution表(存放在后台数据库中),然后获取判题队列;judge_client进程负责准备运行环境、判断运行结果、监测时间和空间受限。

每个题目会生成一个相应的文件夹,文件夹中存放着测试数据。其中.in文件保存的是测试用的输入数据,比如1 1这样的测试数据。.out文件是输出数据,比如2,对应的程序就是1+1=2。

此外,判题程序还需要对用户程序的运行时间、占用内存进行限制。

(一) 时间限制

当setitimer定时器计时结束时,系统就会给进程发送一个信号。进程实际运行时间计数器(ITIMER_REAL)计时结束时会发送SIGALRM信号,进程CPU时间计数器(ITIMER_VIRTUAL)计时结束时会发送SIGVTALRM信号。I我们设置好定时器之后,如果捕获到了对应的信号,说明当前进程运行超时。

(二) 占用内存限制

开发OJ的在线判题功能,需要一个子进程在沙箱中进行代码的编译、运行并计算使用的cpu资源和内存资源,对于子进程的资源管理,在Linux系统下,我们选择使用RLimit。

其中有两个重要的函数:

int getrlimit(int resource, struct rlimit *rlptr);

int setrlimit(int resource, const struct rlimit *rlptr);

getrlimit( )用于获取当前进程的RLimit,;setrlimit( )则用于设置当前进程的RLimit。传入不同的resource值,便是对当前进程的不同运行资源设定限制。resource值中的RLIMIT_AS用来限制进程的最大内存地址空间,如果超过这个地址空间,内存将不能分配成功。

三、 判题节点

判题部分是整个OJ系统的核心所在,所以提高判题端的工作效率对于提高整个系统的性能而言是至关重要的。对于提高judge的判题效率,采取了增加判题节点的方法,具体思路是:通过Web端发送判题的请求给RabbitMQ消息队列,每当有一个新任务,就启用一个judge_client进程,每个判题请求拥有一个自己的ID(即一个判题节点),每个ID对应着一个judge_client进程,这样就可以使多组测试数据同时去检测,从而加快判题速度。如图1所示是判题过程。

图1 判题过程示意图

四、 结语

本系统的判题端目前可以用来检测C,C++,JAVA代码的正确性,以及代码运行的时间和占用的内存是否超出限制。今后,我们准备在“如何支持更多类型题目的提交”“如何在提交记录里显示分数”“怎样增加交互式判题功能”三方面进一步完善该系统。

(通讯作者:刘宇)

参考文献:

[1]李伟光,陈希.GOJ系统的研究与实现[N].科技创新导报.

[2]冯潞潞.基于偶然性正确测试用例发现的软件错误定位方法[D].杭州:浙江理工大学,2014.

[3]翟伟翔.WorldFIP现场总线分布式控制系统的研究与开发[D].北京:华北电力大学,2008.

[4]赵涛.面向SDN的软件定义硬件计数器研究[D].长沙:国防科学技术大学,2014.

作者简介:

刘振超,孙娜,黄建昌,河北省黄骥市,河北农业大学理工学院。