基于Java的OJ(Onlie Judge)实践

来源:互联网 发布:如何搭建云计算平台 编辑:程序博客网 时间:2024/06/05 00:21

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

 

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


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


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

 

 

 

 

 

 

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

 

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

 

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

 

(每时刻只有一个程序被编译或被运行).如下图所示,1编译成功后放入运行队列并执行,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

 

原创粉丝点击