OnlineJudge判题平台 ——后台流程

判题分两部分

1.其中judged为服务进程,d即daemon。负责轮询数据库,提取判题队列。当发现新任务时产生judge_client进程。

2.judge_client进程为实际判题程序,负责准备运行环境、数据,运行并监控目标程序的系统调用,采集运行指标,判断运行结果。

Judged流程

初始化:

1.创建子进程pid_judged,并设置为会话的领头进程(umask(0),close(0~2))

2.改变当前工作目录为“/home/judge”

3.将pid_judged写入文件“/home/judge/etc/judge.pid”,并且加入写锁(用来检查该服务进程是否已经在执行)

4.设置SIGQUIT,SIGKILL,SIGTERM来触发call_for_exit函数结束服务进程的执行

轮询:

5.连接数据库(host_name,user_name,password,db_name,port_number)

6.轮询数据库中的solution表,将未测评的用户提交扔进任务队列

7.从任务队列提取任务给“判题进程”(子进程),并标记该任务为“正在测评”

8.使用rlimit结构体和setrlimit()设置“判题进程”的允许的最大CPU运行时间,可以创建的最大文件字节数,可用内存最大字节数,可拥有最大进程数(200)

9.调用execl函数执行/usr/bin/judge_client,并传递参数为任务id,judge_client_id

Judge_client流程

初始化:

1.设置工作目录为/home/judge

2.获取任务id,judge_client_id

3.连接数据库

4.设置工作目录为workdir=“/home/judge/run?”

5.解挂文件系统:workdir/proc,删除workdir/下的所有文件和目录

编译:

6.查询数据库获取题目id,用户id,语言类型

7.查询数据库获取 题目规定的最大运行时间time_lmt,最大内存mem_lmt

8.查询数据库获取用户提交的代码并写入Main.cc文件

9.创建子进程使用execvp函数执行g++命令编译Main.cc文件,并将编译信息写入ce.txt文件中

10.父进程调用waitpid函数来等待子进程编译结束,通过查看ce.txt文件来判断是否为编译错误,若为编译错误则退出

提取输入输出数据

11.在/home/judge/data/获取题目输入数据文件并保存路径为infile

12.将题目输入数据拷贝到workdir/data.in文件

13.获取题目输出数据文件并保存路径为outfile,创建user.out文件并保存路径为userfile

运行目标程序:

14.创建子进程pidApp,重定向输入输出流,从data.in读入数据,运行结果写入user.out,运行错误信息写入error.out

15.使用ptrace(PTRACE_TRACEME,
0, NULL, NULL)函数来使父进程跟踪自己

16.设置工作目录workdir为根目录(chroot()),提高系统安全性

17.使用rlimit结构体设置进程的CPU运行时间,可以创建最大文件字节数,可拥有最大进程数(1),拥有的堆栈数,可用内存数

18.alarm()设置定时器

19.调用execl使进程执行Main文件(目标程序)

监控目标程序:

20.父进程调用wait4(pidApp,&status,0,&ruse)来获取子进程暂停或中止时的返回状态和查看进程的使用资源情况

21.查看workdir/pro/pidApp/status里的VmPeak:属性的值,这个值是进程使用的最大内存数,如果超出限制,则ptrace(PTRACE_KILL,pidApp,NULL,NULL);退出监控

22.调用WIFEXITED(status)判断子进程是否正常结束

23.查看error.out文件,如果有内容则为运行错误,KILL掉子进程,监控结束

24.如果userfile的size > outfile的size*2,则为结果超出限制,kill掉子进程,监控结束

25.exitcode=WEXITSTATUS(status)获取子进程exit()返回的结束代码,如果为0或5则为正常,否则为异常结束,根据信号的类别给出相应错误,比如SIGALRM为计时器时间到了信号,SIGXCPU为运行时间到了信号,SIGXFSZ为输出文件大小超出信号等等

26.调用WIFSIGNALED(status)检查是否为异常结束(子进程通过信号结束)

27.调用sig=WTERMSIG(status)取得使子进程结束的信号编号,根据sig的类别给出相应的错误

28.调用ptrace(PTRACE_GETREGS,pidApp,NULL,&reg)来取得进程的寄存器信息(reg.REG_SYSCALL),检查系统调用函数的使用情况,若为禁止的系统调用函数则KILL掉子进程并将运行错误写入结果AC_status,结束监控

29.调用ptrace(PTRACE_SYSCALL,pidApp,NULL,NULL)使子进程继续执行

30.在监控结束以后统计usedtime+=ruse.ru_utime(用户使用时间)+ruse.ru_stime(系统使用时间)

31.根据AC_status的值更新数据库

感谢hustoj开源代码及作者!

OnlineJudge判题平台——后台流程

时间: 2024-07-28 19:25:22

OnlineJudge判题平台 ——后台流程的相关文章

OnlineJudge 离线题库采集

