查询系统和进程状态信息
2014-08-26 13:41
459 查看
windows C++
1. 系统CPU利用率
理论支持
1.CPU利用率:CPU工作时间与总时间的比值。
2.Windows下任务管理器CPU利用率的由来:
a.CPU使用率:在任务管理器的刷新周期内CPU工作时间与刷新周期的比值。
b.任务管理器默认的刷新周期是1s。
3.windows下,CPU只会处于两种状态:陷入内核和陷入用户。
4.若干公式:
a.利用率 = CPU工作时间 / 时间间隔 (一段时间内,如1s内)
b.工作时间 = 内核态工作时间 +用户态工作时间。
c.时间间隔 = 工作时间 + 空闲时间 = 内核时间 + 用户时间。
5.当空闲时,CPU进入内核执行System Idle Process。打开任务管理器->进程->最下面,System Idle Process所持有CPU即此刻空闲CPU。故内核时间等于内核态工作时间与CPU整体空闲时间之和。
综上所述:
A.CPU利用率 = (用户时间
+ 内核时间 - 空闲时间) / (用户时间
+ 内核时间)
B.CPU利用率 = (用户时间
+ 内核时间 - 空闲时间)/
间隔时间
函数和结构体
1.函数GetSystemTimes
原型:BOOL GetSystemTimes(LPFILETIME lpIdleTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime)
返回值:成功返回0,否则非0
功能:获取CPU处于空闲、内核、用户态的时间。
A.自开机以来
B.所有CPU的时间和
2.FILETIME结构
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
DWORD = unsigned long,4字节32位
3.提取FILETIME时间:
方法一
ULARGE_INTEGER ul;
ul.HighPart = ft.dwHighDateTime;
ul.LowPart = ft.dwLowDateTime;
ul.QuadPart即ft代表的时间,单位0.1微秒
方法二
ULONGLONG ull = ft.dwHighDateTime;
ull = ull<<32 | ft.dwLowDateTime;
4.ULARGE_INTEGER结构:
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
};
struct {
DWORD LowPart;
DWORD HighPart;
} u;
ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
ULARGE_INTEGER实为联合体,专用于表示64位无符号大长整形。
将FILETIME还原为64位无符号大长整形:将FILETIME高32位、低32位分别赋值给ULARGE_INTEGER高、低32位,然后ULARGE_INTEGER的QuadPart即结果。
程序实现
ULONGLONG CompareFileTime(const FILETIME &ft1, const FILETIME &ft2)
{
ULARGE_INTEGER ul1;
ul1.HighPart = ft1.dwHighDateTime;
ul1.LowPart = ft1.dwLowDateTime;
ULARGE_INTEGER ul2;
ul2.HighPart = ft2.dwHighDateTime;
ul2.LowPart = ft2.dwLowDateTime;
return ul2.QuadPart - ul1.QuadPart;
}
int GetSystemCpu(){
FILETIME ftPreIdle, ftPreUser, ftPreKernel;
FILETIME ftIdle, ftUser, ftKernel;
if(!GetSystemTimes(&ftPreIdle, &ftPreKernel, &ftPreUser))
{
std::cout<<"First GetSystemTimes Error"<<std::endl;
return;
}
Sleep(n);
if(!GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
std::cout<<"Second GetSystemTimes Error"<<std::endl;
return;
}
ULONGLONG ullIdle = CompareFileTime(ftPreIdle, ftIdle);
ULONGLONG ullKernel = CompareFileTime(ftPreKernel, ftKernel);
ULONGLONG ullUser = CompareFileTime(ftPreUser, ftUser);
double dCpu1 = (ullKernel+ullUser-ullIdle)*100.0 / (ullKernel+ullUser);
double dCpu2 = (ullKernel+ullUser-ullIdle)*100.0 / (n*1000*10*iCpuNum);
return static_cast<int>(dCpu1+0.5);
}
2. 进程CPU利用率
如果说系统CPU利用率是一段时间内所有进程运行时间占总时间的比值,则进程CPU利用率即为一段时间内该进程运行时间占总时间的比值,故:
进程CPU利用率 = 进程运行时间 / 总时间
辅助函数
1.函数GetProcessTimes
原型:BOOL GetProcessTimes(
HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime)
返回值:成功返回0,否则非0
功能:获取进程创建时间、退出时间、内核时间、用户时间。
A.创建时间和退出时间是UNIX时间戳。
B.若进程尚未退出,lpExitTime值不确定。
C.lpKernelTime和lpUserTime要考虑多处理器情况。
D.即便不需要创建时间和退出时间也必须保证传入的lpCreationTime和lpExitTime有意义。
程序实现
HANDLE GetProcessHandle(const std::string &sProcessName)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL bMore = Process32First(hProcessSnap, &pe32);
while(bMore)
{
if(!sProcessName.compare(pe32.szExeFile))
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
return hProcess;
}
bMore=::Process32Next(hProcessSnap,&pe32);
}
std::cout<<"Not Found The Process Of Server:"<<sProcessName<<std::endl;
return INVALID_HANDLE_VALUE;
}
int GetProcessCpu(const std::string &sProcessName)
{
HANDLE hProcess = GetProcessHandle(sProcessName);
if(INVALID_HANDLE_VALUE == hProcess)
{
std::cout<<"Get Process Handle Fail"<<std::endl;
return -1;
}
SYSTEM_INFO si;
GetSystemInfo(&si);
int iCpuNum = si.dwNumberOfProcessors;
FILETIME ftPreKernelTime, ftPreUserTime;
FILETIME ftKernelTime, ftUserTime;
FILETIME ftCreationTime, ftExitTime;
if(!GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftPreKernelTime, &ftPreUserTime))
{
std::cout<<"First GetProcessTimes Error:"<< GetLastError()<<std::endl;
return -1;
}
Sleep(INTERVAL);
if(!GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime))
{
std::cout<<"GetProcessTimes Error:"<< GetLastError()<<std::endl;
return -1;
}
ULONGLONG ullKernelTime = CompareFileTime(ftPreKernelTime, ftKernelTime);
ULONGLONG ullUserTime = CompareFileTime(ftPreUserTime, ftUserTime);
double dCpu = (ullKernelTime+ullUserTime)*100.0 / (cpuNum*INTERVAL*10000);
return static_cast<int>(dCpu + 0.5);
}
1. 系统CPU利用率
理论支持
1.CPU利用率:CPU工作时间与总时间的比值。
2.Windows下任务管理器CPU利用率的由来:
a.CPU使用率:在任务管理器的刷新周期内CPU工作时间与刷新周期的比值。
b.任务管理器默认的刷新周期是1s。
3.windows下,CPU只会处于两种状态:陷入内核和陷入用户。
4.若干公式:
a.利用率 = CPU工作时间 / 时间间隔 (一段时间内,如1s内)
b.工作时间 = 内核态工作时间 +用户态工作时间。
c.时间间隔 = 工作时间 + 空闲时间 = 内核时间 + 用户时间。
5.当空闲时,CPU进入内核执行System Idle Process。打开任务管理器->进程->最下面,System Idle Process所持有CPU即此刻空闲CPU。故内核时间等于内核态工作时间与CPU整体空闲时间之和。
综上所述:
A.CPU利用率 = (用户时间
+ 内核时间 - 空闲时间) / (用户时间
+ 内核时间)
B.CPU利用率 = (用户时间
+ 内核时间 - 空闲时间)/
间隔时间
函数和结构体
1.函数GetSystemTimes
原型:BOOL GetSystemTimes(LPFILETIME lpIdleTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime)
返回值:成功返回0,否则非0
功能:获取CPU处于空闲、内核、用户态的时间。
A.自开机以来
B.所有CPU的时间和
2.FILETIME结构
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
DWORD = unsigned long,4字节32位
3.提取FILETIME时间:
方法一
ULARGE_INTEGER ul;
ul.HighPart = ft.dwHighDateTime;
ul.LowPart = ft.dwLowDateTime;
ul.QuadPart即ft代表的时间,单位0.1微秒
方法二
ULONGLONG ull = ft.dwHighDateTime;
ull = ull<<32 | ft.dwLowDateTime;
4.ULARGE_INTEGER结构:
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
};
struct {
DWORD LowPart;
DWORD HighPart;
} u;
ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
ULARGE_INTEGER实为联合体,专用于表示64位无符号大长整形。
将FILETIME还原为64位无符号大长整形:将FILETIME高32位、低32位分别赋值给ULARGE_INTEGER高、低32位,然后ULARGE_INTEGER的QuadPart即结果。
程序实现
ULONGLONG CompareFileTime(const FILETIME &ft1, const FILETIME &ft2)
{
ULARGE_INTEGER ul1;
ul1.HighPart = ft1.dwHighDateTime;
ul1.LowPart = ft1.dwLowDateTime;
ULARGE_INTEGER ul2;
ul2.HighPart = ft2.dwHighDateTime;
ul2.LowPart = ft2.dwLowDateTime;
return ul2.QuadPart - ul1.QuadPart;
}
int GetSystemCpu(){
FILETIME ftPreIdle, ftPreUser, ftPreKernel;
FILETIME ftIdle, ftUser, ftKernel;
if(!GetSystemTimes(&ftPreIdle, &ftPreKernel, &ftPreUser))
{
std::cout<<"First GetSystemTimes Error"<<std::endl;
return;
}
Sleep(n);
if(!GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
std::cout<<"Second GetSystemTimes Error"<<std::endl;
return;
}
ULONGLONG ullIdle = CompareFileTime(ftPreIdle, ftIdle);
ULONGLONG ullKernel = CompareFileTime(ftPreKernel, ftKernel);
ULONGLONG ullUser = CompareFileTime(ftPreUser, ftUser);
double dCpu1 = (ullKernel+ullUser-ullIdle)*100.0 / (ullKernel+ullUser);
double dCpu2 = (ullKernel+ullUser-ullIdle)*100.0 / (n*1000*10*iCpuNum);
return static_cast<int>(dCpu1+0.5);
}
2. 进程CPU利用率
如果说系统CPU利用率是一段时间内所有进程运行时间占总时间的比值,则进程CPU利用率即为一段时间内该进程运行时间占总时间的比值,故:
进程CPU利用率 = 进程运行时间 / 总时间
辅助函数
1.函数GetProcessTimes
原型:BOOL GetProcessTimes(
HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime)
返回值:成功返回0,否则非0
功能:获取进程创建时间、退出时间、内核时间、用户时间。
A.创建时间和退出时间是UNIX时间戳。
B.若进程尚未退出,lpExitTime值不确定。
C.lpKernelTime和lpUserTime要考虑多处理器情况。
D.即便不需要创建时间和退出时间也必须保证传入的lpCreationTime和lpExitTime有意义。
程序实现
HANDLE GetProcessHandle(const std::string &sProcessName)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL bMore = Process32First(hProcessSnap, &pe32);
while(bMore)
{
if(!sProcessName.compare(pe32.szExeFile))
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
return hProcess;
}
bMore=::Process32Next(hProcessSnap,&pe32);
}
std::cout<<"Not Found The Process Of Server:"<<sProcessName<<std::endl;
return INVALID_HANDLE_VALUE;
}
int GetProcessCpu(const std::string &sProcessName)
{
HANDLE hProcess = GetProcessHandle(sProcessName);
if(INVALID_HANDLE_VALUE == hProcess)
{
std::cout<<"Get Process Handle Fail"<<std::endl;
return -1;
}
SYSTEM_INFO si;
GetSystemInfo(&si);
int iCpuNum = si.dwNumberOfProcessors;
FILETIME ftPreKernelTime, ftPreUserTime;
FILETIME ftKernelTime, ftUserTime;
FILETIME ftCreationTime, ftExitTime;
if(!GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftPreKernelTime, &ftPreUserTime))
{
std::cout<<"First GetProcessTimes Error:"<< GetLastError()<<std::endl;
return -1;
}
Sleep(INTERVAL);
if(!GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime))
{
std::cout<<"GetProcessTimes Error:"<< GetLastError()<<std::endl;
return -1;
}
ULONGLONG ullKernelTime = CompareFileTime(ftPreKernelTime, ftKernelTime);
ULONGLONG ullUserTime = CompareFileTime(ftPreUserTime, ftUserTime);
double dCpu = (ullKernelTime+ullUserTime)*100.0 / (cpuNum*INTERVAL*10000);
return static_cast<int>(dCpu + 0.5);
}
相关文章推荐
- 查询系统和进程状态信息
- 查询系统和进程状态信息
- linux系统进程状态查询命令--ps
- 获取系统信息 、内存状态, 查询内存分配
- linux操作系统知识分享(进程简介,SSH使用原理图,配置环境变量,系统基本信息查询,系统管理,war包部署相关命令)
- windows系统信息,内存状态,区域信息的查询
- Linux 进程管理、系统状态查询
- 获取Windows系统的进程运行信息
- 了解系统进程和xp的信息
- LINUX常用的系统状态查询命令
- WinAPI: GetSystemPowerStatus - 获取系统电源状态的信息
- 关于CRM系统中员工,招商经理,招商专员等和代理商对于进销存系统信息查询的限制设计
- 公交信息查询系统
- 获取Windows系统的进程运行信息
- 查询linux系统信息命令
- 如何在程序中获取系统ASP使用率等系统状态信息
- linux使用top命令察看系统进程信息
- sql系统管理及系统信息查询
- AIX常用的系统状态查询命令
- C#小技巧系列之三:获取系统进程信息