linux获取当前进程的CPU使用率

来源:互联网 发布:国外必备软件 编辑:程序博客网 时间:2024/06/02 09:54

网上win下有好多例子,但是linux下的几乎没有。

查看了下win下获取的原理,就是一段时间里,系统态运行时间加上用户态运行时间,除以这段时间,就所CPU使用率。

仿照写了以下代码

先所获取当前时间的函数,用于计算时间流逝,精确到纳秒。

int64_tget_ticket(){struct timespec ts;int64_tustime = 0;clock_gettime(CLOCK_MONOTONIC, &ts);return ts.tv_sec*1.0e9+ts.tv_nsec;}

然后获取程序总的运行时间,可以使用getrusage()函数,返回的struct rusage结构体里面有两个time_val结构记录程序在用户和系统态运行的时间。

boolget_time_info(int64_t& systime, int64_t& nowtime){struct rusage rus;if (getrusage(RUSAGE_SELF, &rus) == 0){int64_t use_time = rus.ru_utime.tv_sec*1.0e9 + rus.ru_utime.tv_usec*1.0e3; // 用户态所用时间int64_t sys_time = rus.ru_stime.tv_sec*1.0e9 + rus.ru_stime.tv_usec*1.0e3; // 系统态所用时间systime = use_time + sys_time;  // 记录当前总时间nowtime = get_ticket();// 记录当前时间return true;}return false;}

最后一个函数则是根据2次时间差计算CPU使用率

doubleget_cpu_usage_linux(){static int cpu_count = sysconf(_SC_NPROCESSORS_CONF); // cpu core numberdouble cpu = 0;int64_t systime=0, nowtime=0;if (get_time_info(systime, nowtime)) // 记录上一次运行的状态{sleep(1);// 间隔一秒int64_t systime2=0, nowtime2=0;if (get_time_info(systime2, nowtime2)) // 获得现在的状态{cpu = ((double)(systime2-systime)/(double)(nowtime2-nowtime))*(100/cpu_count); // 计算出cpu使用率return cpu;}}}

测试测试下效果:

void* thread(void*) // 死循环占满一个cpu{int64_t i = 0;while(1)i = get_ticket()*get_ticket();return 0;}int main(){pthread_t id;pthread_create(&id, 0, thread, 0);while (1)printf("cpu usage: %u%%\r\n", (int)get_cpu_usage_linux());return 0;}

输出结果:

root@ubuntu:/home/zcw# ./a.out
cpu usage: 49%
cpu usage: 49%
cpu usage: 49%