介面設計
// 回傳 CPU 使用率百分比,失敗回傳 -1
int get_cpu_usage();
// 回傳實體記憶體與虛擬記憶體位元組數,成功 0,失敗 -1
int get_memory_usage(uint64_t* mem, uint64_t* vmem);
// 回傳累積讀寫位元組數,成功 0,失敗 -1
int get_io_bytes(uint64_t* read_bytes, uint64_t* write_bytes);
核心實現細節
CPU 使用率
- 呼叫
GetProcessTimes() 取得核心/使用者模式 CPU 時間(100ns 為單位)。
- 呼叫
GetSystemTimeAsFileTime() 取得系統時間基準。
- 兩次採樣相減計算增量:
cpu% = (process_time_delta * 100) / (system_time_delta * processor_count)。
- 首次呼叫僅記錄基準值,回傳 -1。
- 需連結
psapi.lib。
記憶體使用
GetProcessMemoryInfo() 填充 PROCESS_MEMORY_COUNTERS。
WorkingSetSize = 實體記憶體工作集;PagefileUsage = 虛擬記憶體(頁面檔)使用量。
I/O 統計
GetProcessIoCounters() 填充 IO_COUNTERS。
ReadTransferCount / WriteTransferCount 為累積位元組數(含非檔案 I/O)。
完整測試程式
int main()
{
while (1)
{
int cpu = get_cpu_usage();
uint64_t mem, vmem, r, w;
get_memory_usage(&mem, &vmem);
get_io_bytes(&r, &w);
printf("CPU: %u%% Mem: %llu B VMem: %llu B Read: %llu B Write: %llu B\n",
cpu, mem, vmem, r, w);
Sleep(1000);
}
return 0;
}
注意事項
- 僅適用 Windows(需
windows.h, psapi.h)。
- CPU 計算已除以邏輯處理器數,回傳值為單核心等效使用率。
- 首次呼叫
get_cpu_usage() 回傳 -1,需連續輪詢才有意義。