过段时间要把以前的OJ换掉,我负责VirtualJudge的部分.需要用C与PHP写一个Linux下的VJudge. 在此之前,将以前写给自己学弟学妹用的OJ离线题库的采集程序改进了一下.支持国内一些知名高校的OJ,为之后VJudge的开发练练手,熟悉下各个OJ的结构,免去以后再在LINUX上进行一些繁琐的测试. 题目的采集没有使用任何OJ的API,直接采取从HTML页面采集数据并处理的方式.下载HTTP文件使用的是WinINet函数集,用起来比CURL还方便.正则表达式使用的ATL库里的reg

C#-JudgeSystem判题系统-开放实验总结

花了一周的时间去做这个实验中间断断续续完成不同的部分,按照实验过程来一步一步完成感觉实验流程还是相当合理的 上图就是最后的成品,其中包括 JudgeCilent客户端 完成部分: 1.可以提供五种测试状态的显示,包括网络异常,编译失败,输入错误(超时),结果错误,接受,五个状态 2.可以对无输入程序进行测试 3.可修改ip地址与端口 可提高部分: 1.由于该程序只是辅助测试服务器的使用的,所以并没有做一下界面的优化比如线程运行优化来避免等待服务器返回时界面不响应的现象 JudgeServer服务

牛客网在线判题系统JavaScript(V8)使用

JavaScript作为一种弱类型的编程语言,语法和C/C++.JAVA等存在差别,但是对于大部算法题,不只是C/C++.JAVA,也依然可以使用JavaScript来实现.所以在牛客网中,如果你喜欢JavaScript这门编程语言,同时对数据结构与算法感兴趣,当然可以使用这门语言去刷编程题. 大家有没有跟我碰到过和我类似的情况,在牛客网刷编程题的时候,编译器提供的是Javascript(v8 6.0.0),在线编程部分前端编程还好,只用在题目给出的函数中补充就行.但苦恼的是,我们不知道如何像C

ZZNU 1163: 在线判题(指针专题)

题目描述 Ignatius is building an Online Judge, now he has worked out all the problems except the Judge System. The system has to read data from correct output file and user's result file, then the system compare the two files. If the two files are absolu

thinkphp开发微信小程序后台流程

thinkphp开发微信小程序后台流程,简单分享一下微信开发流程 1,注册微信小程序账号 2,注册好后,登陆微信小程序,下载微信小程序开发工具 3,用thinkphp开发企业后台,前台数据用json返回,赋值给微信小程序 需要注意的是要绑定(www.hq08.cn)已经备案的域名,还域名要https 的 原文地址:https://www.cnblogs.com/96net/p/9403506.html

FILEBEAT+ELK日志收集平台搭建流程

filebeat+elk日志收集平台搭建流程 1.         整体简介: 模式:单机 平台:Linux - centos - 7 ELK:elasticsearch.logstash.kibana三款开源软件的集合. FILEBEAT:代替logstash的采集功能,轻量.耗用小. 目前收集的有nginx日志.java日志[单行|多行]. 都是通过在客户端的生成日志配置文件中定义好初步json格式,然后利用filebeat采集到logstash,存储到elasticsearch,最后通过k

电商平台搭建流程梳理

最近部署了一套电子商务平台,现将整个过程进行一次梳理. 1.  首先明确业务上的流程 项目发起 制定方案 系统安装 部署Nginx.Tomcat 解析域名 测试 加监控 备份 2. 执行1的内容 2.1制定方案 根据项目情况制定方案,拓扑图如下 思路,前段使用硬件负载均衡 banggoo ,将访问负载到nginx,nginx 再将请求反向代理到后端的tomcat上. 服务器一共购买了4台,其中2台作为数据库服务器,另外两台使用虚拟机,每台服务器虚拟5台服务器. 每台服务器配置.操作系统.分区.主

开发者服务:第三方登录平台接入流程

第三方登录服务简介: 第三方登录平台为开发者整理了SDK列表,辅助开发者快速接入qq.百度.微博人人等平台登录,通过添加分享和赞组件,将站点内容分享到各大社交平台,适用于pc&移动,简单配置和调用,可轻松搭建完成账号功能. 第三方登录有哪些? 腾讯qq互联平台:通过QQ互联,用户可使用QQ账号登录接入的站点,通过添加分享和赞组件,将站点内容分享到QQ空间和朋友网. 百度第三方帐号登录:支持新浪微博,腾讯微博,QQ空间,开心网,人人网,百度等社交平台的授权,同时还支持新浪微博,QQ空间的单点登陆.

第三方登录平台接入流程

第三方登录服务简介: 第三方登录平台为开发者整理了SDK列表,辅助开发者快速接入qq.百度.微博人人等平台登录,通过添加分享和赞组件,将站点内容分享到各大社交平台,适用于pc&移动,简单配置和调用,可轻松搭建完成账号功能. 第三方登录有哪些? 腾讯qq互联平台:通过QQ互联,用户可使用QQ账号登录接入的站点,通过添加分享和赞组件,将站点内容分享到QQ空间和朋友网. 百度第三方帐号登录:支持新浪微博,腾讯微博,QQ空间,开心网,人人网,百度等社交平台的授权,同时还支持新浪微博,QQ空间的单点登陆.