【cpu_loading】/proc/stat统计cpu的使用率

参考:http://www.blogjava.net/fjzag/articles/317773.html

基于目前正在开发的手机

proc伪文件系统

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

/proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。此外,Linux 2.6.0-test6以上的版本/proc/pid目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。

proc/stat

该文件中的所有值都是系统启动至今的数据,不同内核版本时间单位可能不同

cat stat
cpu  69904 21104 138494 23477594 1232 0 317 0 0 0
cpu0 28792 2066 56307 2858036 131 0 125 0 0 0
cpu1 27146 1804 51688 2860147 84 0 15 0 0 0
cpu2 5561 1066 10786 2943586 87 0 105 0 0 0
cpu3 4716 642 7122 2951398 35 0 6 0 0 0
cpu4 2109 9525 8942 2952628 626 0 40 0 0 0
cpu5 916 2241 2465 2968654 145 0 10 0 0 0
cpu6 361 1950 682 2971229 62 0 8 0 0 0
cpu7 300 1808 501 2971912 60 0 6 0 0 0
intr 10805705 0 3500279 5996187 0 0 1 18 54 973 26755 0 0 115777 0 5 31482 0 0 0 0 77498 0 22550 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4610 0 0 0 0 0 0 0 0 0 0 0 0 27384 0 0 2965 2947 0 17 1 0 0 1 0 1 27
 0 0 0 6 10 249 0 0 0 0 0 0 0
ctxt 7732037
btime 1325375998
processes 28877
procs_running 1
procs_blocked 0
softirq 5725677 1 2134789 0 0 0 0 74120 1979642 0 1537125

cpu  69904 21104 138494 23477594 1232 0 317 0 0 0

是CPU总的使用情况:

进程的nice,进程的nice值一般是-20~19,他影响的是cpu分配给进程的时间片

对nice值一个形象比喻,假设在一个CPU轮转中,有2个runnable的进程A和B,如果他们的nice值都为0,假设内核会给他们每人分配1k个cpu时间片。但是假设进程A的为0,但是B的值为-10,那么此时CPU可能分别给A和B分配1k和1.5k的时间片。故可以形象的理解为,nice的值影响了内核分配给进程的cpu时间片的多少,时间片越多的进程,其优先级越高

参数:                            解析

(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms10ms之间)类似time_in_stat里面的时间取的是10ms

user:69904                                处于用户态的运行时间,不包含nice值为负的进程

nice:21104                                nice值为负的进程所占用的CPU时间

system:138494                        核心态(内核态)的运行时间

idle:23477594                           除I/O等待时间以外的其他等待时间

iowait:1232                                IO等待时间(since 2.5.41之后加入)

irq:0                                              硬中断时间

softirq:317                                       软中断的时间

stealstolen:0                                which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)

guest:0                                              which is the time spent running a virtual  CPU  for  guest operating systems under the control of the Linux kernel(since 2.6.24)

   至于这个结论,我不是很赞同啊

总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen  +  guest

下面是根据上面的内容计算出的cpu的使用率

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>

#include "cpu_loading.h"

static si get_argv(char *time_char)
{
	char *ch = time_char;
	si ret = 0;
	
	if( *ch == '0'){
		fprintf(stderr, "interval should not be zero\n");
		return INVALID_ARGV;
	}

	for(ch=time_char; *ch; ch++){
		if( *ch == '-' || !(*ch >= '0' || *ch <= '9')){
			fprintf(stderr, "please input the correct argv time(no negative)\n");
			return INVALID_ARGV;
		}
		ret = ret*10+(*ch-'0');
	}
	return ret;
}

