Maison  >  Article  >  Java  >  Pourquoi le système d'évaluation en ligne plante-t-il lors d'un concours de programmation en ligne ?

Pourquoi le système d'évaluation en ligne plante-t-il lors d'un concours de programmation en ligne ?

WBOY
WBOYavant
2023-08-27 15:57:061434parcourir

Pourquoi le système dévaluation en ligne plante-t-il lors dun concours de programmation en ligne ?

Nous savons tous qu'aujourd'hui, diverses plates-formes de codage incluent un codage compétitif comme GeeksforGeeks, CodeChef, Codeforces, atCoder, SPOJ, HackerRank, HackerEarth, etc. Soit joignez un fichier d'éditeur local (par exemple Sublime Editor), soit écrivez directement sur l'éditeur respectif.

Alors, comment accéder à ces cas de test ou d'une manière simple, nous pouvons dire que notre code est en train de se compiler et de s'exécuter ? Sur ces plateformes de concours de programmation, les juges en ligne servent d’épine dorsale à la compilation et à l’exécution du code.

Jugement en ligne

Le code soumis par les utilisateurs est jugé, puis compilé et testé dans un environnement homogène, ce qui est effectué par des juges en ligne. Le jugement en ligne est divisé en systèmes qui soutiennent la mise en place de concours de programmation compétitifs, améliorent les processus de formation et de recrutement, facilitent la résolution des défis d'exploration de données, des compilateurs en ligne et des plates-formes de développement qui s'intègrent en tant que composants d'autres systèmes personnalisés. Par conséquent, il sera mis en œuvre comme un système efficace pour aider les étudiants à acquérir des connaissances sur les structures de données et des compétences en programmation. Le système comprend une interface utilisateur, un environnement de révision sandbox, des scores d'évaluation et la possibilité de mettre à jour les rapports dans une base de données. Dans cet article, nous verrons comment les juges en ligne se répartissent dans les compétitions de programmation. Cette image nous aidera à mieux expliquer comment il se décompose.

  • Achèvement du délai - Le code doit être exécuté à une heure précise. Pouvons-nous fixer une limite de temps pour l'exécution des threads par défaut sur le système d'exploitation ?

  • Memory Limit Done - Les programmes ne doivent pas occuper toute la mémoire du processeur. Comment pouvons-nous changer cela de manière plus simple ?

  • Erreur de débordement de piler - Après avoir suivi un programme, le système saura si le programme s'est exécuté avec succès ou non. Alors, comment ces informations nous parviennent-elles ?

Les points ci-dessus illustrent tous les problèmes qui surviennent lorsque le système vérifie et exécute le programme. Les utilisateurs peuvent soumettre n'importe quel code dans le programme. Comment déterminons-nous si ou dans quelle mesure un code soumis est malveillant ?

Certains codes peuvent exécuter différents processus, ou ils peuvent examiner votre répertoire de documents et obtenir des informations, ou ils peuvent exécuter des commandes administratives, ou encore ils peuvent consommer la bande passante du serveur. Le code peut effectuer diverses opérations. Nous n’avons pas besoin de permettre au système de faire cela. La question est donc de savoir comment pouvons-nous mettre en pratique ces directives en matière de licences ? Pour gérer la situation ci-dessus, nous expliquerons les méthodes suivantes -

Chemin

La technologie utilisée pour appliquer les autorisations système et le matériel est appelée code sandboxing. Web a décidé de coder le sandbox de deux manières pour gérer les différents scénarios mentionnés ci-dessus.

  • Chemin boiteux

  • Un long chemin vers l'histoire

Méthode 1 : La manière merdique

Il existe peu d'initiatives décisionnelles en ligne visibles qui permettent aux développeurs d'essayer de découvrir des fonctionnalités malveillantes sur le code avant son exécution. Par exemple, si notre code est basé sur C++, la décision examinera d'abord s'il existe des lignes de code qui utilisent l'expression « système ». Cette réponse ne dessine pas différemment car de nombreux langages de programmation ne dessinent pas de la même manière. Vous pouvez générer des fonctionnalités de manière dynamique et les toucher dans plusieurs langages de programmation, de sorte que le filtrage n'est pas dessiné dans le code. Autre chose, que se passe-t-il si vous souhaitez imprimer « système » en sortie ? Cette réponse dirait que le code est malveillant, mais ce n'est pas le cas.

Méthode 2 : Le long chemin historique

Dans cette méthode, la valeur maximale décidée par le réseau est valable. Cette réponse est pertinente pour les systèmes entièrement basés sur Linux. Les erreurs de débordement de pile/d'exécution peuvent être vérifiées grâce au coût de retour du programme. S'il est loin de 0, alors nous pouvons dire que le système a pu fonctionner avec succès, si dans d'autres cas il tombait en panne.

Les problèmes liés aux limites de mémoire et aux limites de temps peuvent être fournis en utilisant diverses bibliothèques complètes basées sur Unix. Certains langages de programmation activent par défaut cette fonctionnalité d'indicateurs de restriction, comme Java. Les limites de temps et les défauts de limite de mémoire peuvent être résolus en utilisant de nombreuses bibliothèques complètes basées sur Unix. Certains langages de programmation prennent en charge ce type d'indicateur de limite par défaut, comme Java.

Sous Linux, les autorisations de répertoire sont simples. Nous pouvons simplement créer un utilisateur et lui permettre d'accéder à certains répertoires et à certaines autorisations de lecture/écriture. Vous pouvez ensuite résoudre les problèmes de liste de documents en exécutant l'application destinée à l'usage de cet utilisateur. De plus, le code ne peut pas exécuter certaines commandes d'administration.

L'utilisation de certaines bibliothèques (telles que Trickle) peut également limiter les compétences de la communauté. Pour simplement combler une faille de sécurité, nous pouvons configurer différentes bibliothèques et écrire du code différent.

Conclusion

Si nous utilisons Docker ou box entièrement basé sur VM (machine virtuelle), tous les problèmes ci-dessus peuvent être résolus. Si nous voulons avoir une mémoire préliminaire, nous pouvons créer une boîte et prédéfinir les autorisations communautaires et les limites de temps de la boîte. Avec l'aide des machines virtuelles, tous les problèmes peuvent être ignorés. Il peut exister des alternatives connues des développeurs. L’ensemble de la machine de jugement de cette solution peut également sembler plus lente que d’autres technologies, mais à grande échelle, elle est beaucoup plus rapide que toute autre solution et est plus sûre et plus aseptisée. Vous pouvez jeter un œil à ce GitHub Repo pour apprendre à utiliser Docker à des fins de jugement.

L'ensemble de la méthode de jugement est l'une des parties les plus importantes du jugement en ligne. Afin d’exécuter une machine de jugement, il faut comprendre comment fonctionne un système d’exploitation ou comment fonctionne un langage de programmation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer