在做一个 OJ 系统的评测机,需要做一个容器隔离用户程序,并且监控程序使用到的内存大小和时间
别人推荐使用 cgroup 以及 clone 、ubshare 的系统调用,可是找不到相关资料
大家有什么方法推荐吗?
在做一个 OJ 系统的评测机,需要做一个容器隔离用户程序,并且监控程序使用到的内存大小和时间
别人推荐使用 cgroup 以及 clone 、ubshare 的系统调用,可是找不到相关资料
大家有什么方法推荐吗?
|
zxCoderMar 14, 2021
1
我有一个方法。。。上 github 借鉴借鉴。。。
|
|
learningmanMar 14, 2021
2
uoj 的做法好像是 docker
|
|
casparchenMar 14, 2021 via iPhone
3
|
|
mooyoMar 14, 2021
4
做的第一个项目就是和同学一起搞了个 oj,评测机直接拉一个 docker 起来跑完删掉。。。我记得这个方案的缺陷是无法区分内存爆掉和超时的情况?
|
|
5
@zxCoder 代码完全读不懂
|
|
zxCoderMar 15, 2021
6
@SunspotsInys 那也得硬读。。。我想应该不会有资料一步一步教怎么做一个评测机
|
|
whusnoopyMar 15, 2021
7
去搜搜本科论文库,有不少 CS 的哥们本科毕业设计做的这个
|
|
draymonderMar 15, 2021
8
以前的一个面试官写的,并且用在他们学校的校赛上了,你可以参考一下,整体不难,一个调度中心,一堆 worker https://github.com/ma6174/acmjudger
|
|
LanceLRQMar 15, 2021
9
如果想了解一下简单的判题原理的话可以看看我的博客文章 https://www.lanrongqi.com/2020/08/online-judge-development-2 ,这个是我自己用的 go 写的判题机 https://github.com/LanceLRQ/deer-executor , 不过没有实现沙箱功能,生产环境是直接放 docker 里跑的。也没用到 cgroup 那些,在学了在学了...╮( ̄▽ ̄)╭
顺便给你个我虽然没用过但是看源代码感觉还蛮厉害的 go 语言判题机 https://github.com/criyle/go-judge 一起学习交流呀 |
|
nurexMar 15, 2021
10
考虑下用 Docker 吧,如果有人乱搞得考虑 OJ 被黑掉的场合
|
|
gamexgMar 15, 2021
11
|
|
12
@LanceLRQ 就是这个源码我看不懂,配上作者的博客也无法理解
|
|
qbqbqbqbMar 15, 2021
13
非主流方法:如果评测机用的是 Ubuntu 等自带 AppArmor 的系统的话,倒是可以不用容器,通过 AppArmor 来实现安全加固。
内存和时间限制,一般来说是联用轮询和 rlimit 系统资源限制: 1 )定时器限制时间+轮询采样内存消耗情况作为主要监控手段,用于反馈 TLE/MLE 2 ) rlimit 系统限制设得比题面描述高一些,用来保底 (不单用 rlimit 是因为超限程序会被直接杀死,从而无法区分 RE, TLE 和 MLE ;而且无法限制程序的非用户态时间) |
|
qbqbqbqbMar 15, 2021
14
另外,安全方面还有 ptrace, seccomp 等传统方法。
|
|
15
@qbqbqbqb 嗯,我再试试
|