static s8 get_init_freq_count(const char *cpu_cur_path, u8 *size, ui *cpu_available_freq)
{
	FILE	*fp = NULL;
	fp = fopen(cpu_cur_path, "r");
	u8 i = 0;
	if(fp==NULL){
		fprintf(stderr, "failed opend file:", cpu_cur_path);
		return INVALID_ARGV;
	}
	// even freq   
	// odd count
	for(i=0; i<MAX_AVALLABLE_FREQ; i=i+2){
		cpu_available_freq[i+1] = 0;
		if(fscanf(fp,"%d", cpu_available_freq+i)!=1)
			break;
	}
	*size = i;
	fclose(fp);
	return 0;
}

static void debug_cpufreq_count(u8 cpu0_size,  ui *cpu0_available_freq, 
u8 cpu4_size, ui *cpu4_available_freq)
{
	u8 i = 0;
	for(i=0;i<cpu0_size; i=i+2){
		printf("%d\t%d\n", cpu0_available_freq[i], cpu0_available_freq[i+1]);
	}
	printf("\n");
	
	for(i=0;i<cpu4_size; i=i+2){
		printf("%d\t%d\n", cpu4_available_freq[i], cpu4_available_freq[i+1]);
	}
}


static s8 calculate_freq_percent(const u8 cpu_size,  ui *cpu_available_freq, ui total_count, char *file_path)
{
	u8 i = 0;
	FILE *fp = NULL;
	fp = fopen(file_path, "r");
	ui cur_cpu = 0;
	if(fp==NULL){
		fprintf(stderr, "", file_path);
		return FAILED_OPEN_FILE;
	}
	while(fscanf(fp,"%d", &cur_cpu)==1){
		for(i=0;i<cpu_size; i=i+2){
			if(cur_cpu==cpu_available_freq[i]){
				cpu_available_freq[i+1]++;
				break;
			}
			
		}
	}
	
	fclose(fp);
	return 0;
}

static s8 statistic_cpu_stat(const char *stat_path, ui count)
{
	FILE *fp = NULL;
	FILE *fp_cpu = NULL;
	char cpu_stat[BUFFER_SIZE];
	char *result_stat;
	u8 i = 0;
	
	fp = fopen(stat_path, "r");
	if(fp==NULL){
		fprintf(stderr, "failed opend file:\n", stat_path);
		return INVALID_ARGV;
	}
	if(count%2==0){
		fp_cpu = fopen(START_STAT,"a");
	}else{
		fp_cpu = fopen(END_STAT,"a");
	}
	
	if(fp_cpu==NULL){
		fprintf(stderr, "failed opend file:\n");
		return INVALID_ARGV;
	}
	
	fgets(cpu_stat, BUFFER_SIZE, fp);
	while(fgets(cpu_stat, BUFFER_SIZE, fp)&&i<8){
		result_stat = cpu_stat+3;
		fprintf(fp_cpu, "%s", result_stat);
		i++;
	}
	fclose(fp);
	fclose(fp_cpu);
	return 0;
}

static s8 store_cpu_freq(ui cur_freq, char *file_path)
{
	FILE *fp = NULL;
	fp = fopen(file_path, "a");
	if(fp==NULL){
		fprintf(stderr, "failed opend file:\n", file_path);
		return FAILED_OPEN_FILE;
	}
	fprintf(fp, "%d\n", cur_freq);
	fclose(fp);
	return 0;
}

static ui get_store_cur_freq(const char *file_path, char *store_path)
{
	FILE	*fp = NULL;
	ui cur_cpu_freq = 0;
	fp = fopen(file_path, "r");
	if(fp==NULL){
		fprintf(stderr, "failed opend file:\n", file_path);
		return INVALID_ARGV;
	}
	fscanf(fp, "%d", &cur_cpu_freq);
	fclose(fp);
	store_cpu_freq(cur_cpu_freq, store_path);
	return 0;
}

