📜  为什么在线裁判在编程竞赛期间崩溃?

📅  最后修改于: 2021-10-21 05:17:08             🧑  作者: Mango

极客,因为您非常了解编码平台,包括有竞争力的编码,例如 GeeksforGeeks、CodeChef、Codeforces、atCoder、SPOJ、HackerRank、HackerEarth 等等,它应该通过直接在各自的编辑器上编写代码或通过附加本地编辑器文件,例如 sublime 编辑器。

为什么-在线-评判-崩溃-在-竞争-编程-比赛

你有没有想过如何在那里访问测试用例,或者更简单地说,我们的代码如何被编译和运行以检查测试用例?在这些竞争性编程对齐的平台上,在线法官充当代码提交的支柱。

从上图可以清楚地看出,在线仲裁员收集并运行您的代码,显示一些收益或决定。有那么基本吗?不,这整个互动非常混乱。与它相关的不便很少,如下所示:

  1. 时间限制完成:您的代码需要在特定时间出现。我们可以在默认情况下在我们的操作系统上执行线程时设置时间限制吗?
  2. 内存限制完成:您的程序不会占用 CPU 上的所有内存。我们也可以如何改变它,有更简单的方法吗?
  3. 堆栈溢出错误:跟踪您的程序后,系统将了解程序是否成功运行。我们怎样才能得到这些信息?

好的,以上都差不多是检查程序的系统的复杂性了。虽然他们是一些安全问题。由于允许用户在网络法官上提交任何类型的代码,很明显有些人可能会提交一些恶意代码。有多恶毒?

  • 一些代码可以执行不同的进程。
  • 一些代码可以调查您的文档目录,并获得一些信息。
  • 某些代码可以运行管理命令。
  • 一些代码可以吞噬服务器的带宽。

并且有许多事实,代码可以做到。你显然不需要允许这个系统这样做。那么我们如何才能使这些许可指南生效呢?所以极客现在你一定想知道网络是如何决定处理上述场景的,我们将提出如下方法:

方法:

网络决定处理上述不同场景的代码沙箱方法有两种方式

  1. 跛脚方式
  2. 漫长的历史之路

方式一:跛脚方式

我什至看到一些在线决策计划,其中开发人员试图在执行代码之前发现代码的恶意功能。例如,如果您的代码是使用 C++ 编写的,那么首先会考虑是否有任何代码行使用了“系统”短语。由于多种原因,这个答案不会绘制,因为许多编程语言不会以相同的方式绘制。您可以动态生成特征并使用几种编程语言与它联系,因此过滤不会在代码中绘画。另一件事,万一你想打印“系统”作为输出怎么办?这个答案会说代码是恶意的,但它不是。

方式2:漫长的历史之路

在这种方法中,最大的网络决定工作。这个答案与主要基于 Linux 的完全系统有关。

堆栈溢出/运行时错误可以通过程序回溯成本的方式进行检查。如果它远为 0,那么您可能会说这个系统运行成功,在任何其他情况下都崩溃了。

使用各种基于 Unix 的完全库可以提供内存限制麻烦和时间限制限制。某些编程语言通过默认方式启用这种限制标志,例如Java。内存限制的缺点和时间限制的边界可能会提供给大量基于 Unix 的完全基于库的使用。一些编程语言通过默认方式帮助这种类型的边界标志,例如Java。

Linux 上的目录权限很简单,您只需创建一个使用者并允许该使用者访问一些目录以及一些读/写权限。然后执行该用户的应用程序,可以解决文件列表的麻烦。此外,该代码无法运行一些管理命令。

限制社区技能对于使用一些库也是可行的,例如 Trickle。在这个解决方案中,人们想建立不同的库并编写不同的代码,只是为了弥补一个安全漏洞。

当代方式如下:

如果您使用 Docker 或以 box 为主的完全基于 VM(虚拟机),则上述所有问题都解决了。如果你想有一个初步的记忆,你可以创建一个盒子,有预设的社区权限,盒子的时间限制。所有的麻烦都可以在使用虚拟机的帮助下解决。开发人员可以简单地了解替代事物。在这个解决方案中,整个判断机器也可能看起来比替代技术更慢,但绝对在大规模上它比其他任何解决方案都要快得多,而且更安全。您可以查看此 GitHub Repo,了解如何使用 docker 进行判断。

整个评判方式是在线评判中最重要的一部分。为了执行判断机器,人们想了解操作系统是如何工作的,另外还有编程语言是如何工作的。希望你至少获得了一些关于整个方式的专业知识。