Icpc真题oj
关键词ACM/ICPC灯在线评估系统架构
中国图书馆分类号:TP311.52文献识别码:a。
0简介
ACM/ICPC的目的是让大学生充分展示他们利用计算机分析和解决问题的能力。在线裁判系统起着非常重要的作用。培训团队成员可以在在线测评系统上选择各种题目挑战自己,提升自己,学习各种数据结构和算法;在统一组织的集中培训中,可以通过指定题目的形式来加强培训效果;在线评估系统支持比赛功能,进一步提高了集训队员的学习积极性,还可以模拟比赛环境,培养那些计划参加ACM/ICPC比赛的队伍的团结协作能力。
而OJ系统大多是闭源封闭的,无法获取其源代码进行修改和扩展以满足现有需求。牡丹江师范学院ACM/ICPC培训队2010才推出自己的OJ。但该系统存在几个问题:一是效率低下,无法承受每年牡丹江师范学院编程大赛初赛的压力;二是由于系统没有使用沙盒技术运行用户代码,存在安全隐患,可能直接导致服务器被劫持。此后,Google Code上出现了几个开源OJ系统,但架构设计仍不完善,无法兼容原系统的数据格式。因此,有必要重新开发一套设计合理的新OJ系统,从根本上解决上述问题,为培训团队提供一个稳定可用的学习环境。
1系统架构设计
为了方便用户,本系统采用B/S架构。只要用户使用有网络接入的电脑,就可以通过浏览器访问。根据系统的具体情况,在设计上分为以下四个部分:(1)网站系统(Web端);(2)法官;(3)评估核心包装材料;倾听守护进程。
在设计上,该项目将系统的几个主要模块完全解耦。一方面,可以并行开发多个模块;另一方面,各个模块的解耦使得系统的修改和扩展更加容易,各个模块的可重用性也相应增强。比如,当其他学校需要实现一个功能接口完全不同的OJ系统或操作平台时,可以直接采用这个项目的评估核心,避免重复开发。
2评价核心的设计与实现
作为在线测评系统的核心部分,尤其是需要监控用户的操作,需要涉及到很多相关技术,尤其是与系统底层密切相关的技术。在Linux下,系统调用的实现通常是用户程序通过触发80号软中断或者执行SYSCALL/SYSENTER等平台相关的CPU指令落入内核,内核通过寄存器获取用户程序的输入,经过严格检查后执行相应的操作。
这个系统涉及的主要系统调用有fork、setitimer、executive、wait、ptrace、setrlimit、chroot、setuid等等。
(1)fork系统调用通过复制调用进程的上下文来创建新进程。(2)setitimer系统调用用于设置定时器。(3)可执行系统调用用于加载新的可执行程序,替换当前进程的地址空间。(4)wait系统调用允许父进程阻塞,直到子进程中发生一些事件。(5)ptrace系统调用(5)ptrace系统调用是使父进程能够在用户级拦截和修改系统调用的函数,可以监视和控制其他进程,也可以改变子进程中的寄存器和内核映像,从而实现断点调试和系统调用跟踪。(6)setrlimit系统调用可以改变进程的资源限制。(7)chroot系统调用使调用进程将一个目录作为自己的根目录,从而限制进程及其子进程对目录外文件的访问。(8)setuid系统调用允许进程更改其有效的用户id。在这个系统中,用户提交的代码可能是恶意的,编译后的程序需要在服务器上运行,所以必须严密监控,防止恶意代码带来的危害。本系统支持的四种语言中,C、C++和Pascal编译生成本地代码,可用于通过Linux系统调用(主要是fork、executable、chroot、setuid和ptrace)创建沙箱,限制恶意代码访问文件和控制系统权限,特别是通过ptrace可用的系统调用,从而在很大程度上保证系统的安全性。
运行时检测是最重要和最复杂的运行时监控机制。在该系统中,通过ptrace系统调用来监控用户进程。每当用户进程启动一个系统调用或接收到一些信号时,用户进程会暂时将控制权移交给监控核心。监控核心会严格监控用户进程的参数,确保其不执行危及系统安全的操作:(1)检查程序是否正常退出。(2)检查程序是否接收到异常信号。(3)用进程的分页数计算进程使用的内存资源是否超过限制。(4)检查进程系统调用是否合法。
只有在以上四个测试都没有问题的情况下,用户进程才能继续执行。
因为根据法律结果的多少,题目可以分为普通类型和特殊判断类型,所以需要针对不同的类型分别进行判断。(1)常见题型具有唯一合法结果,只需简单判断用户程序与标准答案的一致性即可。(2)对于2)特殊判断类型的题目,在本系统中约定了SPJ程序的名称和数据传输的方式,包括标准输出、用户输出和SPJ程序的数据,评测核心调用SPJ程序完成最终的评测过程。
3评价核心层的设计与实现
每当用户提交新代码时,就会调用包装器从数据库中获取代码的详细信息。这个阶段需要注意的信息主要包括:(1)用户提交的代码本身及其关键属性(如语言类型)。(2)该代码的提交用户类型为普通用户或管理员。(3)本代码所属的题目是否处于正在进行的比赛中。(4)此代码是否经过评估。