在线评委系统

Online judge system

本文关键字:系统 在线      更新时间:2023-10-16

我想创建有一些问题的web服务并判断系统。用户应该用C++编写解决方案,然后上传源代码。然后应该编译代码并进行测试,以确定解决方案是否正确(就像TopCoder在提交代码时所做的那样)。运行解决方案应该有时间和内存限制。是否有一些现成的判断系统可以在Linux上创建这样的服务?

你是说像acm.timus.ru这样的在线评委系统吗?然后你可以在code.google.com上尝试开源项目,我想他们在这里使用它。在此之前,我对代码进行了一点研究:基本上,它可以防止一些系统调用,并测量花费的时间和内存。详细信息,请看这里。

我使用了DomJudge系统,该系统已为在线比赛做好准备。http://domjudge.sourceforge.net/

只需检查内存和时间上限,只需将代码自动添加到其项目中。另请参阅限制每个进程的物理内存以了解内存上限。

例如,要检查内存,请添加:(为LINUX示例编辑)

#include "sys/types.h"
#include "sys/sysinfo.h"
#inlcude <stdio.h>
#include <pthread.h>
public long long getMemoryUsage()
{
     sysinfo (&memInfo);
     long long totalVirtualMem = memInfo.totalram; //Total physical memory
}

并在其Main()中添加一个新线程,该线程调用如下函数:

private const long long MAXMEMORY = 1024; // Memory cap
private const int LIMITAPPLICATION = 100; // 10 seconds
private void TimeLimitToApplication()
{
    //LIMITAPPLICATION represents how many 100ms's must 
    //pass until time limit is reached. 
    while(COUNTER < LIMITAPPLICATION)
    {
        sleep(100);
        /* Include if including code block below
        if(CheckProcessThreadsIsComplete()) break;
        */
        //Check memory usage every 100ms
        if(getMemoryUsage() > MAXMEMORY)
            break;
        COUNTER++;
    }
    pgid = getpgid();
    kill(pgid, 15);
}

您可能还需要添加另一项检查,以查看是否已完成所有线程:(我只有一个C#的例子,但我相信你可以找到类似的东西。)

public static bool CheckProcessThreadsIsComplete()
{
  Process[] allProcs = Process.GetProcesses();
  foreach(Process proc in allProcs)
  {
     ProcessThreadCollection myThreads = proc.Threads;
     foreach(ProcessThread pt in myThreads)
     {
        //Ignore thread that you started to do time and memory checks
        if(pt.Id == TIMELIMIT_AND_MEMORYCHECK_THREAD_ID) continue;
        if(pt.ThreadState != (ThreadState.Unstarted | ThreadState.Stopped | ThreadState.WaitSleepJoin | ThreadState.Aborted)
            return true; // all threads are not completed
     }
  }
  return false; // all threads are completed
}

并将其添加到TimeLimitToApplication()中的检查中;