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

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

仿照写了以下代码

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

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

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

bool	get_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使用率

double	get_cpu_usage_linux()
{
	static int cpu_count = sysconf(_SC_NPROCESSORS_CONF); // cpu core number
	
	double 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%


Logo

更多推荐