DOMjudge结构简介

最近在公司里架了个 DOMjudge。简单介绍下它的结构吧。

DOMjudge 是一个自动化的编程竞赛的判定系统,由一个 DOMjudge server 和复数个 Judgehost 构成。
DOMjudge server 给用户、评委、管理员提供网页界面。它是一个典型的 LAMP 网络应用的架构,运行于 Linux 操作系统,Apache 提供网页服务,PHP 作为 CGI 脚本,MySQL 存储数据。用户界面主要显示队伍、排名、文件提交和提交状态;评委界面是管理员界面的子集,主要用来查看队伍的答题情况,可以显示提交的源代码、测试例的输出比较等,以便评委和进行验证。管理员界面用来管理竞赛、队伍、题目等配置,大多数的配置也可以通过直接编辑 domjudge 数据库中的 configure 表进行。
Judgehost 负责编译和运行队伍提交的源代码,给出判定结果。鉴于性能考虑,Judgehost 可以有复数台,且一般不和 DOMjudge server 运行于同一台服务器。它通过守护进程连接 DOMjudge server,通过轮询的方式检查 server 是否有需要判定的代码,如有,则编译运行代码,并做出判定。有趣的是,除了编译运行的部分,Judgehost 的结构和 server 的结构非常相似。守护进程仅仅是一个 PHP 脚本,而每次轮询贯彻了 share nothing 的理念,以查询 SQL server 开始,以将判定结果写回 SQL server 结束,请求和结果的所有有关数据都由 DOMjudge server 的 SQL 数据库维护,只有判定过程的日志保存在 Judgehost。
和大多数网页服务器不同,DOMjudge 需要在 Judgehost 上运行来自用户的源代码,它不仅需要对 server 上大多数的数据保密,同时也需要对用户间的数据保密。因此安全性的考虑需要贯彻在 DOMjudge 配置过程中。另一个角度来看,尝试 hack DOMjudge 也是非常有趣的体验,特别是在某些配置没有正确设置的情况下,这将是非常容易的。比如,如果没有使用 HTTPS 访问,就有可能截获其它队伍上传的源文件和对应的判定;如果没有限制帐号的网络接入,就有可能在代码运行过程中将输入数据发送回客户端;如果没有使用 chroot 监牢和限制帐号的文件系统权限,就有可能直接破坏 Judgehost 系统,或 fork 进程篡改数据库,或将运行后的输出数据保留在共享文件中以便其它队伍利用;等等。于是,在安全性方面,简要来说,用 HTTPS 保护网络传输,用配置和密码来保护 DOMjudge server,用帐号权限(限制文件系统和网络接入资源)、chroot(隔离运行环境)、setrlimit(限制CPU、内存、进程等资源)来保护 Judgehost。

一个有趣的启发是尝试用 SQL 来做轻量级的客户端程序。在界面和数据处理中彻底贯彻 share nothing,将所有的程序状态全部保存在 SQL 数据库中。这样做的好处之一是可以将线程/进程间的数据同步完全交给数据库系统处理,UI线程只从数据库取得数据加以展现,工作线程/进程从数据库取得数据,处理后再写回数据库;之二是数据库的 ACID 特性可以保证程序状态的完整性,并很自然的实现了程序状态的保存和恢复。使用适当的中间层的话 SQL 语法也不会造成困难,也可以使用对象数据库代替关系数据库。

Advertisements
This entry was posted in ACM, Computer and Internet, Operation System and Linux and tagged , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s