static void clear_envirment()
{
	remove(LITTLE_CORE);
	remove(BIG_CORE);
	remove(START_STAT);
	remove(END_STAT);
}
static s8 data_simpling(si accummulate_time, si interval, ui total_count)
{	
	struct timeval start, end;
	float timeuse = 0.0;
	ui	 count = 0;
	u8 i = 0;
	gettimeofday(&start, NULL);
	while(count<total_count){
		get_store_cur_freq(CPU0_CUR_FREQ_PATH, LITTLE_CORE);
		get_store_cur_freq(CPU4_CUR_FREQ_PATH, BIG_CORE);
		statistic_cpu_stat(PROC_CPU_STAT, count);
		usleep(100000);
		count++;
	}
	gettimeofday(&end, NULL);
	timeuse = (1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec)/1000.0;
	printf("time_use is %.2f\n", timeuse);
	
}

static s8 compute_cpu_loading(char *start_file, char *end_file, float *pcpu_set)
{
	FILE *fp_start, *fp_end;
	ui start_buffer[BUFFER_SIZE], end_buffer[BUFFER_SIZE];
	memset(start_buffer, 0, BUFFER_SIZE);
	memset(end_buffer, 0, BUFFER_SIZE);
	u8 i = 0, cpu_id, j;
	const u8 cpu_consist = 11;
	uli  total_time = 0;
	ui   idle_time = 0, set = 0;
	float pcpu = 0.0;
	
	fp_start = fopen(start_file, "r");
	if(fp_start==NULL){
		fprintf(stderr, "failed opend file", start_file);
		return FAILED_OPEN_FILE;
	}
	fp_end = fopen(end_file, "r");
	if(fp_end==NULL){
		fprintf(stderr, "failed opend file", end_file);
		return FAILED_OPEN_FILE;
	}
	
	while(fscanf(fp_start, "%d", start_buffer+i)==1 &&
	fscanf(fp_end, "%d", end_buffer+i)==1
	){
		if(i==0){
			cpu_id = start_buffer[i];
		}
		ui minus = end_buffer[i]-start_buffer[i];
		total_time+=minus;
		if(i==4){
			idle_time = minus;
			//printf("%d\t%d\t%d\t%d\n", end_buffer[i], start_buffer[i], idle_time, total_time);
		}
		i++;
		if(i==cpu_consist){
			set++;
			pcpu = ((total_time-idle_time)*1.0/total_time);
			//printf("%d\t%f\n", cpu_id, pcpu);
			pcpu_set[cpu_id]+=pcpu;
			i=0;
			total_time = 0;
			memset(start_buffer, 0, BUFFER_SIZE);
		}
	}
	set/=8;
	for(i=0;i<=cpu_id; i++){
		pcpu_set[i] /=set;
		printf("cpu%d is %f\n", i, pcpu_set[i]);
	}
	
	fclose(fp_start);
	fclose(fp_end);
	return 0;
}

int main(int argc, char *argv[])
{
	si   interval , accummulate_time = 0;
	ui   cpu0_freq , cpu4_freq = 0;
	ui	 total_count = 0;
	u8 	 cpu0_size, cpu4_size, i , j ;
	ui 	 cpu0_available_freq[MAX_AVALLABLE_FREQ], cpu4_available_freq[MAX_AVALLABLE_FREQ];
	float pcpu_set[BUFFER_SIZE];

	// input argc less than 1
	if( argc < 1 ){
		fprintf(stderr, "you must input two argv");
		fprintf(stderr, "first: cal cpu loading tool \n");
		fprintf(stderr, "secn: interval time(default:100ms) \n");
		fprintf(stderr, "expl: ./data/cpu_loading 100\n");
		return INVALID_ARGV;
	}
	
	// input argc 1
	if(argc==1){
		interval = 100;
		accummulate_time = 60;
		
	// input argc 2
	}else if(argc==2){
		interval = get_argv(argv[1]);
		if(interval<0){
			return INVALID_ARGV;
		}
		accummulate_time = 60;
	// input argc 3
	}else{
		interval = get_argv(argv[1]);
		if(interval<0){
			return INVALID_ARGV;
		}
		accummulate_time = get_argv(argv[2]);
		if(accummulate_time<0){
			return INVALID_ARGV;
		}
	}
	
	printf("interval is %d\n", interval);
	printf("accummulate_time is %d\n", accummulate_time);

	get_init_freq_count(CPU0_AVAILABLE_FREQ_PATH, &cpu0_size, cpu0_available_freq);
	get_init_freq_count(CPU4_AVAILABLE_FREQ_PATH, &cpu4_size, cpu4_available_freq);
	
	// debug
	//debug_cpufreq_count(cpu0_size, cpu0_available_freq ,cpu4_size, cpu4_available_freq);
	total_count = (accummulate_time*1000)/interval;
	clear_envirment();
	// data cimpling
	data_simpling(accummulate_time, interval, total_count);

	

	calculate_freq_percent(cpu0_size, cpu0_available_freq, total_count, LITTLE_CORE);
	calculate_freq_percent(cpu4_size, cpu4_available_freq, total_count, BIG_CORE);
	// debug
	debug_cpufreq_count(cpu0_size, cpu0_available_freq ,cpu4_size, cpu4_available_freq);
	
	// compute pcpux
	compute_cpu_loading(START_STAT, END_STAT, pcpu_set);
	
	// show result
	for(i=0; i<cpu0_size; i=i+2){
		if(i==0)
			printf("\t");
		printf("%d\t", cpu0_available_freq[i]);
		if(i==cpu0_size-2)
			printf("\n");
	}
	for(i=0; i<cpu0_size; i=i+2){
		if(i==0)
			printf("little\t");
		printf("%.3f%\t", cpu0_available_freq[i+1]*1.0/total_count*100);
		if(i==cpu0_size-2)
			printf("\n");
	}
	
	for(i=0;i<4;i++){
		printf("cpu%d\t", i);
		for(j=0;j<cpu0_size;j=j+2){
			printf("%.3f%\t", (cpu0_available_freq[j+1]*1.0/total_count)*100*pcpu_set[i]);
		}
		printf("\n");
	}
	
	printf("\n");
	for(i=0; i<cpu4_size; i=i+2){
		if(i==0)
			printf("\t");
		printf("%d\t", cpu4_available_freq[i]);
		if(i==cpu4_size-2)
			printf("\n");
	}
	for(i=0; i<cpu4_size; i=i+2){
		if(i==0)
			printf("big\t");
		printf("%.3f%\t", cpu4_available_freq[i+1]*1.0/total_count*100);
		if(i==cpu4_size-2)
			printf("\n");
	}
	for(i=4;i<8;i++){
		printf("cpu%d\t", i);
		for(j=0;j<cpu4_size;j=j+2){
			printf("%.3f%\t", (cpu4_available_freq[j+1]*1.0/total_count)*100*pcpu_set[i]);
		}
		printf("\n");
	}
	
	return 0;
}

其中头文件的定义如下:

#define INVALID_ARGV		-1
#define FAILED_OPEN_FILE	-2
#define MAX_AVALLABLE_FREQ	40
#define BUFFER_SIZE			512

#define CPU0_CUR_FREQ_PATH			"/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
#define CPU4_CUR_FREQ_PATH			"/sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freq"
#define CPU0_AVAILABLE_FREQ_PATH	"/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"
#define CPU4_AVAILABLE_FREQ_PATH	"/sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies"
#define PROC_CPU_STAT				"/proc/stat"
#define LITTLE_CORE					"/sdcard/little_core"
#define BIG_CORE					"/sdcard/big_core"
#define START_STAT					"/sdcard/stat_start.txt"
#define END_STAT					"/sdcard/stat_end.txt"

typedef signed 		int    si;
typedef signed		char   s8;
typedef unsigned    char   u8;
typedef unsigned	int    ui;
typedef unsigned long int  uli;

运行结果如下:


从另一个维度计算cpu_loading,简称

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>

#include "cpu_loading.h"

