C++프로 세 스 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); //
}
이 글 은 여기까지 소개 되 었 으 니 필요 한 친 구 는 참고 하 셔 도 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【초보자용】도해로 배우는 CPU의 구조본 기사는, 를 참고로 하면서, 프로그램 언어가 CPU 내부에서 어떻게 처리되고 있는지를 확인했을 때의 비망록입니다. 을 사용하여 C 언어 처리를 어셈블리로 변환했습니다. 컴파일러는 MSP430 gcc6.2.1을 선...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.