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 秒后终止,有时在 4 秒后终止。为什么会这样?如果作业对象定期或实时检查限制,我找不到任何参考。

我的问题有两个: - 有人知道已经开发的代码可以满足我的需要吗?- 有谁知道作业对象是定期执行还是实时执行?

提前致谢...

4

1 回答 1

1

PerProcessUserTimeLimit 指定授予进程的用户模式时间量。

“系统定期检查以确定与作业关联的每个进程是否累积了超过设置限制的用户模式时间。如果有,则终止该进程。” ( MSDN )

因此,这取决于您的应用程序,特别是它消耗用户模式时间的效率。PerProcessUserTimeLimit = 0.5在 0.5 秒后结束一个进程。意味着它在那段时间使用了〜100%的cpu(用户模式)。

...如果作业对象定期或实时执行?定期,如上所述。

于 2013-08-29T14:34:54.570 回答