Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151546
  • 博文数量: 38
  • 博客积分: 1718
  • 博客等级: 上尉
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-13 14:47
文章分类

全部博文(38)

文章存档

2012年(1)

2011年(11)

2010年(8)

2009年(18)

我的朋友

分类: WINDOWS

2011-07-10 16:32:13

1. 定义

   本文CPU利用率定义为;用户进程时间 / (用户进程时间 + 内核时间)。

2.相关库函数介绍
   (1)GetSystemTimes
        函数声明为:
        

  1. BOOL WINAPI GetSystemTimes(
  2.   __out_opt LPFILETIME lpIdleTime,
  3.   __out_opt LPFILETIME lpKernelTime,
  4.   __out_opt LPFILETIME lpUserTime
  5. );
本函数返回系统时序信息,在多核处理器环境下,返回值为所有核心的求和。

本函数返回3个时间信息,分别是空闲时间、内核时间、用户进程时间。windows系统处于空闲时会运行SystemIdle进程,该进程运行在内核态,因此空闲时间位于内核时间内。

3.相关数据结构介绍

FILETIME

本数据结构定位如下:
  1. typedef struct _FILETIME {
  2.   DWORD dwLowDateTime;
  3.   DWORD dwHighDateTime;
  4. } FILETIME, *PFILETIME;
FILETIME数据结构为一个64位数据,它表示从1601年1月1日起,距离现在100纳米时间单位的数量。

4.简单样例
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <string>

  4. using std::cout;
  5. using std::endl;
  6. using std::cin;

  7. int main(){
  8.     
  9.     std::string input;
  10.     DWORD interval = 1000*1000*10; // sampling interval is 1000ms
  11.     typedef unsigned long long uint64;
  12.     uint64 valKernel;
  13.     uint64 valUser;
  14.     uint64 valAll;
  15.     
  16.     SYSTEM_INFO sysInfo;
  17.     GetSystemInfo(&sysInfo);



  18.     DWORD NumCPU = sysInfo.dwNumberOfProcessors;

  19.     cout << "CPU Number is :" << NumCPU << endl;

  20.     FILETIME kernelTime;
  21.     FILETIME userTime;
  22.     FILETIME idleTime;

  23.     cout << "sizeof(uint64) = " << sizeof(uint64) << endl;

  24.     BOOL ret = GetSystemTimes( &idleTime, &kernelTime, &userTime);
  25.     if( !ret ){
  26.         cout << "Fail to call GetSystemTimes." << endl;
  27.         return 1;
  28.     }

  29.     uint64 start = userTime.dwHighDateTime;
  30.     start = start << 32;
  31.     start += userTime.dwLowDateTime;

  32.     uint64 startKernel = kernelTime.dwHighDateTime;
  33.     startKernel <<= 32;
  34.     startKernel += kernelTime.dwLowDateTime;

  35.     while(1){

  36.         ::Sleep(1000);
  37.         BOOL ret = GetSystemTimes( &idleTime, &kernelTime, &userTime);
  38.         if( !ret ){
  39.             cout << "Fail to call GetSystemTimes." << endl;
  40.             continue;
  41.         }
  42.         valUser = userTime.dwHighDateTime;
  43.         valUser <<= 32;
  44.         valUser += userTime.dwLowDateTime;

  45.         valKernel = kernelTime.dwHighDateTime;
  46.         valKernel <<= 32;
  47.         valKernel += kernelTime.dwLowDateTime;

  48.         valAll = (valUser-start) + valKernel-startKernel;

  49.         WORD used = 100*(valUser-start)/valAll;

  50.         cout << "CPU per : " << used << endl;
  51.         start = valUser;
  52.         startKernel = valKernel;

  53.     }

  54.     return 0;
  55. }




 

阅读(2717) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~