0

この質問にタグを付ける方法やタイトルの書き方がよくわからないので、誰かがより良いアイデアを持っている場合は編集してください

契約は次のとおりです。

少し前に、私はコンピューティング オリンピック管理システムの重要な部分を少し書きました。システムの仕事は、参加者からの提出物 (コード ファイル) を取得し、それらをコンパイルし、定義済みのテスト ケースに対して実行し、結果を返すことです。さらに、あなたが想像できる残りのすべてのことを実行する必要があります。

私が書いた部分はリミッターと呼ばれていました。それは、制御された環境で別のプログラムを実行する小さなプログラムでした。この場合の制御とは、使用可能なメモリ、計算時間、およびシステム リソースへのアクセスに対する制限を意味します。さらに、プログラムがクラッシュした場合は、例外の種類を特定し、それをユーザーに報告できるはずです。また、プロセスが終了したときに、プロセスが実行された時間を記録する必要があります (少なくとも 0.01 秒以上の精度で)。

もちろん、これに対する理想的なソリューションは仮想化ですが、私はそれを書く経験がありません。

これに対する私の解決策は、3 つの部分に分かれていました。

最も単純な部分は、システム リソースへのアクセスでした。プログラムは、限られたアクセス トークンで単純に実行されます。システムへの読み取り専用アクセスを実質的に提供するために、すべてのプロセスで使用できる基本的な (Everyone、Anonymous など) アクセス トークンをいくつか組み合わせました。ただし、システムが実行されているフォルダーは例外です。

メモリの制限は、ジョブ オブジェクトを介して行われました。最大メモリ制限を指定できます。

最後に、実行時間を制限してすべての例外をキャッチするために、リミッターをデバッガーとしてプロセスにアタッチします。したがって、私はそれが費やした時間を監視し、時間がかかりすぎる場合は終了することができます. Job オブジェクトはジョブの Kernel Time と User Time のみを報告するため、これには Job オブジェクトを使用できないことに注意してください。プロセスは、それらのいずれにもカウントされないようなことを行う可能性がありますSleep(99999999)が、それでもテスト マシンを無効にします。したがって、最終的な実行時間にプロセスのアイドル時間をカウントしませんが、それでも制限が必要です。

さて、私はこのような低レベルの専門家ではありません。MSDN を読んだり遊んだりして数日を過ごし、できる限りの解決策を思いつきました。残念ながら、期待どおりに動作していないようです。ほとんどの場合、問題なく動作しているように見えますが、奇妙なケースが忍び寄り続けています。ちょうど今、私はそれ自体で一瞬で実行される小さな C++ プログラムを持っていますが、リミッターは 8 秒のユーザー モード時間を報告します (ジョブ カウンターから取得)。これがコードです。約 0.5 秒で出力を出力し、待機するだけで 7 秒以上かかります。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector< vector<int> > dp(50000, vector<int>(4, -1));
    cout << dp.size();
}

リミッターのコードはかなり長いので、ここには含めません。また、私のアプローチに何か問題があるのではないかと感じています。おそらく、デバッガーのことをすべきではありません。おそらく、私が知らないいくつかの一般的な落とし穴があります。

他の人がこの問題にどのように取り組むかについて、アドバイスをお願いします。おそらく、これを行う何かが既にあり、私のリミッターは廃止されましたか?


追加:問題は、私が上に投稿した小さなプログラムにあるようです。少し関係がないので、新しい質問を開きました。プログラムを制限するためのこのアプローチについて、引き続きコメントをお願いします。

4

1 に答える 1

0

デバッガーを接続して実行すると、アプリケーションの特性が変わる可能性があります。パフォーマンスが影響を受ける可能性があり、コード パスが変更されることさえあります (ターゲット プロセスがデバッガーの存在に基づいて動作する場合IsDebuggerPresent)。

私たちが使用した別のアプローチは、独自のアプリケーションを JIT デバッガーとして実行するように構成することです。レジストリ キーを設定することによりAeDebug、アプリケーションがクラッシュしたときにどのデバッガーを起動するかを制御できます。この方法では、ターゲット プロセスがクラッシュしたときにのみジャンプし、通常の実行時にプロセスに影響を与えることはありません。

このサイトには、事後分析デバッガーの設定に関する詳細が記載されています:自動デバッグの構成

メモリを制限したり、タイミングを取得したりするためのアプローチはすべて完全にうまく聞こえます。

于 2013-09-06T15:30:14.720 に答える