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中(第二個參數)  使用GetProcessMemoryInfo()
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占用時間)/系統時間差

注:系統時間差可以通過GetSystemTimeAsFileTime()獲取,然后在轉換為int64類型即可,自定義轉換方法如下:

__int64 FileTimeToInt64(const FILETIME& time)  

{  

    ULARGE_INTEGER tt;  //64位無符號整型值

    tt.LowPart = time.dwLowDateTime;  

    tt.HighPart = time.dwHighDateTime;

    return(tt.QuadPart);  //返回整型值

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM