【HUSTOJ 判题机源码解读系列04】判题机常见技术选择方案

【HUSTOJ 判题机源码解读系列04】判题机常见技术选择方案

从本文开始,我们就需要准备开始解读 HUSTOJ 中最核心的 judge_client.cc 文件的前置知识了。

作为真正判题的模块,我们需要理解其实现原理,使用了哪些技术,不过既然本文标题为“判题机常见技术选择方案”,应是不局限于 HUSTOJ 选择的技术方案,还应该介绍一些其他的技术方案,扩展一下知识的广度也是好的。

1. 判题机的职责

在了解常见的技术方案之前,我们在这里先明确一下判题机最核心的职责,我将其划分两个主要部分:

  1. 沙箱部分:提供一个受限的执行环境,负责编译和运行用户代码,并收集标准输出。沙箱的关键在于安全性,包括但不限于,防止恶意代码破坏服务器、限制 CPU 和内存占用、拦截危险的系统调用等等。
  2. 评测部分:判断用户代码的执行结果是否正确,包括检查算法是否符合预期、是否超出时间或内存限制,以及标准输出格式是否合规等。

此外,有些博客和教程会把判题任务调度也归入判题机的范畴,但我更倾向于把它作为上层服务,让判题机专注于代码执行和评测。这样不仅逻辑更清晰,也更利于系统扩展和维护。

评测部分实际上就是主要做了两件事,一是如果用户代码有执行有异常,需要确定异常是什么,并返回异常信息。二是如果没有异常,那就将用户标准输出文件和标准答案文件进行比对,查看输出是否一致。

这两件事实践起来都非常简单。判题机真正的难点是如何实现一个安全、高效的代码沙箱。

2. 沙箱部分实现技术方案

2.1 基于 ptrace + setrlimit + chroot 实现(HUSTOJ 的技术方案)

在 Linux 中,ptrace 和 setrlimit 分别用于进程控制资源限制,而 chroot 则可以对文件系统进行隔离。

2.1.1 使用 ptrace 拦截危险的系统调用

利用 ptrace 允许父进程监视和控制子进程的机制,我们可以拦截危险的系统调用。在 Linux 下,每个系统调用都有一个唯一的编号(如 open、close 可能对应 2 和 3,具体编号取决于 CPU 架构)。当进程执行系统调用时,这个编号会存放在 rax 寄存器(对于 x86_64 架构)中。

现在我们就可以实现:

  • 拦截系统调用:在子进程执行 syscall 时暂停它,并读取 rax 寄存器中的系统调用编号。
  • 比对白名单:维护一个允许调用的系统调用列表,如果 rax 中的编号不在白名单内,我们就可以判定这个进程想要执行恶意代码,就直接终止该进程。

这样,我们就能有效拦截危险的系统调用,如 execve()(执行新进程)、fork()(创建子进程)等,避免代码逃逸或破坏服务器。然而,ptrace 的开销较大,因为它需要在每次系统调用发生时暂停进程,并在用户态与内核态之间频繁切换,十分影响运行效率。

2.1.2 使用 setrlimit 实现资源控制

使用 setrlimit 可以直接用于限制进程 CPU、内存、磁盘等,具体实现如下:

  • 限制 CPU 运行时间(防止死循环):setrlimit(RLIMIT_CPU, time_limit);
  • 限制最大内存使用(防止 OOM):setrlimit(RLIMIT_AS, memory_limit);
  • 限制最大文件大小(防止恶意生成大文件):setrlimit(RLIMIT_FSIZE, max_file_size);
2.1.3 使用 chroot 隔离文件系统

chroot 允许改变进程的根目录视图,让进程只能访问特定的文件系统。例如,OJ 评测机可以使用 chroot("/sandbox"),让代码只能访问 /sandbox 目录,而无法访问 /etc/passwd 等系统文件,从而提供一定程度的文件隔离。

但是 chroot 其实是有进程逃逸的风险的。如果进程拥有 CAP_SYS_CHROOT 权限,或者能够执行某些系统调用(如 pivot_root),就可能绕过 chroot 限制。

2.2 基于 seccomp + cgroup + namespace + pivot_root 实现

2.2.1 实现 seccomp 实现拦截危险的系统调用

seccomp 允许进程以白名单模式运行,只允许执行特定的系统调用,其他所有系统调用都会被拒绝(SCMP_ACT_KILL)或者返回错误(SCMP_ACT_ERRNO)。

