65632f0e60dff783c7c07b055e493e6a372cb627
BitOJ - Online Judge System
BitOJ是一个功能完整的在线程序设计竞赛评测系统服务端,支持多语言编程、自动化评测、安全沙箱环境等核心功能。
系统概述
BitOJ采用分布式架构设计,通过XML-RPC协议与前端Web系统通信,支持高并发评测任务处理。系统具备完善的安全机制,能够在受限环境中安全执行用户提交的代码。
功能特性
核心功能
- 多语言支持: 支持C/C++、Java、Python、Pascal、C#、Bash等多种编程语言
- 自动评测: 自动编译、运行、比对输出结果
- 安全沙箱: 限制程序执行时间、内存使用、文件访问等
- 分布式架构: 支持多评测机协同工作
- 灵活的判题: 支持标准比对、容错比对、自定义判题脚本
评测结果类型
- AC (Accepted): 程序正确
- WA (Wrong Answer): 答案错误
- TLE (Time Limit Exceeded): 超时
- MLE (Memory Limit Exceeded): 内存超限
- RE (Runtime Error): 运行时错误
- CE (Compile Error): 编译错误
- PE (Presentation Error): 格式错误
- OLE (Output Limit Exceeded): 输出超限
- SE (System Error): 系统错误
系统架构
目录结构
bitoj/
├── python/ # 核心Python模块
│ ├── engine.py # 评测引擎主控制器
│ ├── datasource.py # 数据源管理(XML-RPC通信)
│ ├── entity.py # 数据实体定义
│ ├── engineconfig.py # 引擎配置管理
│ ├── judgescript.py # 判题脚本管理
│ ├── tester.py # 测试器实现
│ └── ojunit.py # 单元测试基类
├── scripts/ # 脚本文件
│ ├── compare-file.py # 文件比较工具
│ └── run-guard.py # 运行时沙箱守护
├── utils/ # 工具类
│ └── xmlrpc-debug-proxy.py # XML-RPC调试代理
└── conf-demo.py # 配置示例文件
核心模块说明
JudgeEngine (engine.py)
评测引擎核心控制器,负责:
- 多线程任务调度
- 提交队列管理
- 评测流程控制
- 异常处理和恢复
DataSource (datasource.py)
数据源管理模块,提供:
- XML-RPC通信接口
- 数据库连接管理
- 提交信息获取
- 结果回写功能
- 网络异常重试机制
Tester (tester.py)
测试器实现,包含:
- SimpleTester: 单一语言测试器
- ComboTester: 组合测试器(如bounds checking)
- 编译环境管理
- 运行时沙箱控制
- 资源限制监控
Entity (entity.py)
数据实体定义:
- Submit: 代码提交实体
- Problem: 题目信息实体
- TestCase: 测试用例实体
- PresetCode: 预置代码实体
支持的编程语言
| 语言 | 版本 | 编译器 | 特殊功能 |
|---|---|---|---|
| C | GCC 3.3 | gcc-3.3 | 支持bounds checking |
| C++ | GCC 3.3 | g++-3.3 | 标准C++支持 |
| Java | 1.5/1.6 | javac | JVM内存管理 |
| Python | 3.x | python3 | 解释执行 |
| Pascal | FPC 2.2 | fpc | Free Pascal |
| C# | Mono 2.0 | gmcs | .NET框架 |
| Bash | 3.x | bash | Shell脚本 |
安全机制
资源限制
- 时间限制: 可配置的CPU时间上限
- 内存限制: 虚拟内存使用限制
- 进程限制: 子进程数量控制
- 文件限制: 输出文件大小限制
沙箱隔离
- 用户隔离: 使用专用的ojrun用户执行代码
- 目录隔离: 限制文件系统访问范围
- 权限控制: 最小权限原则执行用户代码
安全防护
- 恶意代码检测: 过滤危险系统调用
- 网络访问限制: 禁止网络连接
- 文件权限管理: 只读访问数据文件
安装配置
系统要求
- Linux操作系统 (推荐Ubuntu/Debian)
- Python 2.6+
- 相应编程语言的编译器/解释器
- sudo权限用于沙箱管理
用户配置
创建评测专用用户:
# 创建ojrun用户组
for i in {01..99}; do
sudo useradd -m -s /bin/false ojrun$i
done
目录设置
# 创建必要目录
sudo mkdir -p /var/lib/bitoj
sudo chmod 755 /var/lib/bitoj
# 设置数据目录
mkdir -p data/default
mkdir -p log
配置文件
复制并编辑配置文件:
# 基于conf-demo.py创建配置
config.add_xmlrpc_datasource('http://your-oj-frontend/ojfeeder.php')
config.debug = False
config.no_cleanup = False
使用方法
启动评测引擎
cd bitoj/python
python engine.py
配置数据源
# 添加XML-RPC数据源
config.add_xmlrpc_datasource('http://frontend-url/ojfeeder.php')
# 配置评测线程数
config.test_threads = 4
# 设置获取间隔
config.fetch_interval = 1
自定义判题
系统支持三种判题方式:
- 标准文本比较: 逐字符比较输出
- 容错文本比较: 允许格式错误(PE)
- 自定义判题脚本: 支持特殊判题逻辑
API接口
XML-RPC方法
get_submits(judge_id, limit): 获取待评测提交get_problem(problem_id): 获取题目信息get_tests(problem_id, full): 获取测试用例update_submit_status(submit_id, status): 更新提交状态update_submit_test_results(submit_id, results): 更新测试结果
性能优化
并发评测
- 支持多线程并发评测
- 可配置评测线程数量
- 智能任务队列管理
缓存机制
- 测试用例文件缓存
- 预置代码缓存
- 编译结果复用
资源管理
- 用户池管理避免用户耗尽
- 临时文件自动清理
- 内存使用监控
监控和调试
日志系统
- 详细的执行日志记录
- 可配置的日志级别
- 异常堆栈跟踪
调试工具
- XML-RPC调试代理
- 单元测试覆盖
- 性能分析支持
状态监控
- 评测队列长度监控
- 系统资源使用统计
- 异常错误计数
扩展开发
添加新语言支持
- 在
engineconfig.py中定义新的SimpleTester - 配置编译和运行命令
- 设置资源限制参数
- 编写相应的guard脚本
自定义判题脚本
class CustomJudge:
def judge(self, sid, tid, tin, tout, result, errfile, rundir=None):
# 实现自定义判题逻辑
return 'AC' # 返回判题结果
故障排除
常见问题
- 编译失败: 检查编译器路径和权限
- 运行超时: 调整时间限制配置
- 权限错误: 确认ojrun用户配置正确
- 网络错误: 检查XML-RPC连接配置
调试步骤
- 启用debug模式:
config.debug = True - 保留临时文件:
config.no_cleanup = True - 查看详细日志输出
- 使用单元测试验证功能
安全注意事项
- 定期更新: 保持系统和编译器版本更新
- 权限最小化: 确保ojrun用户权限最小
- 网络隔离: 评测机与外网隔离
- 监控异常: 建立异常行为监控机制
许可证
本项目遵循开源许可证,详情请查看LICENSE文件。
贡献指南
欢迎提交问题报告和功能请求。如需贡献代码,请:
- Fork本仓库
- 创建功能分支
- 提交改动
- 发起Pull Request
联系方式
如有问题或建议,请通过以下方式联系:
- 提交Issue到GitHub仓库
- 发送邮件到项目维护者
BitOJ - 为编程竞赛提供可靠的评测服务
Description
Languages
Python
92.3%
Shell
7.7%