static void debug_cpufreq_count(u8 cpu0_size,  ui *cpu0_available_freq, 
u8 cpu4_size, ui *cpu4_available_freq, ui total_count)
{
	u8 i = 0;
	for(i=0;i<cpu0_size; i=i+2){
		printf("%d\t%.2f%\n", cpu0_available_freq[i], cpu0_available_freq[i+1]*1.0/total_count*100);
	}
	printf("\n");
	
	for(i=0;i<cpu4_size; i=i+2){
		printf("%d\t%.2f%\n", cpu4_available_freq[i], cpu4_available_freq[i+1]*1.0/total_count*100);
	}
}


static si get_argv(char *time_char)
{
	char *ch = time_char;
	si ret = 0;
	
	if( *ch == '0'){
		fprintf(stderr, "interval should not be zero\n");
		return INVALID_ARGV;
	}

	for(ch=time_char; *ch; ch++){
		if( *ch == '-' || !(*ch >= '0' || *ch <= '9')){
			fprintf(stderr, "please input the correct argv time(no negative)\n");
			return INVALID_ARGV;
		}
		ret = ret*10+(*ch-'0');
	}
	return ret;
}

static s8 get_init_freq_count(const char *cpu_cur_path, u8 *size, ui *cpu_available_freq)
{
	FILE	*fp = NULL;
	fp = fopen(cpu_cur_path, "r");
	u8 i = 0;
	if(fp==NULL){
		fprintf(stderr, "failed opend file:", cpu_cur_path);
		return INVALID_ARGV;
	}
	// even freq   
	// odd count
	for(i=0; i<MAX_AVALLABLE_FREQ; i=i+2){
		cpu_available_freq[i+1] = 0;
		if(fscanf(fp,"%d", cpu_available_freq+i)!=1)
			break;
	}
	*size = i;
	fclose(fp);
	return 0;
}

static void clear_envirment()
{
	remove(LITTLE_CORE);
	remove(BIG_CORE);
	remove(START_STAT);
	remove(END_STAT);
	remove(PCPU_PATH);
}

static s8 statistic_cpu_stat(const char *stat_path, ui count)
{
	FILE *fp = NULL;
	FILE *fp_cpu = NULL;
	char cpu_stat[BUFFER_SIZE];
	char *result_stat;
	u8 i = 0;
	
	fp = fopen(stat_path, "r");
	if(fp==NULL){
		fprintf(stderr, "failed opend file:\n", stat_path);
		return INVALID_ARGV;
	}
	if(count%2==0){
		fp_cpu = fopen(START_STAT,"a");
	}else{
		fp_cpu = fopen(END_STAT,"a");
	}
	
	if(fp_cpu==NULL){
		fprintf(stderr, "failed opend file:\n");
		return INVALID_ARGV;
	}
	// aband sum pcpu 
	fgets(cpu_stat, BUFFER_SIZE, fp);
	
	while(fgets(cpu_stat, BUFFER_SIZE, fp)&&i<8){
		result_stat = cpu_stat+3;
		fprintf(fp_cpu, "%s", result_stat);
		i++;
	}
	fclose(fp);
	fclose(fp_cpu);
	return 0;
}

static s8 store_cpu_freq(ui cur_freq, char *file_path)
{
	FILE *fp = NULL;
	fp = fopen(file_path, "a");
	if(fp==NULL){
		fprintf(stderr, "failed opend file:\n", file_path);
		return FAILED_OPEN_FILE;
	}
	fprintf(fp, "%d\n", cur_freq);
	fclose(fp);
	return 0;
}

static ui get_store_cur_freq(const char *file_path, char *store_path)
{
	FILE	*fp = NULL;
	ui cur_cpu_freq = 0;
	fp = fopen(file_path, "r");
	if(fp==NULL){
		fprintf(stderr, "failed opend file:\n", file_path);
		return INVALID_ARGV;
	}
	fscanf(fp, "%d", &cur_cpu_freq);
	fclose(fp);
	store_cpu_freq(cur_cpu_freq, store_path);
	return 0;
}


