2012年2月19日星期日

ACM在线评判系统的原理

 

一、自动编译

在程序中通过启动编译器进程对源文件进行编译,通过获取编译器进程的错误输出流和标准输出流对象,可以获取编译器的输出,判断是否有编译错误发生,同时,再通过检查源文件目录下有无生成的可执行文件或者class文件,可判断最后的连接是否成功

二、运行和判断核心

如果自动编译成功,则需要根据预定义的测试用例对生成的可执行文件进行判断。过程大致如下:

1 主程序

1.1 在主程序中输入可执行文件名,相关的命令行参数,测试用例的个数,测试用例的执行时间限制,内存使用限制,测试用例文件名信息(输入文件和输出文件必须是成对出现的);

1.2 创建RunCmd对象,通过构造方法的参数将第一步输入的数据传递给RunCmd对象,启动RunCmd的方法doWork作为线程体进行评判。

2 线程RunCmd(doWork)

2.1 创建一个新的进程,相关参数为第一步中的可执行文件名和相关的命令行参数,并设置进程的输入输出和标准错误输出的重定向

2.2 启动进程,获取其标准输入流对象

2.3 打开一个测试用例输入文件,将其中的内容写入到2.2启动的进程的标准输入

2.4 获取进程的内存使用大小

2.5 线程睡眠一段时间(长度为测试用例的最长执行时间限制)

2.6 如果进程未结束,则杀死进程,将超时的代码写到标准输出,线程返回

2.7 如果内存使用超过限制,则将Time Limit Exceeded的代码写到标准输出,线程返回

2.8 获取标准错误输出和标准输出的内容

2.8.1 如果进程返回代码不为0或标准错误输出内容不为空,则将Run Time Error的代码写到标准输出,线程返回

2.8.2 将获得的输出结果与测试用例中的输出文件进行比较,将返回Wrong Answer,Accepted或者Presentation Error的代码

2.8.3 输出执行时间、内存大小等信息到标准输出

2.9 如果在执行过程中遇到内存不足或其他异常,则输出system error的代码或者Output Limit Exceeded的代码

在这个核心的基础上,很容易就可以开发出ACM OJ系统,在线考试系统,实验自动批改的系统等

没有评论:

发表评论