并且 seccomp 直接在内核级过滤 syscall,不会像 ptrace 那样需要执行进程暂停 & 用户态切换,手动判断系统调用是否合规,导致进程运行缓慢。

2.2.2 使用 cgroup 实现资源控制

cgroup 是 Linux 提供的基于文件系统的进程资源控制机制,可以对一组进程进行CPU、内存、I/O、进程数等资源的限制

通过向对应的文件写入配置:

echo 50000 > /sys/fs/cgroup/cpu/oj/cpu.cfs_quota_us

可以有效的限制限制进程组使用的系统资源,并且相对于 setrlimit 只能限制单个进程来说,cgroup 能够限制一整个进程组,并且数据更准确。

2.2.3 使用 namespace + pivot_root 隔离进程运行环境

Linux 提供的 namespace 机制允许进程在隔离的环境中运行,使其看不到宿主机的其他进程和资源。在此基础上,通过 bind mountpivot_root隔离进程运行环境的文件系统,能够进一步的确保用户程序不会影响到服务器。

3. 使用 docker、podman 等容器软件(HUSTOJ 也支持)

除了自己实现一个代码沙箱,我们还可以使用 DockerPodman 这样的容器软件来作为代码沙箱。实际上,Docker 和 Podman 的底层也是基于 CgroupNamespace 等 Linux 内核技术来实现进程隔离和资源控制的。

选择这种方式的最大优点就是 “简单”。这些开源容器软件已经封装好了底层逻辑,我们无需手动实现复杂的 进程管理、文件系统隔离、资源限制 等机制,直接使用现成的容器功能就行。而且,Docker 和 Podman 经过长期的社区维护,安全性、稳定性和兼容性都非常优秀。

但缺点在于灵活性较低。由于 Docker 和 Podman 并非专门为代码沙箱设计,而是通用的容器运行时,无法针对 OJ 评测机、在线编译环境等特殊需求进行深度优化。此外,通用容器的额外封装层会更消耗性能,性能可能比不上为 OJ 定制的沙箱

4. 总结

本文我们介绍了实现代码沙箱的常见的几种方案,而 HUSTOJ 使用的 ptrace + setrlimit 的方案已经足够满足一个 OJ 判题机的所需,其优点是简单,缺点是效率有问题。

下期仍和本期一样,属于技术介绍类型,主要内容就是介绍 ptrace 如何使用,了解了 ptrace 怎么使用之后再开始分析 judge_client.cc 的具体实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19656.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware 17 安装 VMTools(win 7旗舰 X64)

由于在VM 17中安装的 win 7虚拟机没有安装VM Tools 的原因,界面有大黑边,也无法直接拖拽复制粘贴文件(但是如果只是要复制文件,最简单的方法还是使用U盘),所以下面开始安装VM Tools 。 若直接选择VM软件中的…

【MySQL】我在广州学Mysql 系列——Mysql 日志管理详解

ℹ️大家好,我是练小杰,今天又是新的一周了,又该摆好心态迎接美好的明天了!!!😆 本文主要对Mysql数据库中的日志种类以及基本命令进行讨论!! 回顾:&#x1f4…

python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注

【1】引言 前序学习进程中,已经使用cv2.findContours()函数cv2.drawContours()函数实现图像轮廓识别和标注,这种标注沿着图像的轮廓进行,比较细致。相关文章链接为: python学opencv|读取图像(六十四)使用…

DeepSeek-V3 技术报告

DeepSeek-V3 Technical Report https://arxiv.org/abs/2412.19437 1. 核心贡献 DeepSeek-V3 是一个拥有 6710 亿参数的大规模混合专家(MoE)语言模型,每个 token 激活 370 亿参数。 该模型通过创新的架构设计和训练策略,实现了高效…

PCIe7.0信号完整性优化的一些方向

首先考虑过孔stub的影响,分别仿真10mil stub,6mil stub,3mil stub以及无stub四种情况,观察insertion loss/ return loss/TDR Impedance profile、crosstalk四个参数对比情况。 仿真对比结果如下: 其次,考虑…

学习threejs,使用PointLight点光源

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.PointLight 二、&…

30填学习自制操作系统第二天

