为什么在线判题系统在在线编程竞赛期间会崩溃
我们都知道,现在各种编码平台都包括竞赛编码,例如GeeksforGeeks、CodeChef、Codeforces、atCoder、SPOJ、HackerRank、HackerEarth等等,用户可以通过附加本地编辑器文件(如sublime编辑器)或直接在各自的编辑器上编写代码来参加竞赛。 那么这些测试用例是如何被访问的,换句话说,我们的代码是如何被编译和运行的呢?在这些编程平台上,在线判题系统充当了代码编译和运行的支撑。 在线判题系统用于评估用户提交的代码,这些代码将在一个统一的环境中进行编译和测试。在线判题系统被分类为支持竞赛编程比赛的各种系统,用于提高教育和招聘流程、解决数据挖掘挑战、在线编译器和开发平台作为其他自定义系统的组成部分。因此,这个系统应该是一个高效的系统,可以帮助学生们获得数据结构和编程技能。该系统包括用户界面、隔离评判环境、用于评估分数和更新报告到数据库的函数。
在本文中,我们将讨论在线判题系统在编程竞赛期间崩溃的原因。这张图片将帮助我们更好地解释崩溃的原因。 上述所有的问题解释了系统在检查和运行程序时面临的问题。用户可以提交任何代码。那么我们如何确定所提交的代码是恶意的还是良性的呢? 某些代码可以执行不同的进程,或者它们可以查看您的文档目录并获取一些信息,或者可以运行管理员命令,或者可以消耗服务器的带宽,代码可以做很多事情。我们不希望允许系统这样做。那么问题是,我们如何将这些权限准则付诸实施?为了处理上述情况,我们将解释以下几种方法:
方式1:低效的方式
方式2:冗长的历史方式
方式1: 低效的方式
在线决策倡议很少,开发人员试图在执行代码之前发现代码的恶意能力。例如,如果我们的代码是C++的,决策将首先检查是否有任何使用了“system”这个词的代码行。这个答案之所以不适用,是因为许多编程语言的运行方式不同。在某些编程语言中,您可以动态生成一个特性并调用它,因此过滤在这些代码中不适用。另外,如果您想要输出“system”该怎么办?该答案会说这段代码是有恶意的,但事实上并不是。
方式2:漫长的历史方式
这种方法适用于最大程度利用网络的决策。这个答案适用于基于Linux的系统。通过程序的返回值可以检查堆栈溢出/运行时错误。如果返回值为0,则表示系统可以顺利运行;如果返回值为其他数,则表示系统崩溃。
通过使用各种基于Unix的完全库,可以提供内存限制问题和时间限制问题。一些编程语言默认支持此类型的限制标志,例如Java。通过使用各种基于Unix的库可以提供时间限制和内存限制。通过这种方式,可以解决文件目录问题。然而,代码无法运行一些管理命令。
通过使用一些库,如Trickle,也可以限制网络功能。为了解决一个安全漏洞,我们可以安装各种库并编写各种代码。
结论
如果我们使用基于VM(虚拟机)的Docker或容器,所有上述问题都可以解决。我们可以创建一个容器,这样我们就可以拥有初始内存,预设网络权限和限制容器的时间。在使用虚拟机之后,所有麻烦都可以忽略不计。开发人员可以选择他们熟悉的选项。在这个解决方案中,整个评判系统可能会比其他方法慢,但在大规模上,它要快得多,而且更安全、更干净。您可以查看此GitHub Repo,了解如何使用Docker进行评分。
评判的整个过程是在线评判的最重要部分之一。要实施评判,一个人需要了解操作系统的工作原理,或者了解编程语言的工作方式。