2

実行するアプリケーションのプロセッサ ユーザー時間と仮想メモリを制限できる Windows でアプリケーション ランナーを作成しています。アイデアは次のとおりです。

runner.exe mem_limit_in_MB time_limit_in_sec command.exe command_arguments ...

調査の結果、Windows Job Objects API にたどり着きました。C# からすべてを実行しようとしているので、JobObjectWrapperが役立つことがわかりました。

次の場合のコードの主要部分:

using (JobObject jo = new JobObject())
{
    // Time
    jo.Limits.PerProcessUserTimeLimit = TimeSpan.FromMilliseconds(limitTime);
    jo.Events.OnEndOfProcessTime += new jobEventHandler<EndOfProcessTimeEventArgs>(Events_OnEndOfProcessTime);

    // Memory
    jo.Limits.ProcessMemoryLimit = new IntPtr(limitMemory);
    jo.Events.OnProcessMemoryLimit += new jobEventHandler<ProcessMemoryLimitEventArgs>(Events_OnProcessMemoryLimit);

    // Process
    ProcessStartInfo psi = new ProcessStartInfo(command, arguments);
    psi.UseShellExecute = false;
    psi.RedirectStandardOutput = true;

    jo.Limits.IsChildProcessBreakAway = false;
    Process p = jo.CreateProcessSecured(psi);

    p.WaitForExit();
}

さて、問題は、Events_OnEndOfProcessTime がタイムリーに呼び出されないということです。数分かかるアプリに 0.5 秒の制限を設定すると、実行中のアプリケーションによっては、0.5 秒後に 1 回、場合によっては 4 秒後に終了します。なぜこうなった?ジョブ オブジェクトが定期的またはリアルタイムで制限をチェックしている場合、参照が見つかりません。

私の質問は 2 つあります。- ジョブ オブジェクトが定期的に実行されるかリアルタイムで実行されるかを知っている人はいますか?

前もって感謝します...

4

1 に答える 1

1

PerProcessUserTimeLimit は、プロセスに許可されるユーザー モード時間を指定します。

「システムは、ジョブに関連付けられた各プロセスが、設定された制限よりも多くのユーザー モード時間を蓄積しているかどうかを定期的に確認します。蓄積している場合、プロセスは終了します。」( MSDN )

したがって、アプリケーション、特にユーザーモード時間をどれだけ効率的に消費しているかによって異なります。PerProcessUserTimeLimit = 0.50.5 秒後にプロセスを終了します。は、その間に約 100% の CPU (ユーザーモード) を使用したことを意味します。

...ジョブオブジェクトが定期的に実行されるかリアルタイムで実行されるか? 上記のように定期的に。

于 2013-08-29T14:34:54.570 に答える