基于Java的OJ(Onlie Judge)实践

 

 

暑假期间实现了OJ的核心框架,其中包括核心运行功能的实现, Java程序运行沙盒,(不包含c/c++运行部分),这部分将会近期实现.

 

期间我参考了很多网上的现有资料,对他们无私的奉献致敬,这里我对我们的OJ 做一下简单的阐述(其实原理很简单^_^).


我们的OJ核心实现将采用Jsp + Java/c实现, 服务器采用linux, 可执行Java/c/c++程序.


      核心框架基于多线程设计, 采用Hibernate操作数据库,这样解耦了系统与数据库, 也不必过分去关心SQL语句的优化问题.

 

 

 

 

 

基于Java的OJ(Onlie Judge)实践_第1张图片

 

测评核心采用两个线程分别维护一个阻塞同步队列(采用LinkedBlockingQueue)来存储编译/运行程序,(在队列无元素时一直等待,

 

直至有元素插入队列中).当程序被提交以后,插入编译队列中,并执行编译工作,如果编译成功则将编译后的相关结果送入运行队列中,并执行.

 

如果未通过则不放入运行队列中.由于编译/运行队列分别由不同的线程执行,这样编译的同时可以进行程序运行工作,提高的程序的运行效率

 

(每时刻只有一个程序被编译或被运行).如下图所示,1编译成功后放入运行队列并执行,2未通过编译不放入…..

 

        基于Java的OJ(Onlie Judge)实践_第2张图片

 

 

 

核心模块支持正常练习模式和比赛模式, 他们公用一个核心模块, 练习模式下直接与数据库交互.而比赛模式下对数据刷新和获取的

 

频率较高,我们采用缓冲的模式来保存一些重要的信息,当用户提交后对其更新并同步数据库.缓冲包括比赛题目缓冲,执行结果缓冲与比赛

 

排名缓冲.其中执行结果缓冲保存最近的75(可自行设定)条提交记录.

 

我们知道,OJ对于系统的安全性有着严格的要求, 任何被认为对于操作系统或是本系统有害的操作均不予被执行, 例如文件操作,数据

 

库访问,Socket操作等等.对于c/c++程序需要使用JNI调系统API来限制运行程序.而对于Java程序,我们使用Java语言的安全限制实现

 

Java语言运行时的沙盒,这样对于Java程序足够安全,并且对于java程序的运行时间和空间有更准确的测评.Java沙盒运行原理如图

沙箱的实现:http://blog.csdn.net/flyingpig204/archive/2009/11/25/4871968.aspx

基于Java的OJ(Onlie Judge)实践_第3张图片

 

 

 

你可能感兴趣的:(Java)