今天要干什么? 初步了解汇编语言使用汇编重新写个昨天的镜像文件继续开发 一: 什么是电信号? 电脑的处理中心是CPU,即“central process unit”的缩写,翻译成中文就是“中央处理单元”,顾名思义,他就是…

Python的顺序结构和循环结构

文章目录 一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(c)多分支 if-elif-elif-...-else (3)注意事…

金蝶云星空点击按钮实现指定文件下载

文章目录 金蝶云星空点击按钮实现指定文件下载业务需求开发实现 金蝶云星空点击按钮实现指定文件下载 业务需求 点击按钮,下载excel 开发实现 创建表单插件,在按钮点击事件,调用附件下载窗口进行指定路径的指定文件下载 模板存放路径 …

EasyExcel的简单使用

EasyExcel使用 官方文档&#xff1a;关于EasyExcel 1.1EasyExcel相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version></dependency> 1.2 写Excel 1.2.1 最…

游戏引擎学习第107天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中&#xff0c;讨论了如何处理游戏中的三维效果&#xff0c;特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型&#xff0c;因此实现三维效果变得非常具有挑战性。虽然可…

「vue3-element-admin」基于 TypeScript 的 ECharts 按需引入方案实战 - Vue3 项目打包体积优化 57%

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

用Python实现图像风格迁移的技术分析

文章目录 一、概要 二、效果预览 三、整体架构流程 1. 用户界面(GUI): 2. 图像加载与显示: 3. 风格迁移核心算法: 4. 结果显示与保存: 5. 多线程处理: 四、技术名词解释 1. OpenCV: 2. TensorFlow: 3. VGG19: 4. GUI(图形用户界面): 5. 多线程: 五…

gsoap实现webservice服务

gsoap实现webservice服务 在实现Web服务时&#xff0c;使用gSOAP是一个很好的选择&#xff0c;因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C语言开发的库&#xff0c;它支持SOAP协议的各种版本&#xff0c;包括SOAP 1.1和SOAP 1.2。下面是如何使用gSO…

穷举 vs 暴搜 vs 深搜 vs 回溯 vs 剪枝

穷举 vs 暴搜 vs 深搜 vs 回溯 vs 剪枝 1. 全排列2. 子集 1. 全排列 题目链接&#xff1a;46. 全排列 算法原理&#xff1a; 画出决策树 设计函数 全局变量&#xff1a;二维数组ret存储结果&#xff1b;一维数组path存储路径&#xff1b;boolean类型一维数组visited表示当…

NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略

目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换&#xff08;SNAT&#xff0c;Source NAT&#xff09;&#xff1a; 目标地址转换&#xff08;DNAT&#xff0c;Destination NAT&#xff09;&#xff1a; 端口地址转换&#xff08;PAT&#xff0c…

OpenCV图像基本操作

学习目标&#xff1a; 学习一些OpenCV中对于图像的基本操作 学习内容&#xff1a; 第一步导入库和所需的图像。 import cv2 import numpy as np imgcv2.imread("lena.png") # cv2.imshow("img",img) # cv2.waitKey(0) 访问和修改图片像素 访问图片像素…

具身智能在智能巡检机器人中的应用——以开关柜带电操作机器人为例

随着机器人技术和人工智能的迅速发展&#xff0c;具身智能在各行业的应用日益广泛&#xff0c;尤其是在电力行业中的智能巡检领域。传统的电力巡检和维护工作通常需要人工操作&#xff0c;存在着高温、高压、强电磁场等危险环境&#xff0c;且效率较低。开关柜带电操作机器人作…

巨控GRM530系列的远程模块用于PLC远程上下载方案

巨控GRM530系列的远程模块用于PLC远程上下载方案 一、方案概述 巨控科技基于全球加速服务器与智能通讯模块&#xff0c;提供高效、安全的工业设备远程上下载及维护服务。支持多协议PLC、触摸屏、运动控制器等设备&#xff0c;突破地域限制&#xff0c;实现跨国、跨网络的无缝调…

fastadmin快速搭建导航站和API接口站点系统

这份源码是基于fastadmin框架制作的&#xff0c;不仅可以快速搭建漂亮的导航站和API接口站点&#xff0c;而且还具有可扩展性和定制性。源码开放&#xff0c;方便二次开发和定制&#xff0c;适合各种需求。快来体验这个功能强大的站点源码&#xff0c;为您的项目提供便捷解决方…