2013-08-29 8 views
2

Windows에서 실행할 응용 프로그램의 프로세서 시간과 가상 메모리를 제한 할 수있는 응용 프로그램 러너를 작성 중입니다. 아이디어는 다음과 같은 것입니다 : 나는 C#을에서 모든 것을 할 노력하고있어 이후 작업 개체로 사용자 프로세서 시간 제한 및 가상 메모리 확인

이 mem_limit_in_MB time_limit_in_sec command.exe command_arguments ...

내 조사

윈도우에 Job Objects API를 저를지도하고 runner.exe를

, 나는 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 초 후에 한 번 종료됩니다. 왜 이런 일이 일어나는 걸까요? 작업 개체가 주기적으로 또는 실시간으로 제한을 확인하는 경우 참조를 찾을 수 없습니다.

제 질문은 두 가지입니다. - 누구나 내가 필요한 것을 이미 개발 한 코드에 대해 알고 있습니까? - 작업 객체가 주기적으로 또는 실시간으로 실행되는지 여부를 아는 사람이 있습니까?

답변

1

PerProcessUserTimeLimit은 사용자 모드 시간의 양을 사전에 지정

덕분 ... 공정에 부여된다.

"시스템은 작업과 관련된 각 프로세스가 설정된 제한보다 많은 사용자 모드 시간을 누적했는지 여부를 주기적으로 확인하고,있을 경우 프로세스가 종료됩니다." (MSDN)

결과적으로 응용 프로그램, 특히 사용자 모드 시간이 얼마나 효율적인지에 따라 다릅니다. 0.5 초 후 PerProcessUserTimeLimit = 0.5으로 프로세스 종료. 그 시간 동안 ~ 100 % cpu (사용자 모드)를 사용했다는 의미입니다.

... 작업 객체가 주기적으로 또는 실시간으로 실행되는 경우? 주기적으로, 위에서 언급 한대로.

+0

내 응용 프로그램이 전체 속도 (한 CPU 코어 전체 시간)로 사용자 모드를 굽고 있으므로 문제가 OS가 한계 검사를 수행하는 빈도에있을 가능성이 큽니다. MSDN에서 수표의 주기성에 대한 진술을 찾아 주셔서 감사합니다. 나는 어떻게 든 그것을 놓쳤다. – mario