跳到主内容
EN

打开命令面板

搜索文章、系列、自习室课程或外接设备…

从零开始的代码评测系统设计与实践

判题机内核是怎么造出来的——从 fork 一个进程开始,讲到资源限制、结果判定与特殊评测,最后收束成一套可开源的判题服务方案。

共 6 篇

  1. 第 1 篇从零开始的代码评测系统设计与实践(序)

    OJ 系列开篇。五年前一次和老师的突发奇想,从此一头扎进在线判题系统的开发。这篇讲清楚 OJ 是怎么工作的、WeJudge 这些年是怎么长起来的,以及接下来这个系列打算聊什么。

  2. 第 2 篇从零开始的代码评测系统设计与实践(一) —— 进程和输入输出

    OJ 系列第一篇。从 fork()/vfork() 创建进程讲起,到进程调度的就绪/执行/阻塞三态,再到用 dup2 重定向标准输入输出、用 wait4 等待子进程退出——判题机内核最基础的一层地基。

  3. 第 3 篇从零开始的代码评测系统设计与实践(二) —— 资源占用与限制

    OJ 系列第二篇。用 setrlimit 卡住 CPU 时间、内存和文件大小的硬限制,再靠 setitimer 的 ITIMER_PROF 补上毫秒级精度——TLE、MLE、OLE 判定背后的资源限制实现细节。

  4. 第 4 篇从零开始的代码评测系统设计与实践(三) —— 运行结果处理

    OJ 系列第三篇。拿到 rusage 之后怎么算出运行时间和内存占用,SIGSEGV、SIGXCPU、SIGKILL 这些信号怎么翻译成 TLE / MLE / RE / OLE,以及双游标法比对输出、处理 PE 格式错误的坑。

  5. 第 5 篇从零开始的代码评测系统设计与实践(四) —— 特殊评测

    OJ 系列第四篇。严格比对遇上浮点数精度就懵了,于是把判定权交给出题者自己写的检查器。这篇讲特殊评测、交互判题的实现原理,以及 Testlib 这套工具能帮出题人省多少事。

  6. 第 6 篇从零开始的代码评测系统设计与实践(五) —— 新的开始

    OJ 系列第五篇,也是这轮连载的收尾。复盘 WeJudge 三个大版本踩过的产品和技术坑,宣布要把判题功能拆成独立的 WeJudge Polygon 服务,以及 deer-executor 从 v1 到 v2 的演进史。