C++프로 세 스 CPU 사용량 가 져 오기

5298 단어 CPU점용 률
핵심 코드

//     
static __int64 file_time_2_utc(const FILETIME* ftime)
{
  LARGE_INTEGER li;
 
  li.LowPart = ftime->dwLowDateTime;
  li.HighPart = ftime->dwHighDateTime;
  return li.QuadPart;
}
 
//   CPU   
static int get_processor_number()
{
  SYSTEM_INFO info;
  GetSystemInfo(&info);
  return (int)info.dwNumberOfProcessors;
}
//     CPU  
int get_cpu_usage(int pid)
{ 
  //cpu  
  static int processor_count_ = -1;
  //      
  static __int64 last_time_ = 0;
  static __int64 last_system_time_ = 0;
 
  FILETIME now;
  FILETIME creation_time;
  FILETIME exit_time;
  FILETIME kernel_time;
  FILETIME user_time;
  __int64 system_time;
  __int64 time;
  __int64 system_time_delta;
  __int64 time_delta;
 
  int cpu = -1;
 
  if(processor_count_ == -1)
  {
    processor_count_ = get_processor_number();
  }
 
  GetSystemTimeAsFileTime(&now);
 
  HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
  if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time, &user_time))
  {
    return -1;
  }
  system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) / processor_count_;
  time = file_time_2_utc(&now);
 
  if ((last_system_time_ == 0) || (last_time_ == 0))
  {
    last_system_time_ = system_time;
    last_time_ = time;
    return -1;
  }
 
  system_time_delta = system_time - last_system_time_;
  time_delta = time - last_time_;
 
  if (time_delta == 0)
    return -1;
 
  cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
  last_system_time_ = system_time;
  last_time_ = time;
  return cpu;
}
다음은 다른 네티즌 들 의 보충.
C++프로 세 스 메모리 사용량 과 CPU 사용량 등 정 보 를 가 져 옵 니 다.
1.메모리 사용량 정보 가 져 오기
획득 절차:
(1)현재 프로 세 스 핸들 가 져 오기 GetCurrentProcess()를 사용 하여 현재 프로 세 스 핸들 을 되 돌려 줍 니 다.
(2)메모리 정 보 를 저장 하 는 구조 체 PROCESS 정의MEMORY_COUNTERS pmc;
구조 체 정 의 는 다음 과 같다.

typedef struct _PROCESS_MEMORY_COUNTERS {
DWORD cb;                                                Size of the structure, in bytes.//     
DWORD PageFaultCount;                               Number of page faults. //       
SIZE_T PeakWorkingSetSize;                             Peak working set size, in bytes. //       
SIZE_T WorkingSetSize;                               Current working set size, in bytes. //        
SIZE_T QuotaPeakPagedPoolUsage;                          Peak paged pool usage, in bytes. //          
SIZE_T QuotaPagedPoolUsage;                             Current paged pool usage, in bytes.//        
SIZE_T QuotaPeakNonPagedPoolUsage;                         Peak nonpaged pool usage, in bytes.//           
SIZE_T QuotaNonPagedPoolUsage;                          Current nonpaged pool usage, in bytes.//         
SIZE_T PagefileUsage;                              Current space allocated for the pagefile, in bytes.Those pages may or may not be in memory.//       
SIZE_T PeakPagefileUsage;                             Peak space allocated for the pagefile, in bytes.//         
} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;
(3)현재 프로 세 스 의 메모리 정 보 를 가 져 와 구조 체 pmc 에 저장(두 번 째 매개 변수)GetProcessMemory Info()사용
API 정 의 는 다음 과 같 습 니 다.
GetProcessMemoryInfo(
HANDLE Process,메모리 사용 상황 을 가 져 오 는 프로 세 스 핸들 입 니 다.
PPROCESS_MEMORY_COUNTERS ppsmemCounters,메모리 사용 상황 을 되 돌려 주 는 구조
DWORD cb 구조의 크기
);DE
2.CPU 활용 도 획득
획득 절차:
(1)현재 프로 세 스 핸들 가 져 오기 OpenProcess()를 통 해 프로 세 스 핸들 을 되 돌려 줍 니 다.
함수 원형 은 다음 과 같 습 니 다.

HANDLE OpenProcess(
DWORD dwDesiredAccess, //         (  )
BOOL bInheritHandle, //       
DWORD dwProcessId//      ,    getpid()      ID
);
(2)CPU 사용 시간 가 져 오기 GetProcessTimes 호출()
함수 원형 은 다음 과 같 습 니 다.

BOOL
WINAPI
GetProcessTimes(
__in HANDLE hProcess,                                 
__out LPFILETIME lpCreationTime,                 
__out LPFILETIME lpExitTime,                   
__out LPFILETIME lpKernelTime,                        
__out LPFILETIME lpUserTime                         
);
CPU 사용 시간=(lpKernelTime+lpUserTime)/GetProcessNumber()(커 널 수)
커 널 수 획득 방법 은 다음 과 같 습 니 다:

int GetProcessNumber() 
{ 

  SYSTEM_INFO info; 
  GetSystemInfo(&info);
  return (int)info.dwNumberOfProcessors; 
} 
(3)CPU 이 용 률 계산
CPU 이 용 률=(현재 CPU 점용 시간-과거 CPU 점용 시간)/시스템 시간 차
주:시스템 시간 차 는 GetSystem TimeAsFileTime()을 통 해 얻 을 수 있 으 며,int 64 형식 으로 변환 하면 됩 니 다.사용자 정의 변환 방법 은 다음 과 같 습 니 다.

__int64 FileTimeToInt64(const FILETIME& time) 
{ 

  ULARGE_INTEGER tt; //64       
  tt.LowPart = time.dwLowDateTime; 
  tt.HighPart = time.dwHighDateTime;
  return(tt.QuadPart); //     

}
이 글 은 여기까지 소개 되 었 으 니 필요 한 친 구 는 참고 하 셔 도 됩 니 다.

좋은 웹페이지 즐겨찾기