static s8 data_simpling(si accummulate_time, si interval, ui total_count)
{	
	struct timeval start, end;
	float timeuse = 0.0;
	ui	 count = 0;
	u8 i = 0;
	gettimeofday(&start, NULL);
	while(count<total_count){
		get_store_cur_freq(CPU0_CUR_FREQ_PATH, LITTLE_CORE);
		get_store_cur_freq(CPU4_CUR_FREQ_PATH, BIG_CORE);
		statistic_cpu_stat(PROC_CPU_STAT, count);
		usleep(interval*1000);
		count++;
	}
	gettimeofday(&end, NULL);
	timeuse = (1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec)/1000.0;
	printf("time_use is %.2f\n", timeuse);
	
}

static s8 store_pcpu(u8 cpu_id,  float pcpu)
{
	FILE *fp = NULL;
	fp = fopen(PCPU_PATH, "a");
	if(fp==NULL){
		fprintf(stderr, "failed opend file:\n", PCPU_PATH);
		return FAILED_OPEN_FILE;
	}
	fprintf(fp, "%f\n",  pcpu);
	fclose(fp);
	return 0;
}

static si compute_cpu_loading_freq(char *start_file, char *end_file, float *pcpu_set)
{
	FILE *fp_start, *fp_end;
	ui start_buffer[BUFFER_SIZE], end_buffer[BUFFER_SIZE];
	memset(start_buffer, 0, BUFFER_SIZE);
	memset(end_buffer, 0, BUFFER_SIZE);
	u8 i = 0, cpu_id, j;
	const u8 cpu_consist = 11;
	uli  total_time = 0;
	ui   idle_time = 0, set = 0;
	float pcpu = 0.0;
	
	fp_start = fopen(start_file, "r");
	if(fp_start==NULL){
		fprintf(stderr, "failed opend file", start_file);
		return FAILED_OPEN_FILE;
	}
	fp_end = fopen(end_file, "r");
	if(fp_end==NULL){
		fprintf(stderr, "failed opend file", end_file);
		return FAILED_OPEN_FILE;
	}
	
	while(fscanf(fp_start, "%d", start_buffer+i)==1 &&
	fscanf(fp_end, "%d", end_buffer+i)==1){
		if(i==0){
			cpu_id = start_buffer[i];
		}
		ui minus = end_buffer[i]-start_buffer[i];
		total_time+=minus;
		if(i==4){
			idle_time = minus;
			//printf("%d\t%d\t%d\t%d\n", end_buffer[i], start_buffer[i], idle_time, total_time);
		}
		i++;
		if(i==cpu_consist){
			set++;
			pcpu = ((total_time-idle_time)*1.0/total_time);
			store_pcpu(cpu_id, pcpu);
			pcpu_set[cpu_id]+=pcpu;
			i=0;
			total_time = 0;
			memset(start_buffer, 0, BUFFER_SIZE);
		}
	}
	set/=8;
	
	fclose(fp_start);
	fclose(fp_end);
	return set;
}

