在线编程竞赛期间,在线评委为什么会崩溃?

javaobject oriented programmingprogramming更新于 2024/11/9 3:56:17

我们都知道,如今各种编程平台都包含竞争性编程,例如 GeeksforGeeks、CodeChef、Codeforces、atCoder、SPOJ、HackerRank、HackerEarth 等等,他们应该通过附加本地编辑器文件(例如 Sublime 编辑器)或直接在各自的编辑器上编写代码来自己编写代码。

那么这些测试用例是如何访问的,或者我们是否可以简单地说我们的代码正在编译和运行?在这些用于竞争性编程的编程平台上,在线评委是代码编译和运行的支柱。

在线评委

在线评委负责评判用户提交的代码,这些代码将在同类环境中进行下一步编译和测试。在线评委分为各种系统,这些系统支持建立竞争性编程竞赛,加强教育和招聘流程,促进解决数据挖掘挑战,在线编译器和开发平台作为其他定制系统的组件集成。因此,它将被实现为一个有效的系统,帮助学生获得数据结构和编程技能的知识。该系统包括用户界面、沙盒评判环境、评估分数和将报告更新到数据库的功能。在本文中,我们将讨论在线评委在编程竞赛期间如何崩溃。此图像将帮助我们更好地解释它是如何崩溃的。

  • 时间限制完成 − 代码应在特定时间执行。我们可以在默认情况下在操作系统上执行线程时设置时间限制吗?

  • 内存限制完成 − 程序不应占用 CPU 上的所有内存。我们如何才能更轻松地改变这种情况?

  • Stack Overflow Error − 跟踪程序后,系统将了解程序是否成功运行。那么这些信息是如何传递给我们的呢?

以上所有要点都解释了系统检查和运行程序的问题。用户可以在程序中提交任何代码。我们如何确定提交的代码是否恶意或恶意程度如何。

某些代码可以执行不同的进程,或者他们可以调查您的文档目录并获取一些信息,或者可以运行管理命令,或者可以消耗服务器的带宽,代码可以做很多事情。而我们不需要允许系统这样做。所以问题是,我们如何才能将这些权限准则付诸实施?为了处理上述情况,我们将解释以下方法 -

方法

用于应用系统权限和硬件的技术称为代码沙盒。有两种代码沙盒方法,Web 可以通过这些方法决定处理上述不同情况。

  • 蹩脚的方法

  • 冗长的历史方法

方法 1:蹩脚的方法

在少数可视化的在线决策项目中,开发人员会在执行代码之前尝试发现代码中的恶意功能。例如,如果我们的代码是 C++ 的,决策将首先检查是否有任何一行代码使用了"system"一词。由于不同的原因,此答案不会绘制,因为许多编程语言的绘制方式并不相同。您可以动态生成一个特性,并在几种编程语言中调用它,因此过滤不会绘制在这些代码中。另外,如果您想将"system"打印为输出,该怎么办?此答案将说代码是恶意的,但事实并非如此。

方法 2:冗长的历史方法

在这种方法中,互联网决策的大多数方法都有效。并且此答案适用于基于 Linux 的系统。可以通过程序的返回值检查 Stack Overflow/Runtime Error。如果返回值为 0,那么我们可以说系统可以成功运行,否则会崩溃。

通过使用各种基于 Unix 的完整库,可以提供内存限制问题和时间限制限制。某些编程语言默认启用限制标志的这种功能,例如 Java。通过使用各种基于 Unix 的库,可以提供时间限制限制和内存限制问题。某些编程语言默认支持这种限制标志,例如 Java。

在 Linux 上,目录权限很简单。我们可以简单地创建一个用户并授予该用户一些目录和一些读/写权限。然后通过执行该用户使用的应用程序,可以解决文件列表问题。此外,代码无法运行一些管理命令。

使用一些库(例如 Trickle)也可以限制网络权限。为了简单地修复一个安全漏洞,我们可以设置不同的库并编写不同的代码。

结论

如果我们使用 Docker 或基于 VM(虚拟机)的盒子,上述所有问题都可以解决。如果我们想要一个初始内存,我们可以创建一个盒子,并为盒子预设网络权限和时间限制。使用虚拟机后,所有麻烦都可以忽略。开发人员可以意识到一些选择。在这个解决方案中,整个评判系统可能看起来比其他系统慢,但绝对在大规模上它比其他任何解决方案都快得多,而且更安全、更清洁。您可以查看这个 GitHub Repo 以了解如何使用 docker 进行评判。

整个评判方式是在线评判最重要的部分之一。要实施评判系统,需要了解操作系统的工作原理或编程语言的工作原理。


相关文章


有用资源