Online Judge 实现 —— 后台判题
0. 一些闲话
- 使用JSP实现了一个简易的OJ系统,前端和交互就不提了,里面关键的地方就是后台判题,所以在此记录一下。实现出来的系统中,用户提交代码后,由Servlet把数据存到数据库,并且将判题状态设为Queueing,然后就不需要管了,全权交给Linux端的C++程序解决。后台的判题我是扔到Docker中运行的。
- 在实现的过程中,资源的限制监听参考了HUST OJ,在此感谢大佬们。深刻体会到阅读源代码对于自身学习的帮助。
- 项目源码已传到Github中,欢迎大家一起探讨改进。
- 下面开始进入正题,记录一下我在实现时的后台判题功能。
1 轮询
要能即时获取用户提交的信息,就需要在后台运行一个程序,不断轮询数据库。为了运行方便,程序的参数由命令行的方式传入,参数保存在一个shell脚本文件,启动时直接运行该shell脚本就行了。 该程序进行以下几部分操作。
- 首先当然就是要连接数据库啦,我这里使用了Mysql-Connector-C++;
- 连接完数据库,接下来就是不断轮询,获取数据库中状态为Queueing的提交,将它们存到队列中;
- 逐个获取队列中的数据,将代码保存到文件中后,进行评判,评判的方法是创建一个子进程去启动Docker容器运行评判程序,父进程阻塞等待;
- (暂时还没有研究如何用多台测评机进行判题)。
2 评判
评判程序