static s8 calculate_freq_percent(const u8 cpu0_size,  ui *cpu0_available_freq, 
ui total_count, const u8 cpu4_size,  ui *cpu4_available_freq, si set_group)
{
	u8 i = 0, k;
	ui j = 0;
	FILE *fp_cpu0 = NULL;
	FILE *fp_cpu4 = NULL;
	FILE *fp_stat = NULL;
	ui cpu0_cur_cpu, cpu4_cur_cpu;
	float pcpu[BUFFER_SIZE];
	float pcpu_per[MAX_AVALLABLE_FREQ][BUFFER_SIZE*10];
	ui   pcpu_per_count[MAX_AVALLABLE_FREQ][BUFFER_SIZE*10];
	fp_cpu0 = fopen(LITTLE_CORE, "r");
	if(fp_cpu0==NULL){
		fprintf(stderr, "", LITTLE_CORE);
		return FAILED_OPEN_FILE;
	}
	fp_cpu4 =fopen(BIG_CORE, "r");
	if(fp_cpu4==NULL){
		fprintf(stderr, "", BIG_CORE);
		return FAILED_OPEN_FILE;
	}
	fp_stat = fopen(PCPU_PATH, "r");
	if(fp_stat==NULL){
		fprintf(stderr, "", PCPU_PATH);
		return FAILED_OPEN_FILE;
	}
	while(fscanf(fp_cpu0,"%d", &cpu0_cur_cpu)==1&&
	fscanf(fp_cpu4,"%d", &cpu4_cur_cpu)==1){
		for(i=0;i<cpu0_size; i=i+2){
			if(cpu0_cur_cpu==cpu0_available_freq[i]){
				cpu0_available_freq[i+1]++;
				break;
			}
		}	
		for(i=0;i<cpu4_size; i=i+2){
			if(cpu4_cur_cpu==cpu4_available_freq[i]){
				cpu4_available_freq[i+1]++;
				break;
			}
		}
		
		if(j%2==1){
			i=0;
			while(fscanf(fp_stat, "%f", pcpu+i)==1){
				pcpu_per[i][cpu0_cur_cpu/1000]+=pcpu[i];
				pcpu_per_count[i][cpu0_cur_cpu/1000]++;
				//printf("%d\t%d\t%f\t%d\n", i, cpu0_cur_cpu, pcpu[i], pcpu_per_count[i][cpu0_cur_cpu/1000]);
				i++;
				if(i>3){
					break;
				}
			}
			while(fscanf(fp_stat, "%f", pcpu+i)==1){
				pcpu_per[i][cpu4_cur_cpu/1000]+=pcpu[i];
				pcpu_per_count[i][cpu4_cur_cpu/1000]++;
				//printf("%d\t%d\t%.2f\t%d\n", i, cpu4_cur_cpu, pcpu[i],pcpu_per_count[i][cpu4_cur_cpu/1000]);
				i++;
				if(i>7){
					break;
				}
			}
		}
		j++;
		
	}
	fclose(fp_cpu0);
	fclose(fp_stat);


	for(j=0;j<cpu0_size;j=j+2){
		if(j==0)
			printf("   \t");
		printf("%d\t", cpu0_available_freq[j]);
		if(j==cpu0_size-2)
			printf("\n");
	}

	for(i=0;i<4;i++){
		printf("%d\t", i);
		for(j=0;j<cpu0_size;j=j+2){
			if(pcpu_per_count[i][cpu0_available_freq[j]/1000]!=0){
				printf("%.2f%\t", pcpu_per[i][cpu0_available_freq[j]/1000]/(pcpu_per_count[i][cpu0_available_freq[j]/1000])*100);
			}else{
				printf("0.00%\t");
			}	
		}
		printf("\n");
	}
	printf("\n");
	for(j=0;j<cpu4_size;j=j+2){
		if(j==0)
			printf("   \t");
		printf("%d\t", cpu4_available_freq[j]);
		if(j==cpu4_size-2)
			printf("\n");
	}
	for(i=4;i<8;i++){
		printf("%d\t", i);
		for(j=0;j<cpu4_size;j=j+2){
			if(pcpu_per_count[i][cpu4_available_freq[j]/1000]!=0){
				printf("%.2f%\t", pcpu_per[i][cpu4_available_freq[j]/1000]/(pcpu_per_count[i][cpu4_available_freq[j]/1000])*100);
			}else{
				printf("0.00%\t");
			}	
		}
		printf("\n");
	}
	return 0;
}

