2012-07-30 2 views
2

큰 응용 프로그램에서 작업 중이며 CPU가 두 시점 사이에로드 된 상태를 파악하려고합니다. 나는 내 자신의 과정에 관심이있는 것이 아니라 모든 과정에 관심이있다.Windows에서 유휴 프로세스의 총 CPU 시간은 작업 관리자와 비슷합니다.

제 아이디어는 두 기간 사이의 유휴 프로세스의 총 CPU 시간을 얻는 것입니다. 그런 다음 그 값을 실시간 차이와 비교하십시오. 그런 다음 유휴 프로세스에 소요 된 평균 CPU 시간 (% CPU 시간)을 계산할 수 있으므로 실제 프로세스에 소요 된 CPU의 평균 %를 계산할 수 있습니다. 예를 들어

:

  • 실시간 샘플 : 2012년 7월 30일 13 : 56 : 1 2012년 7월 30일 13시 56분 21초
  • 유휴 프로세스 전체 CPU 시간 샘플 : 56 : 실시간으로 23시 10분 및 56:23:15는
  • 차이 : 20
  • 유휴 프로세스 전체 CPU 시간의 차이 : 5 초 유휴 프로세스에서
  • 평균 %의 CPU 시간 : 25 %
  • 평균 %의 CPU 시간 ...에서 실제 프로세스 : 75 %

가능한 한 성능에 미치는 영향을 최소화하기 위해 두 개의 샘플 만 가져오고 싶습니다. 하나는 처음에, 하나는 끝에 있습니다.

또한 전체 프로세스의 CPU로드를 계산하기 위해 다른 프로세스를보고 싶지는 않지만 유휴 프로세스 만보고 싶습니다. (예를 들어 다른 프로세스의 총 CPU 시간 합계를 계산하고 싶지 않습니다.)

나는 Kernel32.dll OpenProcess을 사용하려고했습니다. 그러나 apperantly 당신은 유휴 프로세스에 액세스 할 수 없습니다. ERROR_ACCESS_DENIED 예외가 발생합니다.

작업 관리자가 유휴 프로세스의 총 CPU 시간을 표시하므로이 작업이 가능해야합니다.

참고 : 프로세스의 CPU 시간 (%)에 관심이 없습니다. 나중에 평균을 계산하기 위해 총 CPU 시간 만.

답변

3

을 따뜻하게 :

static Program 
{ 
    private static PerformanceCounter cpuCounter = new PerformanceCounter() { 
     CategoryName = "Processor", 
     CounterName = "% Processor Time", 
     InstanceName = "_Total" }; 

    static void Main() 
    { 
     cpuCounter.NextValue(); 
     // Do your processing here. 
     float totalCpuUsagePercentage = cpuCounter.NextValue(); 
    } 
} 

totalCpuUsagePercentage는 비율 총으로로드를 포함합니다 마지막 cpuCounter.NextValue().

비율을 원하지 않으면 CounterName = "프로세서 시간"을 대신 사용할 수 있습니다.

귀하의 탐구에 도움이되기를 바랍니다.

+0

using System.Diagnostics; – Casperah

+0

위대한 트릭을 했어 :-) –

0

'유휴 프로세스'가 존재하지 않을 가능성이 큽니다.

[아니오 (no)]가 포함 된 자신의 '유휴 프로세스'를 시도해 볼 수 있습니다. of core] 쓰레드, Idle + 1 우선 순위, 그 CPU 루프, 경과 시간 계산. 그럴 수도 있습니다.

그것은 또한 당신의 냉각 시스템 몇 가지 운동을 줄 것이다 당신은 아마 이런 식으로 뭔가를 찾고 사무실 :

+0

일부 프로세스에는 유휴 프로세스가 존재합니다. ProcessID가 0 인 Kernel32 API 호출, OpenProcess를 사용하여 액세스 할 수 있습니다.그러나 보호 된 프로세스이므로 사용자 공간 응용 프로그램에서 액세스 할 수 없습니다. 그러나 작업 관리자는 그 정보에 어떻게 든 액세스 할 수 있습니다. 작업 관리자가 어떻게하는지 궁금합니다. 나는 낮은 영향 우아한 솔루션을 찾고 있는데요 ... –

관련 문제