
基于LAMP架构的ACMICPC在线评测系统设计.doc
6页基于LAMP架构的ACM/ICPC评测系统设计摘要本课题在牡丹江师范学院已有的评测系统上进行 全面重构,将0J系统各个组成部分进行解耦,使得oj系统各个 模块之间独立性增强,容易修改现有功能及扩充新功能,以应对举 办比赛时的访问压力包括本课题的系统架构设计,对其下各个模 块核心内容的阐述,包括基于linux系统的沙箱模型、基于java 的多线程服务器、基于amp架构和mvc设计模式的web前端系统 的设计与实现,以及影响系统安全的各种因素和对应的解决方案关键词评测系统acm/icpc lamp架构0绪论acm/icpc冃的旨在使大学生运用计算机来充分展示口己分析问 题和解决问题的能力评测系统(online judge system,以下 简称Oj)起到了非常重耍的作用集训队员可以评测系统上 挑选各种题目挑战自我,提高自我,学习各种数据结构和算法;在 统一组织的集中训练中可以通过指定题目的形式来强化训练效果; 而评测系统对比赛功能的支持,进一步提高了集训队员的学习 热情,同时还可以模拟比赛的环境,培养那些计划参与acm/icpc 赛事的队伍的团结合作能力但是其中大部分Oj系统是闭源、封闭的,无法获取其源代码进行 修改扩充以满足现有需求,牡丹江师范学院acm/icpc集训队才于 2010年推岀自己的oj。
但是该系统存在几个问题:一,效率不足, 无法承受每年牡丹江师范学院程序设计大赛预选赛的压力;二,由 于该系统没有应用沙箱技术运行用户代码,存在安全隐患,可能直 接导致服务器被劫持此后,google code上陆续出现了几个开源 0J系统,但是在架构设计上仍不够完善,且无法与原系统的数据 格式兼容,因此,有必要重新开发一个经过合理设计的新0J系统, 从根本上解决上述的问题,为集训队提供一个稳定可用的学习环 境1系统架构设计为了方便用户的使用,本系统采用b/s架构,只要用户使用的是 有网络接入的计算机,就可以通过浏览器进行访问根据该系统的 具体情况,在设计上将其分为以下四个组成部分:(1)障占 競(web 端;(2)评测核心(judge); (3)评测核心封装层(judge wrapper); 监听守护进程(daemon) □在设计上,该项目将系统的几个主要组成模块充分解耦,一方面, 多个模块之间可以并彳亍开发;另一方面,各个模块解耦后使得系统 的修改和扩充更加容易,每个模块的可重用性也相应壇强例如, 当其他学校需要实现一个功能界面完全不同的Oj系统或是作业 平台时,可以直接采用本项目的评测核心,避免重复开发。
2评测核心的设计与实现作为评测系统中最核心的部分,尤其是需要监控用户运行, 需耍涉及到很多相关技术,特别是与系统底层关系密切的技术在 linux下,系统调用的实现通常是用户穆序通过触发80号软中断 或者执彳亍syscall/sysenter等平台相关的cpu指令陷入到内核中,内核通过寄存器获 取用户程序的输入,在通过严格的检查后 执行相应操作在本系统中涉及的主要系统调用包括fork、setitimer> execve> wait> ptrace> setrlimit> chroot> setuid 等1) fork系统调用通过复制调用进程的上下文来创建一个新进 程(2) setitimer系统调用用于设置定吋器3) execve系统 调用用于载入一个新的可执行程序,替换当前进程的地址空间4) wait系统调用允许父进程阻塞,直到子进程发生一些事件5) Ptrace系统调用是一个可以使父进程在用户层拦截和修改系统调 用的函数,可以监控和控制其他进程,该函数还能够改变子进程中 的寄存器和内核映像,因而可以实现断点调试和系统调用的跟踪6) setrlimit系统调用可以改变进程的资源限制o (7)chroot系 统调用使得调用进程的将某一目录当作其根冃录,以此限制该进程 及子进程对该目录外文件的访问。
8) setuid系统调用允许进程改变其有效用户id在本系统中,用户提交的代码可能存在恶意,对其编译后的程序需要运行在服务器上,因此必须对其进行严密的监控,防止恶意代码带来的危害在本系统支持的c>C++、pascal三者经过编译后产生本地代码,可以通过linux系统 调用(主要是 fork、execve> chrootx setuid 和 ptrace)来创 建一个沙箱,限制恶意代码访问文件、控制系统的权限,尤其是通 过ptrace來限制可使用的系统调用,在很大程度上保证了系统的 安全运行时检测是最重要、最复杂的运行时监控机制本系统中通过 Ptrace系统调用来监控用户进程每当用户进程出发一个系统调 用,或者是收到某些信号的时候,用户进程会将控制权暂时移交给 监控核心监控核心将严格监控用户进程的各项参数,以保证其不 执行危害系统安全的操作:(1)检查程序是否正常退出2)检查 程序是否收到了非正常的信号3)通过进程的缺页中断次数计算 进程使用的内存资源是否超出限制4)检查进程系统调用是否合 法在以上四项检测都不存在问题的情况下,用户进程才能继续执行由于题目根据其合法结果数量可以分成普通类型和special judge类型,因此针对不同的类型,需要分别对其进行判断。
1) 普通类型的题目,其合法结果唯一,因此只需要简单判断用户程序 与标准答案的一致性即可2) special judge类型的题冃,在本 系统中,约定了 spj程序的名称以及数据的传递方式,包括•标准 输出、用户输出,以及spj程序的数据,由评测核心调用spj程 序来完成最后的评判过程3评测核心层的设计与实现每当用户提交一份新的代码,wrapper即会被调用,从数据库中 获取代码的详细信息在此阶段需要关注的信息主要包括:(1)用 户提交的代码本身及其关键属性(如语言类型)2)此代码的提 交用户类型,是普通用户还是管理员3)此代码所属的题目是否 处于正在进行的比赛4)此代码是否已经被评测过根据评测核心在设计上的约定,封装层需要通过命令行的方式提 供多个参数,包括语言类型、源文件路径、题号、数据目录、临时 冃录、时间限制、内存限制、输岀限制等根据评测核心在设计上 的约定,以其返冋值和输出来标识一次评测的结果如果核心的返 回值非0,表示在评测过程中出现错误,属于系统错误;否则可以 从核心的输出字符串中读取出运行结果、内存占用、时间占用等信 息4监听守护进程的设计与实现监听守护进程(daemon)采用了一个事件驱动模型:每当用户提 交代码时,web端主动通知daemon, daemon载入评测核心封装层, 以触发一个完整的评测流程。
这样的事件驱动模型使得daemon的 运行史加有效率,且能够及时响应请求由于tcp协议提供了而 向连接且可靠的通信服务,而服务器采用了事件驱动机制,因此, 完成一个tcp服务器来实现daemon,是一个最简单且合适的方 案由于java提供的socket、线程等库都对系统底层提供的响 应机制进行了比较完善的封装,同时在语言层次上提供了线程之间 的同步和互斥机制,因此,本系统采用java进行开发,能够使 daemon运彳亍得更稳定5结论本课题实现的评测系统目前已完成,并运行在牡丹江师范学 院acm/icpc集训队的服务器上,为所有acm/icpc参与者与其 他程序设计爱好者提供服务最终实现版本在而对全而的单元测试 和大量的用户盲测,稳定高效地通过了各种正确、不正确及攻击性 用户程序的测试,并且保证了系统安全,达到了预期的目标参考文献[1] [美]w ・ richard Steve ns, stephe n a. rago 著.u nix 环境高 级编程(第二版)[in]・尤晋元,张亚英,戚JE伟,译•机械工业出版 社,2006.[2] [美]erich gamma, richard helm, ralph johnson, john vlissides著•设计模式:可复用面向对象软件的基础[m].李英军, 马晓星,蔡敏,刘建中等译•机械工业出版社,2000.[3] [美]samuel p. harison iii, guy 1. steele jf 著・ c l吾言 参考手册[m] •邱仲潘等,译•机械T业出版社,2003.[4] 王欢,杨树青著.linux环境下c编程指南[m]•清华大学出 版社,2007.[5] 王腾,姚丹霖.online judge系统的设计开发[j].计算机应 用与软件,2006(12)・[6] 周高嵌•基于口箱测试的源代码评测系统[d]・北京化工 大学,2005.。