int main(int argc, char *argv[])
{
	si   interval , accummulate_time = 0, set_group;
	ui   cpu0_freq , cpu4_freq = 0;
	ui	 total_count = 0;
	u8 	 cpu0_size, cpu4_size, i , j ;
	ui 	 cpu0_available_freq[MAX_AVALLABLE_FREQ], cpu4_available_freq[MAX_AVALLABLE_FREQ];
	float pcpu_set[BUFFER_SIZE];

	// input argc less than 1
	if( argc < 1 ){
		fprintf(stderr, "you must input two argv");
		fprintf(stderr, "first: cal cpu loading tool \n");
		fprintf(stderr, "secn: interval time(default:100ms) \n");
		fprintf(stderr, "expl: ./data/cpu_loading 100\n");
		return INVALID_ARGV;
	}
	
	// input argc 1
	if(argc==1){
		interval = 100;
		accummulate_time = 60;
		
	// input argc 2
	}else if(argc==2){
		interval = get_argv(argv[1]);
		if(interval<0){
			return INVALID_ARGV;
		}
		accummulate_time = 60;
	// input argc 3
	}else{
		interval = get_argv(argv[1]);
		if(interval<0){
			return INVALID_ARGV;
		}
		accummulate_time = get_argv(argv[2]);
		if(accummulate_time<0){
			return INVALID_ARGV;
		}
	}
	
	printf("interval is %d\n", interval);
	printf("accummulate_time is %d\n", accummulate_time);

	get_init_freq_count(CPU0_AVAILABLE_FREQ_PATH, &cpu0_size, cpu0_available_freq);
	get_init_freq_count(CPU4_AVAILABLE_FREQ_PATH, &cpu4_size, cpu4_available_freq);
	
	// debug
	//debug_cpufreq_count(cpu0_size, cpu0_available_freq ,cpu4_size, cpu4_available_freq);
	total_count = (accummulate_time*1000)/interval;
	clear_envirment();
	// data cimpling
	data_simpling(accummulate_time, interval, total_count);
	
	set_group = compute_cpu_loading_freq(START_STAT, END_STAT, pcpu_set);
	calculate_freq_percent(cpu0_size, cpu0_available_freq, total_count, cpu4_size,cpu4_available_freq, set_group);

	return 0;
}
#define INVALID_ARGV		-1
#define FAILED_OPEN_FILE	-2
#define MAX_AVALLABLE_FREQ	40
#define BUFFER_SIZE			512

#define CPU0_CUR_FREQ_PATH			"/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
#define CPU4_CUR_FREQ_PATH			"/sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freq"
#define CPU0_AVAILABLE_FREQ_PATH	"/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"
#define CPU4_AVAILABLE_FREQ_PATH	"/sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies"
#define PROC_CPU_STAT				"/proc/stat"
#define LITTLE_CORE					"/sdcard/little_core"
#define BIG_CORE					"/sdcard/big_core"
#define START_STAT					"/sdcard/stat_start.txt"
#define END_STAT					"/sdcard/stat_end.txt"
#define PCPU_PATH					"/sdcard/stat_result.txt"

typedef signed 		int    si;
typedef signed		char   s8;
typedef unsigned    char   u8;
typedef unsigned	int    ui;
typedef unsigned long int  uli;

计算结果如下:

interval is 100
accummulate_time is 20
time_use is 20596.07
        768000  884000  1000000 1100000 1200000
0       41.64%  45.50%  45.19%  54.13%  52.41%
1       28.25%  28.78%  28.97%  24.77%  42.26%
2       23.41%  24.57%  16.36%  27.08%  46.81%
3       22.34%  15.81%  29.40%  20.00%  20.95%


        768000  1050000 1225000 1400000 1500000 1570000
4       1.07%   5.82%   26.26%  10.00%  20.00%  40.00%
5       0.03%   4.00%   0.00%   0.00%   0.00%   0.00%
6       0.03%   0.00%   0.00%   0.00%   0.00%   0.00%
7       0.00%   0.00%   0.00%   0.00%   0.00%   0.00%


io从

猜你喜欢

转载自blog.csdn.net/feifei_csdn/article/details/80424198
今日推荐