Система онлайн-судей - PullRequest
       1

Система онлайн-судей

0 голосов
/ 03 февраля 2012

Я хотел бы создать веб-сервис с некоторыми проблемами и системой судейства. Пользователь должен написать решение на C ++, а затем загрузить исходный код. Затем код должен быть скомпилирован и протестирован для определения правильности решения (как это делает TopCoder, когда вы отправляете код) Должны быть ограничения по времени и памяти для запуска решений. Существуют ли какие-нибудь готовые к использованию системы судей для создания такого сервиса в Linux?

Ответы [ 3 ]

4 голосов
/ 03 февраля 2012

Вы имеете в виду систему онлайн-судейства acm.timus.ru ?Тогда вы можете попробовать проект с открытым исходным кодом на code.google.com , и я думаю, что они используют его здесь .До этого я немного изучал этот код: в основном он предотвращает некоторые системные вызовы и измеряет затраченное время и память.Подробно, посмотрите на здесь .

2 голосов
/ 29 сентября 2012

Я использовал систему DomJudge, которая готова к онлайн-соревнованиям.http://domjudge.sourceforge.net/

1 голос
/ 03 февраля 2012

Чтобы просто проверить память и ограничения по времени, просто добавьте код в свой проект автоматически . Кроме того, см. Ограничение физической памяти на процесс , а также ограничения по памяти.

Например, для проверки памяти добавьте: (ИЗМЕНЕНО ДЛЯ ПРИМЕРА 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 # .NET, но я уверен, что вы можете найти что-то похожее.)

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 ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...