如何获取CPU使用率
来源:互联网 发布:微信问卷调查软件 编辑:程序博客网 时间:2024/04/30 11:44
这几天做一个分布式的软件,用到了这些知识,暂时没有时间具体介绍自己的收获和心得,先把代码(转载加修改)贴上吧,以后再补充。
一、获取当前进程的CPU使用率、内存使用量、总的IO字节数。
ProcessStatus.h
#ifndef PROCESS_STATUS_H
#define PROCESS_STATUS_H
extern "C"
{
typedef long long int64_t;
typedef unsigned long long uint64_t;
// Get the CPU usage rate of current process, which fails when the return is -1.
int get_cpu_usage();
// Get the memory usage and virtual memory usage of current process,
// which fails when the return is -1, otherwise 0 presents success.
int get_memory_usage(uint64_t* mem, uint64_t* vmem);
// Get the total bytes(IO) of read and write of current process,
// which fails when the return is -1, otherwise 0 presents success.
int get_io_bytes(uint64_t* read_bytes, uint64_t* write_bytes);
}
#endif/*PROCESS_STATUS_H*/
ProcessStatus.cpp
#include <windows.h>
#include <psapi.h>
#include <assert.h>
#include "ProcessStatus.h"
#pragma comment(lib,"psapi.lib")
// Convert time type.
static uint64_t file_time_2_utc(const FILETIME* ftime)
{
LARGE_INTEGER li;
assert(ftime);
li.LowPart = ftime->dwLowDateTime;
li.HighPart = ftime->dwHighDateTime;
return li.QuadPart;
}
// Get the core number of the CPU.
static int get_processor_number()
{
SYSTEM_INFO info;
GetSystemInfo(&info);
return (int)info.dwNumberOfProcessors;
}
int get_cpu_usage()
{
// The core number of CPU
static int processor_count_ = -1;
// The last time
static int64_t last_time_ = 0;
static int64_t last_system_time_ = 0;
FILETIME now;
FILETIME creation_time;
FILETIME exit_time;
FILETIME kernel_time;
FILETIME user_time;
int64_t system_time;
int64_t time;
int64_t system_time_delta;
int64_t time_delta;
int cpu = -1;
if(processor_count_ == -1)
{
processor_count_ = get_processor_number();
}
GetSystemTimeAsFileTime(&now);
if (!GetProcessTimes(GetCurrentProcess(), &creation_time, &exit_time,
&kernel_time, &user_time))
{
// We don't assert here because in some cases (such as in the Task Manager)
// we may call this function on a process that has just exited but we have
// not yet received the notification.
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))
{
// First call, just set the last values.
last_system_time_ = system_time;
last_time_ = time;
return -1;
}
system_time_delta = system_time - last_system_time_;
time_delta = time - last_time_;
assert(time_delta != 0);
if (time_delta == 0)
return -1;
// We add time_delta / 2 so the result is rounded.
cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
last_system_time_ = system_time;
last_time_ = time;
return cpu;
}
int get_memory_usage(uint64_t* mem, uint64_t* vmem)
{
PROCESS_MEMORY_COUNTERS pmc;
if(GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))
{
if(mem) *mem = pmc.WorkingSetSize;
if(vmem) *vmem = pmc.PagefileUsage;
return 0;
}
return -1;
}
int get_io_bytes(uint64_t* read_bytes, uint64_t* write_bytes)
{
IO_COUNTERS io_counter;
if(GetProcessIoCounters(GetCurrentProcess(), &io_counter))
{
if(read_bytes) *read_bytes = io_counter.ReadTransferCount;
if(write_bytes) *write_bytes = io_counter.WriteTransferCount;
return 0;
}
return -1;
}
二、获取CPU的使用率
Cpusage.cpp
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#define SystemBasicInformation 0
#define SystemPerformanceInformation 2
#define SystemTimeInformation 3
#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
typedef struct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
} SYSTEM_BASIC_INFORMATION;
typedef struct
{
LARGE_INTEGER liIdleTime;
DWORD dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;
typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
PROCNTQSI NtQuerySystemInformation;
void main(void)
{
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIME_INFORMATION SysTimeInfo;
SYSTEM_BASIC_INFORMATION SysBaseInfo;
double dbIdleTime;
double dbSystemTime;
LONG status;
LARGE_INTEGER liOldIdleTime = {0,0};
LARGE_INTEGER liOldSystemTime = {0,0};
NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
GetModuleHandle("ntdll"),
"NtQuerySystemInformation"
);
if (!NtQuerySystemInformation)
return;
// get number of processors in the system
status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
return;
printf("/nCPU Usage (press any key to exit): ");
while(!_kbhit())
{
// get new system time
status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
if (status!=NO_ERROR)
return;
// get new CPU's idle time
status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status != NO_ERROR)
return;
// if it's a first call - skip it
if (liOldIdleTime.QuadPart != 0)
{
// CurrentValue = NewValue - OldValue
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
// CurrentCpuIdle = IdleTime / SystemTime
dbIdleTime = dbIdleTime / dbSystemTime;
// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;
printf("/b/b/b/b%3d%%",(UINT)dbIdleTime);
}
// store new CPU's idle and system time
liOldIdleTime = SysPerfInfo.liIdleTime;
liOldSystemTime = SysTimeInfo.liKeSystemTime;
// wait one second
Sleep(1000);
}
printf("/n");
}
- 如何获取CPU使用率
- 如何获取CPU的主频和使用率?
- 获取进程cpu使用率
- 获取当前CPU使用率
- 获取CPU使用率
- VC++获取CPU使用率
- 获取总CPU使用率
- VC++获取CPU使用率
- 实时获取CPU使用率
- VC++获取CPU使用率
- Perl 获取cpu使用率
- C++获取CPU使用率
- Android -- 获取CPU使用率
- 获取CPU使用率脚本
- 获取cpu使用率
- 获取cpu使用率
- 获取CPU的使用率
- 获取CPU使用率
- 怎样在报表中显示HTML/RTF内容系列之一-SSRS 2008中显示HTML内容
- UNIX下执行文件的减肥工具strip[转载]
- 关于使MVC.net的IIS配置问题
- 微软云计算遭质疑 Sidekick断线资料毁损谁来买单?
- 解决反序列化(Deserialize)无法找到程序集的错误
- 如何获取CPU使用率
- 【转】堆和栈的区别
- 美国《时代》杂志:十大最健康食品排行榜
- 【转】windows进程中的内存结构
- udf 编写
- SQL语法总结
- Office2007 PDF/XPS格式插件下载
- JDBC (java连接数据库)
- 成功秘笈